Запросы, динамические списки и отчеты на СКД: требования по локализации
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. В некоторых случаях строковые литералы из текстов запросов также могут оказаться частью пользовательского интерфейса. В таких случаях строковые литералы необходимо выносить из текста запроса в параметры.
ЗапросПоВерсиям = Новый Запрос(" |ВЫБРАТЬ |Версии.Ссылка, |ВЫБОР КОГДА Версии.Выпущена = ИСТИНА | ТОГДА ""выпущена"" | ИНАЧЕ ""в разработке"" |КОНЕЦ КАК ТекстПояснения | ИЗ | Справочник.Версии КАК Версии");
ТекстЗапроса = "ВЫБРАТЬ |Версии.Ссылка, |ВЫБОР КОГДА Версии.Выпущена = ИСТИНА | ТОГДА &ТекстВыпущеннойВерсии | ИНАЧЕ &ТекстНеВыпущеннойВерсии |КОНЕЦ КАК ТекстПояснения | ИЗ | Справочник.Версии КАК Версии"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстВыпущеннойВерсии", НСтр("ru='выпущена'")); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстНеВыпущеннойВерсии", НСтр("ru='в разработке'"));
ЗапросПоВерсиям = Новый Запрос(" |ВЫБРАТЬ |Версии.Ссылка, |ВЫБОР КОГДА Версии.Выпущена = ИСТИНА | ТОГДА &ТекстВыпущеннойВерсии | ИНАЧЕ &ТекстНеВыпущеннойВерсии |КОНЕЦ КАК ТекстПояснения | ИЗ | Справочник.Версии КАК Версии"); ЗапросПоВерсиям.УстановитьПараметр("ТекстВыпущеннойВерсии", НСтр("ru='выпущена'")); ЗапросПоВерсиям.УстановитьПараметр("ТекстНеВыпущеннойВерсии", НСтр("ru='в разработке'"));
2. Аналогичные требования предъявляются к выражениям СКД и запросам, которые используются в наборах данных СКД и содержат строковые литералы, выводимые в пользовательском интерфейсе. Например, если в выражении для параметров СКД встречаются строковые константы, требующие перевода, то следует:
а) в запросе указывать строковые константы, соответствующие «Правилам образования имен переменных» («»ЗавершитеСозданиеДокументов» КАК Рекомендация «), а в списке доступных значений поля указать локализуемый строковый литерал («Завершите создание документов»);
б) либо значение таких параметров с помощью функции НСтр устанавливать не в колонке Выражение, а в модуле отчета в обработчике события ПриКомпоновкеРезультата
ВЫБОР КОГДА ВидОперации = "Отгрузка клиентам" ТОГДА 1 КОГДА ВидОперации = "Возвраты товаров от клиентов" ТОГДА 2 КОГДА ВидОперации = "Приемка от поставщиков" ТОГДА 3 КОНЕЦ
ВЫБОР КОГДА ВидОперации = &ВидОперацииОтгрузкаКлиентам ТОГДА 1 КОГДА ВидОперации = &ВидОперацииВозвратыТоваровОтКлиентов ТОГДА 2 КОГДА ВидОперации = &ВидОперацииПриемкаОтПоставщиков ТОГДА 3 КОНЕЦ
в) В выражениях, используемых в настройках СКД, например Выражение представления и Выражение упорядочивания на закладке Наборы данных , а также в других им подобных, необходимо использовать функцию НСтр , аналогично тому, как это делается в коде модулей (см. стандарт Интерфейсные тексты в коде: требования по локализации).
Выбор Когда Объект = Раздел Тогда Выбор Когда Раздел = Значение(ПланВидовХарактеристик.РазделыДатЗапретаИзменения.ПустаяСсылка) Тогда "" Иначе "" Конец Иначе Объект Конец
Выбор Когда Объект = Раздел Тогда Выбор Когда Раздел = Значение(ПланВидовХарактеристик.РазделыДатЗапретаИзменения.ПустаяСсылка) Тогда НСтр("ru=''") Иначе НСтр("ru=''") Конец Иначе Объект Конец
3. Для колонок отчета на СКД для поля выборки, полученного вычислением с заданием ему псевдонима, необходимо задавать синоним при разработке. Нельзя опираться на автоматически сгенерированный заголовок по имени/псевдониму.


