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

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

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

Давайте вместе разберем причины этой проблемы и пошагово рассмотрим способы ее решения, опираясь на лучшие практики разработки и механизмы Библиотеки стандартных подсистем (БСП).

Причина 1: Отсутствие данных в денирмализованном реквизите

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

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

Проанализируем ситуацию: если данные в табличной части есть, а в строковом реквизите — нет, значит, не срабатывает логика заполнения этого реквизита. Рассмотрим, как правильно реализовать заполнение в модуле объекта документа. Нам необходимо перехватить событие ПередЗаписью.

Посмотрим на пример кода, который должен быть размещен в модуле объекта:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	
	// Проверяем, не выполняется ли загрузка данных (обмен)
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

	// Формируем строковое представление состава сотрудников
	// Допустим, табличная часть называется "Сотрудники", а поле в ней - "Сотрудник"
	СписокСотрудников = "";
	Для Каждого СтрокаТЧ Из Сотрудники Цикл
		СписокСотрудников = СписокСотрудников + ?(ПустаяСтрока(СписокСотрудников), "", ", ") + Строка(СтрокаТЧ.Сотрудник);
	КонецЦикла;
	
	// Ограничиваем длину строки, если реквизит имеет фиксированную длину
	КраткийСоставДокумента = Лев(СписокСотрудников, 200);

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

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

Причина 2: Настройки Динамического списка (Произвольный запрос)

Если реквизит в объекте заполнен, но в форме списка все равно пусто, нам нужно проанализировать настройки самого Динамического списка. Рассмотрим основные моменты, на которые стоит обратить внимание.

Выясним причину через свойства элемента формы:

  1. Откроем форму списка в конфигураторе.
  2. Найдем основной реквизит формы (обычно он называется Список) с типом ДинамическийСписок.
  3. Проверим свойство Произвольный запрос. Если галочка установлена, нам нужно зайти в настройки запроса.

Часто бывает так, что в тексте запроса просто не выбрано нужное поле. Проанализируем типичный запрос динамического списка:


ВЫБРАТЬ
	ДокументПрием.Ссылка КАК Ссылка,
	ДокументПрием.Номер КАК Номер,
	ДокументПрием.Дата КАК Дата,
	// Проверьте наличие этой строки:
	ДокументПрием.КраткийСоставДокумента КАК Сотрудники 
ИЗ
	Документ.ПриемНаРаботу КАК ДокументПрием

Если вы добавили новый реквизит в объект, но в динамическом списке используется произвольный запрос, 1С не добавит его в список полей автоматически. Вам необходимо вручную добавить его в секцию ВЫБРАТЬ. Также обратите внимание на галочку Автозаполнение полей — если она снята, то каждое поле должно быть явно описано в запросе.

Причина 3: Использование механизмов БСП (Подключаемые команды)

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

Рассмотрим ситуацию, когда колонка добавляется программно или управляется функциональными опциями. Если в системе выключена какая-то функциональная опция (например, учет по нескольким организациям или специфический кадровый учет), БСП может автоматически скрывать соответствующие колонки в формах.

Проанализируем шаги для проверки:

Причина 4: Пользовательские настройки формы

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

Разберем, как это проверить в режиме «1С:Предприятие»:

  1. В форме списка нажмите кнопку Еще.
  2. Выберите пункт Изменить форму....
  3. В появившемся дереве элементов найдите список и проверьте, стоит ли галочка напротив нужного поля (например, «Сотрудники»).
  4. Если галочка стоит, но данных нет, попробуйте нажать Еще — Установить стандартные настройки в этом же окне.

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

Причина 5: Права доступа (RLS)

Если один пользователь видит сотрудников, а другой — нет, причина кроется в правах доступа. В 1С существует механизм RLS (Record Level Security) — ограничение доступа на уровне записей.

Если поле «Сотрудники» в динамическом списке получается не из простого строкового реквизита, а через соединение с таблицей справочника Сотрудники, то при отсутствии прав на чтение этого справочника система вернет NULL или пустую строку. Рекомендуется проверить права пользователя на чтение всех объектов, участвующих в запросе динамического списка.

Подведем итог: для решения проблемы в первую очередь убедитесь, что строковый реквизит состава заполняется в процедуре ПередЗаписью модуля объекта. Затем проверьте настройки запроса динамического списка и убедитесь, что поле включено в выборку. Эти шаги решают проблему в 90% случаев.

← На главную