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