В отчётах, если не стоит галочка у поля выборки, полученного вычислением с заданием ему псевдонима, оно не попадает в результаты поиска редактирования текстов интерфейсов.
См. также
Когда тогда в запросе 1с
Может, кто-то увидит навскидку.
Почему может не отработать следующее условие в запросе.
Если &Контрагент= пустая ссылка, то запрос должен выдать все записи, иначе отбор по &Контрагент
ВЫБОР
КОГДА ЗаказПоставщикуТовары.Клиент ССЫЛКА Справочник.Контрагенты
И НЕ ЗаказПоставщикуТовары.Клиент = ЗНАЧЕНИЕ(Справочник.Контрагенты.пустаяссылка)
ТОГДА ЗаказПоставщикуТовары.Клиент = &Контрагент
ИНАЧЕ ИСТИНА
КОНЕЦ
скорее всего ЗаказПоставщикуТовары.Клиент может быть НЕОПРЕДЕЛЕНО или NILL
Попробуй вот так
ВЫБОР
КОГДА ВЫРАЗИТЬ(ЗаказПоставщикуТовары.Клиент как Справочник.Контрагенты) <> ЗНАЧЕНИЕ(Справочник.Контрагенты.пустаяссылка)
ТОГДА ЗаказПоставщикуТовары.Клиент = &Контрагент
ИНАЧЕ ИСТИНА
КОНЕЦ
Вы читаете таблицу и пытаетесь в нее же записать?
(2) Спасибо.
Что-то ни так ни так.
Возможно, дело не в условии.
(3) Это условие в запросе, не чтение полей таблиц
(0) кто на ком стоял?
проверять на заполненность нужно параметр &Контрагент или реквизит ЗаказПоставщикуТовары.Клиент?
у вас там клиенты в ТЧ живут? 🙂
(4) А, так я что-то туплю
Если я правильно понял, надо что-то такое:
ВЫБОР
КОГДА &Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.пустаяссылка)
ТОГДА ЗаказПоставщикуТовары.Клиент = &Контрагент
ИНАЧЕ ИСТИНА
КОНЕЦ
«ВЫБОР КОГДА … ТОГДА …» в запросе 1С 8.3
При работе с языком запросов 1С, иногда возникает ситуация, когда требуется проверить выражение, является ли оно ЛОЖЬ или Истина. В случае положительного результата присвоить ему значение выражения для замены.
Конструкция оператора ВЫБОР
Несколько примеров
Пример №1
Есть таблица «Таблица1», в которой перечислены все дни с понедельника по воскресенье.
| ДеньНедели |
| Понедельник |
| Вторник |
| Среда |
| Четверг |
| Пятница |
| Суббота |
| Воскресенье |
Необходимо, для строк со значениями «Суббота» и «Воскресенье» в отдельном поле указать, что это выходной. Во всех остальных случаях, рабочий день. Реализуем поставленную задачу в виде запроса к исходной таблице.
Текст запроса может выглядеть так:
ВЫБРАТЬ
ДеньНедели,
ВЫБОР
КОГДА ДеньНедели =»Суббота »
ИЛИ ДеньНедели = «Воскресенье »
ТОГДА «Выходной»
ИНАЧЕ «Рабочий день»
КОНЕЦ КАК ВидДня
ИЗ
Таблица1. ДеньНедели КАК ДеньНедели
Наша команда предоставляет услуги по консультированию, настройке и внедрению 1С.
Связаться с нами можно по телефону +7 499 350 29 00.
Услуги и цены можно увидеть по ссылке.
Будем рады помочь Вам!
| ДеньНедели | ВидДня |
| Понедельник | Рабочий день |
| Вторник | Рабочий день |
| Среда | Рабочий день |
| Четверг | Рабочий день |
| Пятница | Рабочий день |
| Суббота | Выходной |
| Воскресенье | Выходной |
В данном примере, используя оператор ВЫБОР, мы перебираем все строки из «Таблица1». Параллельно проверяя каждую на соответствие условию.
КОГДА ДеньНедели =»Суббота »
ИЛИ ДеньНедели = «Воскресенье «
Если сработает одно из них, то в колонку «ВидДня» произойдёт запись выражения замены, расположенного после ключевого слова ТОГДА. Во всех остальных случаях будет записано выражение расположенное после слова ИНАЧЕ. Причём если убрать секцию ИНАЧЕ, программа примет такую конструкцию и не выдаст ошибку. Однако если проверяемое выражение вернёт ЛОЖЬ, тогда строки, в которые должно было подставится выражение замены, получать значение NULL. Рассмотрим подробнее подобную ситуацию.
Пример №2
Возьмём уже известную нам таблицу из первого примера.
| ДеньНедели |
| Понедельник |
| Вторник |
| Среда |
| Четверг |
| Пятница |
| Суббота |
| Воскресенье |
Получите понятные самоучители по 1С бесплатно:
- Самоучитель по 1С Бухгалтерии 8.3;
- Самоучитель по 1С ЗУП 8.3.
Необходимо вывести в отдельную таблицу количество выходных дней. Причём информацию о количестве рабочих дней, будем считать излишней. Для наглядности решим задачу в несколько этапов. За основу возьмём запрос из примера №1. Уберём из него секцию ИНАЧЕ, а поле для вывода оставим только то, которое получаем конструкцией оператора ВЫБОР.
ВЫБРАТЬ
ВЫБОР
КОГДА ДеньНедели =»Суббота »
ИЛИ ДеньНедели = «Воскресенье »
ТОГДА «Выходной»
КОНЕЦ КАК ВидДня
ИЗ
Таблица1. ДеньНедели КАК ДеньНедели
| ВидДня |
| Выходной |
| Выходной |
Из результата запроса видно, что все строки, не вошедшие в условие после ключевого слова КОГДА получили . Как известно это отсутствие значения. Таким образом, нам остаётся только сгруппировать полученную таблицу. Применив к группировке агрегатную функцию КОЛИЧЕСТВО ( ).
Текст запроса может выглядеть так:
ВЫБРАТЬ
КОЛИЧЕСТВО(ВЫБОР
КОГДА ДеньНедели =»Суббота »
ИЛИ ДеньНедели = «Воскресенье »
ТОГДА «Выходной»
КОНЕЦ) КАК ВидДня
ИЗ
Таблица1. ДеньНедели КАК ДеньНедели
| КоличествоВыходныхДней |
| 2 |
В заключении хочется сказать, что оператор ВЫБОР хоть и не часто находит свое применение при написании запросов в 1С, но в некоторых ситуациях является незаменимым инструментом для разработчика.
- ЕСТЬNULL в запросе 1С 8.3 (8.2)
- Язык запросов 1С 8.3 и 8.2 — краткое руководство по всем конструкциям
- Создание внешнего отчета в 1С 8
- Остатки и обороты с регистраторами 1С
ВЫБОР, ТОГДА КОГДА в Запросе
При попытке написать условие в параметрах виртуальной таблицы ВЫБОР, ТОГДА, КОГДА пишет (6,7) ожидается выражение «)» , где то ковычку пропустил? просто я вроде все пересмотрел, вроде норм все.
По теме из базы знаний
- Модель запроса
- Запрос всей номенклатуры с характеристиками
- Смотрим запросы 1С через Microsoft SQL Profiler по следам ошибок разработчиков, приводящих к проблемам производительности
- Заметки по SQL 4: Преобразование в запросе строки в дату одним выражением
- Быстрый фронт в базе размером 6.8 терабайт – наши стандарты при разработке и рефакторинге запросов
- Дата
- Дата
- Рейтинг всех уровней
- Рейтинг 1-го уровня
- Древо развёрнутое
- Древо свернутое
Свернуть все
2. iskdv 14.06.17 05:48 Сейчас в теме
не надо так «КАК Номенклатура.ОсновнойПоставщик» — лучше «КАК ОсновнойПоставщик»
ivangrant; Vitaly1C8; vz1987; SyachinS; boln; + 5 – Ответить
3. pm74 194 14.06.17 07:39 Сейчас в теме
«выразить» обычно используется когда реквизит составного типа
4. j3qq4 14.06.17 08:02 Сейчас в теме
ВЫБОР КОГДА ПартииТоваровНаСкладахОстатки.ДокументОприходования ССЫЛКА Документ.ПоступлениеТоваровУслуг ТОГДА ПартииТоваровНаСкладахОстатки.ДокументОприходования.Контрагент КОГДА ПартииТоваровНаСкладахОстатки.ДокументОприходования ССЫЛКА Документ.ПоступлениеТоваровУслугВНТТ ТОГДА ПартииТоваровНаСкладахОстатки.ДокументОприходования.Контрагент ИНАЧЕ НЕОПРЕДЕЛЕНО КОНЕЦ КАК ОсновнойПоставщик
gybson; Vitaly1C8; Amadeuc404; + 3 – Ответить
5. ProGG3R 14.06.17 08:54 Сейчас в теме
Такс. эту проблему разрешил, смотрите суть в следующем, есть обработка (Скрин 1), я для нее написал запрос:
ВЫБРАТЬ ТоварыВНТТОстатки.Номенклатура.Артикул КАК Артикул, ТоварыВНТТОстатки.Номенклатура, ТоварыВНТТОстатки.ЦенаВРознице КАК РозничнаяЦена, ТоварыВНТТОстатки.СерияНоменклатуры, ТоварыВНТТОстатки.СерияНоменклатуры.ювШтрихкодПоставщика КАК ШтрихкодПоставщика, ТоварыВНТТОстатки.Склад КАК Магазин, ТоварыВНТТОстатки.КоличествоОстаток КАК Количество, ТоварыВНТТОстатки.ювВесОстаток КАК Вес, ТоварыВНТТОстатки.Организация, ТоварыВНТТОстатки.Склад.ТипЦенРозничнойТорговли.ВалютаЦены КАК Валюта, ТоварыВНТТОстатки.СерияНоменклатуры.ювРазмер КАК Размер, ВЫБОР КОГДА ПартииТоваровНаСкладахОстатки.ДокументОприходования ССЫЛКА Документ.ПоступлениеТоваровУслуг ТОГДА ВЫРАЗИТЬ(ПартииТоваровНаСкладахОстатки.ДокументОприходования КАК Документ.ПоступлениеТоваровУслуг).Контрагент КОГДА ПартииТоваровНаСкладахОстатки.ДокументОприходования ССЫЛКА Документ.ПоступлениеТоваровУслугВНТТ ТОГДА ВЫРАЗИТЬ(ПартииТоваровНаСкладахОстатки.ДокументОприходования КАК Документ.ПоступлениеТоваровУслугВНТТ).Контрагент ИНАЧЕ НЕОПРЕДЕЛЕНО КОНЕЦ КАК Поставщик ИЗ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(, ) КАК ПартииТоваровНаСкладахОстатки ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВНТТ.Остатки(, ) КАК ТоварыВНТТОстатки ПО ПартииТоваровНаСкладахОстатки.Склад = ТоварыВНТТОстатки.Склад И ПартииТоваровНаСкладахОстатки.Номенклатура = ТоварыВНТТОстатки.Номенклатура И ПартииТоваровНаСкладахОстатки.ХарактеристикаНоменклатуры = ТоварыВНТТОстатки.ХарактеристикаНоменклатуры И ПартииТоваровНаСкладахОстатки.СерияНоменклатуры = ТоварыВНТТОстатки.СерияНоменклатуры И ПартииТоваровНаСкладахОстатки.СерияНоменклатуры.ювРазмер = ТоварыВНТТОстатки.СерияНоменклатуры.ювРазмер ГДЕ ТоварыВНТТОстатки.КоличествоОстаток > 0 И ТоварыВНТТОстатки.ювВесОстаток >= 0
Вроде в запросе ошибок нет, фильтрацию сделал по поставщику в обработке, при нажатии Выгрузить данные -> Пишет успешно выгружены данные-> А самого файла нету, запрос свой проверял в Консоле Запросов отрабатывает, только не фильтрует, а когда пытаюсь посмотреть Выгруженные данные в обработке показывает следующее (скрин 2), т.е. я так понимаю в выгружаемых данных просто пусто и вот вопрос в следующем, косяк в самой обработке надо искать, либо же я запрос написал некорректно ?
