Почему в консоли запросов для 1С 8.3 нельзя выбрать перечисление в списке значений?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При отладке запросов в стандартной консоли на управляемых формах разработчики часто сталкиваются с неприятным поведением: требуется передать список значений для условия с оператором В (&Параметр), где элементами списка должны выступать значения перечислений. Однако при добавлении строки в СписокЗначений открывается стандартное системное окно выбора типа данных, в котором полностью отсутствует ветка метаданных перечислений. Разберем детально, почему это происходит и какими способами можно обойти данное ограничение платформы.

Причины поведения платформы и влияние режима совместимости

Проанализируем ситуацию на уровне платформенных механизмов. В клиентских приложениях для управляемого интерфейса (в тонком и толстом клиентах) в универсальных диалогах выбора типов и описания типов состав доступных типов формировался с ограничением: ссылочные типы перечислений не регистрировались в общем списке, если тип реквизита не был предварительно ограничен.

Начиная с версии платформы 8.3.10, разработчики фирмы «1С» устранили данное некорректное поведение: перечисления появились в диалогах выбора типов во всех клиентских приложениях. Однако здесь кроется ключевой нюанс, связанный с настройками конфигурации:

  1. Если конфигурация работает в режиме совместимости с версией 8.3.9 и ниже, платформа намеренно сохраняет старое поведение для обеспечения обратной совместимости. Перечисления в универсальном диалоге выбора отображаться не будут, даже если физически используется платформа версии 8.3.10 или более новая.
  2. Если в свойствах конфигурации параметр Режим совместимости переключен в значение Не использовать (или установлен в 8.3.10 и выше), диалог выбора типов начинает корректно отображать перечисления.

Поскольку рабочие конфигурации редко позволяют сразу отключить режим совместимости, рассмотрим альтернативные варианты работы с параметрами-перечислениями.

Вариант 1. Указание значений перечислений непосредственно в тексте запроса

Если требуется разово проверить или отладить логику запроса, проще всего отказаться от интерактивной передачи параметра через интерфейс консоли и зафиксировать значения прямо в тексте запроса с помощью конструкции ЗНАЧЕНИЕ().

Посмотрим на пример использования проверки условия по списку через перечисление в тексте:


ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Номенклатура,
    ТоварыНаСкладахОстатки.КоличествоОстаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
ГДЕ
    ТоварыНаСкладахОстатки.Номенклатура.ВидНоменклатуры В (
        ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар),
        ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
    )

Если же логика отлаживаемого запроса требует передачи списка через временную таблицу, можно сформировать фильтр объединением литералов:


ВЫБРАТЬ ЗНАЧЕНИЕ(Перечисление.ВидыЦенностей.Товар) КАК Значение
ПОМЕСТИТЬ ВТ_ФильтрПоЦенностям

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ ЗНАЧЕНИЕ(Перечисление.ВидыЦенностей.Услуга)
;

ВЫБРАТЬ
    УчетПартий.Номенклатура,
    УчетПартий.ВидЦенности
ИЗ
    РегистрНакопления.УчетПартий КАК УчетПартий
ГДЕ
    УчетПартий.ВидЦенности В (ВЫБРАТЬ Значение ИЗ ВТ_ФильтрПоЦенностям)

Вариант 2. Использование вычисляемых параметров или одномерных массивов

Для условия запроса вида ГДЕ Поле В (&Параметр) платформа 1С одинаково успешно принимает как СписокЗначений, так и обычный одномерный Массив.

Многие современные консоли запросов поддерживают вычисление выражений на встроенном языке для заполнения параметров. В этом случае мы обходим интерактивное диалоговое окно платформы, формируя массив программно:


МассивЗначений = Новый Массив;
МассивЗначений.Добавить(ПредопределенноеЗначение("Перечисление.ВидыЦенностей.Товар"));
МассивЗначений.Добавить(ПредопределенноеЗначение("Перечисление.ВидыЦенностей.Услуга"));
Параметры.Вставить("ВидыЦенностей", МассивЗначений);

Если код выполняется в контексте сервера или внешнего модуля, значения перечислений можно получить прямым обращением к менеджеру объекта:


МассивЗначений = Новый Массив;
МассивЗначений.Добавить(Перечисления.ВидыЦенностей.Товар);
МассивЗначений.Добавить(Перечисления.ВидыЦенностей.Услуга);

Вариант 3. Доработка формы консоли запросов

Если вы используете собственную внешнюю консоль запросов и хотите сделать выбор перечислений комфортным без изменения режима совместимости конфигурации, можно доработать обработку добавления элементов в коллекцию параметров.

Разберем по шагам, как это реализовать:

  1. В форме консоли запросов найдем табличную часть или таблицу значений, отвечающую за список значений параметра.
  2. Для таблицы переопределим событие ПередНачаломДобавления, установив флаг СтандартнаяОбработка = Ложь.
  3. Вызовем собственный диалог выбора объекта метаданных или форму выбора конкретного перечисления через метод ОткрытьФорму() с передачей пути вида "Перечисление.<ИмяПеречисления>.ФормаВыбора".
  4. При получении выбранного значения поместим его в текущий СписокЗначений вручную.

Таким образом, понимая природу платформенного ограничения режимов совместимости, разработчик может легко выбрать оптимальный обходной путь: от быстрой правки текста запроса через ЗНАЧЕНИЕ() до программного формирования параметров через код.

← На главную