При разработке прикладных решений на платформе «1С:Предприятие 8.3» часто возникает задача открыть форму списка или выбора с предустановленным отбором. Если со стандартными реквизитами шапки (такими как Организация или Контрагент) сложностей не возникает, то обращение к дополнительным реквизитам и сведениям нередко вызывает ошибки вроде «Поле не найдено». Разберем механизм работы с такими полями и выясним, как правильно наложить отбор.
Проанализируем ситуацию: разработчик пытается программно добавить элемент отбора в коллекцию Список.Отбор.Элементы, указывая в качестве левого значения строку с названием свойства, например Новый ПолеКомпоновкиДанных("Бух. документ") или Новый ПолеКомпоновкиДанных("[Бух. документ]"). При выполнении такого кода платформа выдает ошибку запроса, так как в схеме динамического списка нет скалярного поля с таким именем.
Дополнительные реквизиты объектов в типовых конфигурациях (на базе БСП) хранятся в табличной части ДополнительныеРеквизиты. Для того чтобы динамический список понимал обращение к конкретному свойству как к отдельной колонке, задействуется встроенный механизм характеристик системы компоновки данных (СКД).
Чтобы платформа связала условие отбора с нужной характеристикой объекта, необходимо явно указать ссылочное поле, к которому относится свойство. Обращение выполняется через точку и квадратные скобки:
Ссылка.[НаименованиеСвойства]
Рассмотрим правила формирования этого выражения:
Ссылка).ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения). Регистр и знаки препинания должны строго совпадать.Если наш дополнительный реквизит называется «Бух. документ», поле компоновки данных объявляется следующим образом:
ОтборБух.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка.[Бух. документ]");
Посмотрим на частую ошибку архитектуры кода: разработчик сначала открывает форму через ОткрытьФорму, а затем напрямую модифицирует коллекцию ФормаВыбора.Список.Отбор.Элементы. Это приводит к лишнему запросу к базе данных: форма сначала считывает данные без отбора, а затем принудительно обновляется повторно.
Оптимальный способ — сформировать настройки компоновки данных заранее и передать их в параметре ФиксированныеНастройки при вызове функции ОткрытьФорму. Разберем готовый пример реализации:
НастройкиКД = Новый НастройкиКомпоновкиДанных;
// Отбор по стандартному реквизиту Контрагент
ОтборВладелец = НастройкиКД.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборВладелец.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контрагент");
ОтборВладелец.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборВладелец.ПравоеЗначение = КонтрагентДокумента;
ОтборВладелец.Использование = Истина;
// Отбор по дополнительному реквизиту Бух. документ
ОтборБух = НастройкиКД.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборБух.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка.[Бух. документ]");
ОтборБух.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборБух.ПравоеЗначение = Ложь;
ОтборБух.Использование = Истина;
// Подготовка параметров формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ФиксированныеНастройки", НастройкиКД);
ПараметрыФормы.Вставить("РежимВыбора", Истина);
Оповещение = Новый ОписаниеОповещения("Расш2_ВыборЗавершение", ЭтотОбъект);
ОткрытьФорму("Документ.РасходнаяНакладная.Форма.ФормаВыбора",
ПараметрыФормы,
ЭтотОбъект,
,
,
,
Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
Использование свойства ФиксированныеНастройки гарантирует, что пользователь не сможет случайно отключить данный отбор в интерфейсе, а первичная выборка данных в списке будет сразу отфильтрована на стороне сервера СУБД.
Хотя вариант Ссылка.[ИмяРеквизита] прост в реализации, рассмотрим риски, которые следует учитывать при проектировании:
Если требуется повышенная отказоустойчивость без привязки к текстовому наименованию, разберем альтернативные подходы:
И и проверить наличие строки в табличной части ДополнительныеРеквизиты, где поле Свойство равно конкретной ссылке на элемент плана видов характеристик (найденной по коду или предопределенному значению), а поле Значение равно заданному значению.БухДокументФлаг). В таком случае отбор накладывается на стандартное поле списка без использования квадратных скобок.