Почему при выборе контрагента в списке отображаются только группы и как правильно настроить отбор по перечислению

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

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

Разбор механизма отображения иерархии при установленных фильтрах

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

Рассмотрим две основные ситуации:

  1. Режим «Иерархический список» или «Дерево»: В этом режиме система обязана показать структуру каталогов. Если элемент внутри папки не соответствует условию отбора, он скрывается. Но сама папка (группа) остается видимой, чтобы пользователь мог по ней перемещаться. Если ни один элемент в справочнике не подошел под критерий отбора, пользователь увидит дерево абсолютно пустых папок. Это именно та ситуация, с которой столкнулся автор темы.
  2. Режим «Список»: Если переключить форму выбора в плоский список (без иерархии), группы исчезнут, и в таблице останутся только те элементы, которые напрямую соответствуют значению перечисления в отборе.

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

Проблема 1: Некорректный синтаксис в «Параметрах выбора»

В конфигураторе, в свойствах поля табличной части, есть свойство Параметры выбора. Часто разработчики пытаются прописать условие вручную. Посмотрим на пример правильной настройки отбора по перечислению:

Отбор.ТипОрганизации(ЗначениеПеречисления.ТипыОрганизаций.МедицинскаяОрганизация)

Если в параметрах допущена опечатка или указана строка вместо ссылки на объект метаданных, система не найдет совпадений в базе данных, и список элементов окажется пустым. Проверим, правильно ли указан путь к значению перечисления в вашем проекте.

Проблема 2: Индексирование реквизита

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

  1. Откроем конфигуратор и найдем справочник Контрагенты.
  2. Перейдем на вкладку «Данные» и выберем реквизит ТипОрганизации.
  3. В свойстве «Индексирование» установим значение Индексировать.

Проблема 3: Конфликт программных и визуальных настроек

Часто в самой форме выбора справочника Контрагенты написан код в процедуре ПриСозданииНаСервере. Этот код может переопределять те настройки, которые мы задали в документе. Если мы передаем параметры выбора из документа, они попадают в коллекцию Параметры формы выбора.

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


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

КонецПроцедуры

Как проверить работоспособность отбора на стороне пользователя

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

  1. Откроем форму выбора контрагента.
  2. Нажмем кнопку «Еще» и выберем пункт «Режим просмотра» — «Список».
  3. Если список стал абсолютно пустым, значит, отбор работает «слишком хорошо» — в базе просто нет контрагентов с таким типом организации или значение в реквизите заполнено иначе.
  4. Проверим конкретного контрагента, который должен был попасть в список. Убедимся, что реквизит ТипОрганизации у него совпадает с тем, что мы указали в фильтре.

Использование «Связи параметров выбора»

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

Подведем итог: если вы видите только группы, значит, фильтр активен, но под его условия не попадает ни один элемент. Проверьте тип данных перечисления, индексацию реквизита и режим просмотра формы. Убрав ошибочный или избыточный отбор, как сделал автор темы, вы вернете видимость элементов, но для корректной работы бизнес-логики лучше настроить фильтрацию правильно, используя точные ссылки на значения перечислений.

← На главную