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