При разработке и адаптации типовых конфигураций (таких как 1С:Зарплата и управление персоналом 3.1 или 1С:ERP) разработчики часто сталкиваются с задачей отображения дополнительной информации в форме списка справочника Сотрудники — например, данных о лицевых счетах, текущих тарифных ставках или кадровых срезах. Однако стандартное редактирование запроса динамического списка в визуальном конструкторе конфигуратора не дает результата: добавленные поля не появляются на форме в режиме предприятия.
Рассмотрим подробнее, почему так происходит, как устроена архитектура динамических списков в ЗУП 3.1 и каким образом правильно вывести необходимые данные на форму.
В конфигурациях на базе БСП и подсистемы кадрового учета текст запроса для ключевых справочников формируется динамически в программном коде. Запрос, настроенный в конфигураторе в свойствах динамического списка, при открытии формы полностью перезаписывается платформой.
Проанализируем цепочку вызовов:
ПриСозданииНаСервере.СотрудникиФормыРасширенный, СотрудникиФормыБазовый), где в специализированных функциях (например, ТекстыЗапросовФормыВыбораСотрудников) программно собирается итоговый текст запроса с учетом текущих отборов, настроек видимости и прав доступа.ПутьКДанным, указывающим на Список.ИмяПоля, поле становится доступным только в отборах и условном оформлении, но в самой таблице не отображается.Разберем по шагам наиболее корректный способ добавления данных из регистра сведений (например, РегистрСведений.ЛицевыеСчетаСотрудников) с использованием механизма расширений.
Сотрудники в расширение конфигурации.ПриСозданииНаСервере с директивой &После.Список.ТекстЗапроса, добавив ЛЕВОЕ СОЕДИНЕНИЕ с нужным регистром сведений.Посмотрим на пример реализации кода в обработчике формы расширения:
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Получаем текущий текст запроса, сформированный типовыми механизмами
ТекстЗапроса = Список.ТекстЗапроса;
// Добавляем соединение с регистром сведений
ТекстСоединения =
"ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЛицевыеСчетаСотрудников.СрезПоследних(&ПериодСреза, ) КАК ЛицевыеСчета
ПО (ЛицевыеСчета.ФизическоеЛицо = Список.ФизическоеЛицо)";
// Встраиваем выборку поля и соединение в запрос списка
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ", "ВЫБРАТЬ ЛицевыеСчета.НомерЛицевогоСчета КАК НомерЛицевогоСчета,");
ТекстЗапроса = ТекстЗапроса + " " + ТекстСоединения;
Список.ТекстЗапроса = ТекстЗапроса;
// Устанавливаем параметры динамического списка
Список.Параметры.УстановитьЗначениеПараметра("ПериодСреза", ТекущаяДатаСеанса());
// Создаем элемент формы для отображения данных
Если Элементы.Найти("СписокНомерЛицевогоСчета") = Неопределено Тогда
НоваяКолонка = Элементы.Добавить("СписокНомерЛицевогоСчета", Тип("ПолеФормы"), Элементы.Список);
НоваяКолонка.Вид = ВидПоляФормы.ПолеНадписи;
НоваяКолонка.ПутьКДанным = "Список.НомерЛицевогоСчета";
НоваяКолонка.Заголовок = "Номер лицевого счета";
КонецЕсли;
КонецПроцедуры
При модификации запросов динамических списков необходимо учитывать следующие ограничения платформы 1С:Предприятие:
ОсновнаяТаблица (для списка сотрудников — Справочник.Сотрудники). Если основная таблица не задана, платформа отключает динамическое считывание данных порциями, что приводит к полной выборке всех записей и критическому замедлению открытия формы.Если нет необходимости выполнять сортировку или отбор по данным регистра непосредственно в общем списке, можно использовать альтернативные методы:
ПриАктивизацииСтроки таблицы сотрудников и вывод информации в отдельную надпись или панель под списком. Это полностью исключает утяжеление запроса динамического списка.