В процессе разработки или настройки конфигураций на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда в форме списка документов колонка «Сотрудники» (или «Состав») остается пустой, хотя в самих документах табличные части заполнены. Это создает неудобства для пользователей, так как им приходится открывать каждый документ, чтобы понять, кто в нем указан.
Давайте вместе разберем причины этой проблемы и пошагово рассмотрим способы ее решения, опираясь на лучшие практики разработки и механизмы Библиотеки стандартных подсистем (БСП).
Разберем важный технический нюанс: динамический список, который отображает данные в форме списка, работает напрямую с таблицами базы данных. Табличную часть документа (список сотрудников) невозможно эффективно вывести в одну строку списка «на лету» без потери производительности. Поэтому в типовых и грамотно спроектированных самописных конфигурациях используется механизм денорминализации.
Для отображения состава используется специальный реквизит документа (например, КраткийСоставДокумента или Состав) с типом Строка. Проблема заключается в том, что этот реквизит может быть пуст. Выясним, почему это происходит и как это исправить.
Проанализируем ситуацию: если данные в табличной части есть, а в строковом реквизите — нет, значит, не срабатывает логика заполнения этого реквизита. Рассмотрим, как правильно реализовать заполнение в модуле объекта документа. Нам необходимо перехватить событие ПередЗаписью.
Посмотрим на пример кода, который должен быть размещен в модуле объекта:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Проверяем, не выполняется ли загрузка данных (обмен)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Формируем строковое представление состава сотрудников
// Допустим, табличная часть называется "Сотрудники", а поле в ней - "Сотрудник"
СписокСотрудников = "";
Для Каждого СтрокаТЧ Из Сотрудники Цикл
СписокСотрудников = СписокСотрудников + ?(ПустаяСтрока(СписокСотрудников), "", ", ") + Строка(СтрокаТЧ.Сотрудник);
КонецЦикла;
// Ограничиваем длину строки, если реквизит имеет фиксированную длину
КраткийСоставДокумента = Лев(СписокСотрудников, 200);
КонецПроцедуры
Важно помнить, что если документы были созданы программно (обработкой или загрузкой) без вызова метода Записать(), то это событие не отработало, и колонка в списке будет пустой. В таком случае поможет перепроведение документов или специальная обработка по обновлению этого реквизита.
Если реквизит в объекте заполнен, но в форме списка все равно пусто, нам нужно проанализировать настройки самого Динамического списка. Рассмотрим основные моменты, на которые стоит обратить внимание.
Выясним причину через свойства элемента формы:
Список) с типом ДинамическийСписок.Часто бывает так, что в тексте запроса просто не выбрано нужное поле. Проанализируем типичный запрос динамического списка:
ВЫБРАТЬ
ДокументПрием.Ссылка КАК Ссылка,
ДокументПрием.Номер КАК Номер,
ДокументПрием.Дата КАК Дата,
// Проверьте наличие этой строки:
ДокументПрием.КраткийСоставДокумента КАК Сотрудники
ИЗ
Документ.ПриемНаРаботу КАК ДокументПрием
Если вы добавили новый реквизит в объект, но в динамическом списке используется произвольный запрос, 1С не добавит его в список полей автоматически. Вам необходимо вручную добавить его в секцию ВЫБРАТЬ. Также обратите внимание на галочку Автозаполнение полей — если она снята, то каждое поле должно быть явно описано в запросе.
В тексте обращения мы видим использование процедур ПодключаемыеКоманды. Это говорит о том, что конфигурация построена на базе Библиотеки стандартных подсистем (БСП). В таких системах за отображение колонок могут отвечать программные механизмы.
Рассмотрим ситуацию, когда колонка добавляется программно или управляется функциональными опциями. Если в системе выключена какая-то функциональная опция (например, учет по нескольким организациям или специфический кадровый учет), БСП может автоматически скрывать соответствующие колонки в формах.
Проанализируем шаги для проверки:
Список.КраткийСоставДокумента.Иногда решение проблемы оказывается гораздо проще и не требует изменения кода. Выясним, не скрыл ли колонку сам пользователь. В управляемых формах настройки отображения сохраняются для каждого пользователя индивидуально.
Разберем, как это проверить в режиме «1С:Предприятие»:
Также стоит заглянуть в Условное оформление (находится в свойствах динамического списка в конфигураторе или в настройках списка в режиме предприятия). Проанализируем возможность наличия правила, которое устанавливает тексту пустую строку или делает его невидимым при определенных условиях.
Если один пользователь видит сотрудников, а другой — нет, причина кроется в правах доступа. В 1С существует механизм RLS (Record Level Security) — ограничение доступа на уровне записей.
Если поле «Сотрудники» в динамическом списке получается не из простого строкового реквизита, а через соединение с таблицей справочника Сотрудники, то при отсутствии прав на чтение этого справочника система вернет NULL или пустую строку. Рекомендуется проверить права пользователя на чтение всех объектов, участвующих в запросе динамического списка.
Подведем итог: для решения проблемы в первую очередь убедитесь, что строковый реквизит состава заполняется в процедуре ПередЗаписью модуля объекта. Затем проверьте настройки запроса динамического списка и убедитесь, что поле включено в выборку. Эти шаги решают проблему в 90% случаев.