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