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

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

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

Различие между формой списка и формой выбора

Первое, что нам необходимо проанализировать, — это какой именно объект открывается при нажатии на кнопку выбора. В 1С справочник может иметь несколько типов форм: форма списка, форма выбора, форма выбора группы. Рассмотрим ситуацию: программист ставит точки останова в ФормеСписка, а система при выборе из документа автоматически открывает ФормуВыбора. Если эта форма не создана явно, платформа генерирует ее автоматически ("автоформа").

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

Проблемы с отладкой: почему не срабатывают точки останова?

Если вы уверены, что открывается нужная форма, но точка останова в процедуре ПриСозданииНаСервере игнорируется, проанализируем настройки отладки. Рассмотрим основные причины:

  1. Отладка на сервере: Если база клиент-серверная, необходимо убедиться, что сервер приложений 1С запущен с ключом -debug. Без этого серверные процедуры (&НаСервере) не будут останавливаться.
  2. Предметы отладки: Проверим список подключенных предметов отладки. Иногда клиентское приложение подключено, а серверное — нет.
  3. Клиентский код: Попробуем поставить точку останова в процедуре &НаКлиенте, например, в ПриОткрытии. Если на клиенте остановка происходит, а на сервере нет — проблема однозначно в настройках сервера.

Проверка свойств реквизита в конфигураторе

Если программный код не содержит явных условий, проанализируем свойства самого реквизита в метаданных. Платформа 1С позволяет задавать жесткие фильтры без написания кода. Посмотрим на следующие параметры:

Параметры выбора (ChoiceParameters): Здесь может быть установлен статический отбор. Например, Отбор.Статус(Перечисления.Статусы.Активен). В режиме "Предприятие" пользователь этот фильтр не увидит и не сможет его снять.

Связи параметров выбора (ChoiceParameterLinks): Это динамический фильтр, который зависит от других реквизитов формы. Рассмотрим пример: выбор склада в документе ограничен организацией, указанной в шапке. Если организация не выбрана, список складов может оказаться пустым, так как система ищет склады с "пустой" организацией.

Анализ динамического списка формы выбора

Перейдем к самой форме выбора и изучим настройки ДинамическогоСписка. Разберем, как данные попадают на экран:

  1. Произвольный запрос: Если в динамическом списке включен флаг "Произвольный запрос", проверим текст запроса. Там может присутствовать конструкция ГДЕ, ограничивающая выборку (например, ГДЕ ПометкаУдаления = ЛОЖЬ или ГДЕ ТипНоменклатуры = &Тип).
  2. Настройки компоновки данных: Откроем закладку "Настройки" у динамического списка. В разделе "Отбор" могут быть заданы фиксированные настройки, которые не редактируются пользователем.

Использование модуля менеджера справочника

Иногда причина кроется глубже — в модуле менеджера объекта. Существует системное событие ОбработкаПолученияДанныхВыбора. Этот обработчик срабатывает еще до открытия формы выбора и позволяет полностью подменить результат поиска или наложить свои фильтры. Рассмотрим пример кода, который может скрывать элементы:


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

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

Влияние функциональных опций и RLS

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

Практические рекомендации по поиску ошибки

Рассмотрим универсальный алгоритм, если точки останова не помогают:

  1. Замер производительности: Запустите замер в конфигураторе, совершите попытку выбора элемента и остановите замер. В отчете вы увидите список всех процедур и функций, которые были выполнены. Это поможет найти скрытый вызов в общем модуле или модуле менеджера, который накладывает отбор.
  2. Очистка кэша: Иногда некорректное отображение форм связано с кэшем метаданных. Попробуйте запустить базу с параметром /ClearCache или удалите базу из списка и добавьте ее снова.
  3. Проверка типов: Убедитесь, что тип реквизита в документе строго соответствует типу справочника. Если реквизит имеет составной тип, проверьте, какие именно типы разрешены к выбору.

Таким образом, отсутствие элементов в списке выбора — это комплексная проблема, требующая проверки как свойств метаданных, так и программных обработчиков на разных уровнях выполнения кода. Последовательный анализ от простого (свойства реквизита) к сложному (модуль менеджера и RLS) всегда позволяет найти причину поведения системы.

← На главную