Как использовать списки в запросах 1С и настроить элемент «Список значений» на обычной форме

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

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

Часть 1. Синтаксис и особенности работы со списками в запросах 1С

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

Типичная синтаксическая ошибка разработчиков заключается в попытке скомбинировать оператор равенства и оператор вхождения во множество:


// ОШИБОЧНЫЙ СИНТАКСИС:
Склад.Магазин = В (&Магазин)

Такая конструкция вызывает ошибку компиляции запроса, так как оператор = В не существует в языке запросов 1С. Для проверки вхождения поля во множество значений знак «равно» использовать не нужно. Правильный вариант выглядит следующим образом:


// ПРАВИЛЬНЫЙ СИНТАКСИС:
Склад.Магазин В (&Магазин)

Давайте проанализируем, как работает этот оператор «под капотом» и какие особенности нужно учитывать при написании кода.

Универсальность оператора вхождения

Оператор В является гибким и универсальным инструментом. В качестве параметра &Магазин ему можно передавать:

  1. Одиночную ссылку (например, конкретный элемент справочника). В этом случае платформа автоматически обработает запрос так, будто вы написали оператор равенства =.
  2. Массив значений.
  3. Список значений (объект СписокЗначений).
  4. Выгруженную колонку таблицы значений, содержащую массив соответствующих ссылок.
  5. Результат вложенного запроса.

Проблема пустого списка параметров

Важно помнить критическую особенность работы СУБД с пустыми множествами. Если вы передадите в параметр &Магазин пустой массив или пустой список значений, условие В (&Магазин) всегда будет возвращать Ложь. В итоге запрос вернет пустой результат, даже если в базе данных есть записи.

Если перед нами стоит задача сделать отбор необязательным (то есть, если список магазинов пуст — выбирать данные по всем магазинам), стандартная конструкция не сработает напрямую. Проверить список на пустоту внутри самого запроса нельзя. Выясним, как обойти это ограничение на практике.

Разберем по шагам решение для реализации «необязательного» фильтра:

  1. В коде на встроенном языке проверяем заполненность списка значений или массива.
  2. Передаем в запрос дополнительный булев параметр, сигнализирующий о необходимости применения фильтра.
  3. В тексте запроса пишем комбинированное условие.

Посмотрим на пример реализации в коде:


// Подготовка параметров запроса в коде
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    |	ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    |	ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Остаток
    |ИЗ
    |	РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаЗаказа, 
    |		НЕ &ФильтрПоМагазинамПрименен ИЛИ Склад.Магазин В (&Магазины)
    |	) КАК ТоварыНаСкладахОстатки";

ФильтрПрименен = (СписокМагазинов.Количество() > 0);

Запрос.УстановитьПараметр("ДатаЗаказа", КонецДня(ТекущаяДата()));
Запрос.УстановитьПараметр("ФильтрПоМагазинамПрименен", ФильтрПрименен);
Запрос.УстановитьПараметр("Магазины", СписокМагазинов);

РезультатЗапроса = Запрос.Выполнить();

Если для построения отчета или динамического списка вы используете СКД (Систему компоновки данных), эту проблему решать вручную в коде не требуется. Достаточно заключить условие в фигурные скобки, сделав его необязательным для СКД:

{ГДЕ Склад.Магазин В (&Магазины)}

Платформа сама исключит это условие из итогового SQL-запроса, если пользователь не заполнит соответствующий параметр в настройках компоновки.

Часть 2. Реализация и интерактивная настройка «Списка значений» на обычных формах

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

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

Вариант А. Настройка компактного поля ввода с вызовом модального окна списка

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

Выполним настройку по шагам:

  1. Создание реквизита обработки/формы: Перейдем во вкладку «Реквизиты» формы или объекта и создадим новый реквизит. В колонке «Тип» выберем СписокЗначений.
  2. Размещение элемента на форме: Перетащим созданный реквизит на форму. Платформа создаст элемент управления ПолеВвода.
  3. Настройка типов элементов списка: Откроем свойства созданного поля ввода. Найдем свойство Тип значения списка (не путать со свойством «Тип значения»). Нажмем на кнопку выбора типа и укажем конкретный тип данных, элементы которого пользователь будет добавлять в список (например, СправочникСсылка.Магазины). Это критически важный шаг, так как по умолчанию список является универсальным и не «знает», какой справочник открывать для выбора.
  4. Включение кнопки выбора: В свойствах поля ввода найдем свойство Кнопка выбора и установим для него значение Да (или установим флаг). На самом поле ввода появится кнопка с тремя точками.

Как это работает для пользователя: При нажатии на кнопку выбора «...» платформа автоматически открывает модальное диалоговое окно «Редактирование списка значений». В этом окне пользователю сразу доступны встроенные инструменты: кнопка «Добавить» для выбора элемента справочника, кнопка «Подбор» для множественного выбора, а также кнопки удаления элементов и изменения их порядка.

Вариант Б. Отображение списка на форме в виде полноценной таблицы

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

Разберем детально этот способ:

  1. Создание реквизита: Убедимся, что у нас создан реквизит с типом СписокЗначений.
  2. Размещение элемента управления «Табличное поле»: Из панели инструментов перенесем на форму элемент управления ТабличноеПоле (не путайте с табличным документом).
  3. Связь данных: Откроем свойства добавленного табличного поля. В поле Данные выберем наш реквизит типа СписокЗначений. Экранная таблица тут же перестроится и покажет две колонки по умолчанию (Пометка и Значение).
  4. Создание панели управления: Чтобы пользователь мог интерактивно добавлять строки в эту таблицу, нам понадобятся кнопки управления. Из панели инструментов добавим элемент управления КоманднаяПанель и расположим ее непосредственно над табличным полем.
  5. Связь командной панели и таблицы: Откроем свойства добавленной командной панели. Включим свойство Автозаполнение. В свойстве Источник действий укажем наше созданное ранее табличное поле.

Как это работает для пользователя: Платформа автоматически сгенерирует на командной панели стандартный набор кнопок для работы с таблицей: зеленый плюс («Добавить»), карандаш («Изменить»), красный крестик («Удалить»), а также стрелки для сортировки элементов. Пользователь сможет редактировать список прямо на форме.

Распространенная ошибка: Путаница с «Режимом выбора из списка»

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

В этом случае элемент управления меняет свое поведение:

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

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

← На главную