Что делать, если список выбора в табличной части управляемой формы пуст, хотя данные в справочнике есть

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

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

Проанализируем ситуацию: почему пропадают данные?

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

Если с источником данных все в порядке, нам стоит обратить внимание на механизмы платформы, которые могут неявно фильтровать данные. Разберем наиболее вероятные факторы по шагам.

Причина 1: Свойство Режим выбора из списка (ChoiceListMode)

Это одна из самых коварных настроек. Если в свойствах элемента формы (поля ввода в колонке) установлен флаг Режим выбора из списка, платформа переходит в особый режим. В этом случае 1С не будет автоматически подтягивать все элементы из справочника-источника. Она ожидает, что список возможных значений будет заранее определен в конфигураторе или заполнен программно в коллекции СписокВыбора.

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

Причина 2: Связи параметров выбора (ChoiceParameterLinks)

Рассмотрим ситуацию с подчиненными справочниками. Допустим, наше «Помещение» подчинено «Складу». В шапке документа связь может быть настроена на реквизит «Склад», который заполнен. Однако в табличной части платформа часто пытается найти поле-владелец в той же самой строке. Если в строке табличной части поле «Склад» не заполнено или связь настроена некорректно, список помещений будет отфильтрован по пустому владельцу, и мы увидим пустую таблицу.

Проверим свойство Связи параметров выбора в конфигураторе для элемента формы в ТЧ. Нужно убедиться, что путь к данным для связи указан верно, учитывая контекст строки: Объект.ИмяТабличнойЧасти.ИмяРеквизитаВладельца.

Причина 3: Параметры выбора и фиксированные отборы

Иногда в свойствах колонки в пункте Параметры выбора (ChoiceParameters) устанавливаются жесткие фильтры. Например, может стоять отбор Отбор.ПометкаУдаления(Ложь) или специфический отбор по какому-то булеву реквизиту справочника. Если в справочнике нет ни одного элемента, удовлетворяющего этому условию, список логично окажется пустым. Проанализируем настройки этого свойства и попробуем временно очистить их для проверки.

Причина 4: Свойства Быстрый выбор и Ограничение типа

Посмотрим на свойство Быстрый выбор (QuickChoice). Оно предназначено для выпадающих списков. Если справочник содержит тысячи элементов, платформа может не справиться с формированием такого списка «на лету» для каждой строки табличной части. Попробуем установить это свойство в значение Авто или Нет.

Также важно проверить Ограничение типа. Если реквизит табличной части имеет составной тип данных, но в колонке формы не выбрано конкретное значение типа, кнопка выбора может работать некорректно. Выясним, совпадает ли тип данных реквизита в шапке и в табличной части до последнего знака.

Программное решение: Использование метода ОбновитьСписокВыбора()

Если все визуальные настройки в конфигураторе проверены, а проблема сохраняется, мы можем прибегнуть к принудительному обновлению данных формы на сервере. Иногда платформа кэширует состояние элементов формы, и список выбора «зависает» в пустом состоянии.

Как показывает практика, эффективным решением является вызов метода ОбновитьСписокВыбора() в процедуре создания формы. Рассмотрим пример кода:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Принудительно обновляем списки выбора для всех элементов формы.
    // Это заставляет платформу перечитать метаданные и актуализировать связи.
    ЭтотОбъект.ОбновитьСписокВыбора();
    
КонецПроцедуры

Метод ОбновитьСписокВыбора() инициирует синхронизацию описания списков выбора между сервером и клиентом. Это помогает в тех случаях, когда форма была изменена динамически или когда стандартные механизмы инициализации списков в табличных частях не сработали автоматически.

Дополнительные факторы: Расширения и RLS

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

Также стоит упомянуть RLS (Record Level Security). Хотя это встречается редко, настройки прав доступа могут быть сконфигурированы так, что в контексте выбора из табличной части запрос к данным блокируется правами доступа. Убедитесь, что у пользователя достаточно прав на чтение и просмотр справочника во всех режимах.

Подведем итоги

Мы разобрали основные причины, по которым выбор в табличной части может быть пустым. Для решения задачи рекомендуем придерживаться следующего алгоритма:

  1. Проверить, не включен ли Режим выбора из списка в свойствах колонки.
  2. Убедиться, что Связи параметров выбора не накладывают невыполнимых условий (особенно по владельцу).
  3. Проверить отсутствие жестких фильтров в Параметрах выбора.
  4. Применить программный метод ОбновитьСписокВыбора() в модуле формы на сервере.

Эти шаги позволяют в большинстве случаев восстановить работоспособность формы и обеспечить пользователю корректный выбор данных из справочника.

← На главную