При разработке в среде 1С:Предприятие начинающие специалисты часто сталкиваются со сложностями при переходе от теории к практике. В частности, типичные проблемы возникают при передаче множественных параметров в запросы, а также при интерактивном выводе списков на форму для заполнения пользователем. В рамках этой статьи мы подробно разберем, как правильно использовать оператор множественного сравнения в запросах и как настроить элемент управления СписокЗначений на обычных (классических) формах 1С.
Рассмотрим ситуацию, когда в параметрах запроса необходимо передать не одно конкретное значение, а целое множество элементов — например, список магазинов, складов или номенклатурных позиций. Для этого в языке запросов платформы предусмотрен специальный оператор В.
Типичная синтаксическая ошибка разработчиков заключается в попытке скомбинировать оператор равенства и оператор вхождения во множество:
// ОШИБОЧНЫЙ СИНТАКСИС:
Склад.Магазин = В (&Магазин)
Такая конструкция вызывает ошибку компиляции запроса, так как оператор = В не существует в языке запросов 1С. Для проверки вхождения поля во множество значений знак «равно» использовать не нужно. Правильный вариант выглядит следующим образом:
// ПРАВИЛЬНЫЙ СИНТАКСИС:
Склад.Магазин В (&Магазин)
Давайте проанализируем, как работает этот оператор «под капотом» и какие особенности нужно учитывать при написании кода.
Универсальность оператора вхождения
Оператор В является гибким и универсальным инструментом. В качестве параметра &Магазин ему можно передавать:
=.СписокЗначений).Проблема пустого списка параметров
Важно помнить критическую особенность работы СУБД с пустыми множествами. Если вы передадите в параметр &Магазин пустой массив или пустой список значений, условие В (&Магазин) всегда будет возвращать Ложь. В итоге запрос вернет пустой результат, даже если в базе данных есть записи.
Если перед нами стоит задача сделать отбор необязательным (то есть, если список магазинов пуст — выбирать данные по всем магазинам), стандартная конструкция не сработает напрямую. Проверить список на пустоту внутри самого запроса нельзя. Выясним, как обойти это ограничение на практике.
Разберем по шагам решение для реализации «необязательного» фильтра:
Посмотрим на пример реализации в коде:
// Подготовка параметров запроса в коде
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
| ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаЗаказа,
| НЕ &ФильтрПоМагазинамПрименен ИЛИ Склад.Магазин В (&Магазины)
| ) КАК ТоварыНаСкладахОстатки";
ФильтрПрименен = (СписокМагазинов.Количество() > 0);
Запрос.УстановитьПараметр("ДатаЗаказа", КонецДня(ТекущаяДата()));
Запрос.УстановитьПараметр("ФильтрПоМагазинамПрименен", ФильтрПрименен);
Запрос.УстановитьПараметр("Магазины", СписокМагазинов);
РезультатЗапроса = Запрос.Выполнить();
Если для построения отчета или динамического списка вы используете СКД (Систему компоновки данных), эту проблему решать вручную в коде не требуется. Достаточно заключить условие в фигурные скобки, сделав его необязательным для СКД:
{ГДЕ Склад.Магазин В (&Магазины)}
Платформа сама исключит это условие из итогового SQL-запроса, если пользователь не заполнит соответствующий параметр в настройках компоновки.
Перейдем ко второму вопросу, который часто вызывает затруднения: как позволить пользователю интерактивно заполнять СписокЗначений на обычной форме (в старом стиле интерфейса 1С). При обычном добавлении реквизита на форму в виде текстового поля пользователь часто видит неактивное поле без возможности добавить туда элементы (отсутствует кнопка выбора и контекстное меню добавления).
Чтобы предоставить пользователю возможность редактировать состав списка, необходимо правильно связать элементы управления формы с реквизитом. Рассмотрим два основных способа реализации этой задачи.
Этот способ оптимален, когда место на форме ограничено и список значений должен отображаться в виде одной строки с возможностью открытия диалогового окна для редактирования.
Выполним настройку по шагам:
СписокЗначений.ПолеВвода.СправочникСсылка.Магазины). Это критически важный шаг, так как по умолчанию список является универсальным и не «знает», какой справочник открывать для выбора.Да (или установим флаг). На самом поле ввода появится кнопка с тремя точками.Как это работает для пользователя: При нажатии на кнопку выбора «...» платформа автоматически открывает модальное диалоговое окно «Редактирование списка значений». В этом окне пользователю сразу доступны встроенные инструменты: кнопка «Добавить» для выбора элемента справочника, кнопка «Подбор» для множественного выбора, а также кнопки удаления элементов и изменения их порядка.
Этот вариант подходит, если состав списка значений должен быть наглядно виден пользователю сразу на форме без необходимости открывать дополнительные модальные окна.
Разберем детально этот способ:
СписокЗначений.ТабличноеПоле (не путайте с табличным документом).СписокЗначений. Экранная таблица тут же перестроится и покажет две колонки по умолчанию (Пометка и Значение).КоманднаяПанель и расположим ее непосредственно над табличным полем.Как это работает для пользователя: Платформа автоматически сгенерирует на командной панели стандартный набор кнопок для работы с таблицей: зеленый плюс («Добавить»), карандаш («Изменить»), красный крестик («Удалить»), а также стрелки для сортировки элементов. Пользователь сможет редактировать список прямо на форме.
Проанализируем частую ошибку начинающих разработчиков. Иногда при попытке настроить поле ввода со списком значений программисты ошибочно включают свойство Режим выбора из списка (или используют тип элемента управления ПолеВыбора вместо ПолеВвода).
В этом случае элемент управления меняет свое поведение:
Используйте режим выбора из списка только тогда, когда вам нужно предложить пользователю жестко ограниченный, заранее предопределенный перечень простых значений (например, выбор квартала года или статуса документа), сформированный программно при открытии формы.
Следуя описанным инструкциям и правилам настройки типов данных, вы сможете избежать ошибок при проектировании интерфейсов на обычных формах 1С и обеспечите корректную и быструю работу ваших запросов к базе данных.