Как открыть форму списка с отбором по дополнительному реквизиту в 1С

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

При разработке прикладных решений на платформе «1С:Предприятие 8.3» часто возникает задача открыть форму списка или выбора с предустановленным отбором. Если со стандартными реквизитами шапки (такими как Организация или Контрагент) сложностей не возникает, то обращение к дополнительным реквизитам и сведениям нередко вызывает ошибки вроде «Поле не найдено». Разберем механизм работы с такими полями и выясним, как правильно наложить отбор.

В чем заключается проблема при обращении к доп. реквизиту

Проанализируем ситуацию: разработчик пытается программно добавить элемент отбора в коллекцию Список.Отбор.Элементы, указывая в качестве левого значения строку с названием свойства, например Новый ПолеКомпоновкиДанных("Бух. документ") или Новый ПолеКомпоновкиДанных("[Бух. документ]"). При выполнении такого кода платформа выдает ошибку запроса, так как в схеме динамического списка нет скалярного поля с таким именем.

Дополнительные реквизиты объектов в типовых конфигурациях (на базе БСП) хранятся в табличной части ДополнительныеРеквизиты. Для того чтобы динамический список понимал обращение к конкретному свойству как к отдельной колонке, задействуется встроенный механизм характеристик системы компоновки данных (СКД).

Синтаксис обращения через механизм характеристик

Чтобы платформа связала условие отбора с нужной характеристикой объекта, необходимо явно указать ссылочное поле, к которому относится свойство. Обращение выполняется через точку и квадратные скобки:

Ссылка.[НаименованиеСвойства]

Рассмотрим правила формирования этого выражения:

  1. Поле перед точкой — это имя ссылочного поля в запросе динамического списка (как правило, это стандартное поле Ссылка).
  2. Внутри квадратных скобок указывается точное наименование свойства так, как оно задано в справочнике или плане видов характеристик (например, в ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения). Регистр и знаки препинания должны строго совпадать.

Если наш дополнительный реквизит называется «Бух. документ», поле компоновки данных объявляется следующим образом:

ОтборБух.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка.[Бух. документ]");

Рекомендованный способ: передача отбора через параметры открытия формы

Посмотрим на частую ошибку архитектуры кода: разработчик сначала открывает форму через ОткрытьФорму, а затем напрямую модифицирует коллекцию ФормаВыбора.Список.Отбор.Элементы. Это приводит к лишнему запросу к базе данных: форма сначала считывает данные без отбора, а затем принудительно обновляется повторно.

Оптимальный способ — сформировать настройки компоновки данных заранее и передать их в параметре ФиксированныеНастройки при вызове функции ОткрытьФорму. Разберем готовый пример реализации:


НастройкиКД = Новый НастройкиКомпоновкиДанных;

// Отбор по стандартному реквизиту Контрагент
ОтборВладелец = НастройкиКД.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборВладелец.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контрагент");
ОтборВладелец.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборВладелец.ПравоеЗначение = КонтрагентДокумента;
ОтборВладелец.Использование = Истина;

// Отбор по дополнительному реквизиту Бух. документ
ОтборБух = НастройкиКД.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборБух.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка.[Бух. документ]");
ОтборБух.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборБух.ПравоеЗначение = Ложь;
ОтборБух.Использование = Истина;

// Подготовка параметров формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ФиксированныеНастройки", НастройкиКД);
ПараметрыФормы.Вставить("РежимВыбора", Истина);

Оповещение = Новый ОписаниеОповещения("Расш2_ВыборЗавершение", ЭтотОбъект);

ОткрытьФорму("Документ.РасходнаяНакладная.Форма.ФормаВыбора", 
    ПараметрыФормы, 
    ЭтотОбъект, 
    , 
    , 
    , 
    Оповещение, 
    РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

Использование свойства ФиксированныеНастройки гарантирует, что пользователь не сможет случайно отключить данный отбор в интерфейсе, а первичная выборка данных в списке будет сразу отфильтрована на стороне сервера СУБД.

Ограничения и подводные камни строкового синтаксиса

Хотя вариант Ссылка.[ИмяРеквизита] прост в реализации, рассмотрим риски, которые следует учитывать при проектировании:

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

Альтернативные варианты реализации отбора

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

  1. Отбор по табличной части без механизма характеристик: Можно создать группу отбора типа И и проверить наличие строки в табличной части ДополнительныеРеквизиты, где поле Свойство равно конкретной ссылке на элемент плана видов характеристик (найденной по коду или предопределенному значению), а поле Значение равно заданному значению.
  2. Доработка запроса динамического списка: Если форма выбора разрабатывается под конкретную задачу, в текст запроса динамического списка можно добавить явное левое соединение с табличной частью дополнительных реквизитов и вывести поле с фиксированным псевдонимом (например, БухДокументФлаг). В таком случае отбор накладывается на стандартное поле списка без использования квадратных скобок.
← На главную