Как вывести данные из регистра сведений в динамический список справочника «Сотрудники» в 1С:ЗУП 3.1?

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

При разработке и адаптации типовых конфигураций (таких как 1С:Зарплата и управление персоналом 3.1 или 1С:ERP) разработчики часто сталкиваются с задачей отображения дополнительной информации в форме списка справочника Сотрудники — например, данных о лицевых счетах, текущих тарифных ставках или кадровых срезах. Однако стандартное редактирование запроса динамического списка в визуальном конструкторе конфигуратора не дает результата: добавленные поля не появляются на форме в режиме предприятия.

Рассмотрим подробнее, почему так происходит, как устроена архитектура динамических списков в ЗУП 3.1 и каким образом правильно вывести необходимые данные на форму.

Выясним причину: архитектурные особенности формы списка сотрудников

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

Проанализируем цепочку вызовов:

  1. При открытии формы срабатывает событие ПриСозданииНаСервере.
  2. Вызываются процедуры общих модулей (в частности, СотрудникиФормыРасширенный, СотрудникиФормыБазовый), где в специализированных функциях (например, ТекстыЗапросовФормыВыбораСотрудников) программно собирается итоговый текст запроса с учетом текущих отборов, настроек видимости и прав доступа.
  3. Если поле добавлено только в окне редактирования реквизита в конфигураторе, оно затирается сгенерированным кодом запроса.
  4. Если же поле добавлено в запрос, но для него не создан элемент пользовательского интерфейса (колонка таблицы) со свойством ПутьКДанным, указывающим на Список.ИмяПоля, поле становится доступным только в отборах и условном оформлении, но в самой таблице не отображается.

Пошаговое решение: переопределение запроса через расширение

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

  1. Добавим форму списка справочника Сотрудники в расширение конфигурации.
  2. Создадим обработчик события ПриСозданииНаСервере с директивой &После.
  3. В коде обработчика модифицируем свойство Список.ТекстЗапроса, добавив ЛЕВОЕ СОЕДИНЕНИЕ с нужным регистром сведений.
  4. Если данные среза зависят от даты, программно передадим параметр периода в динамический список.
  5. Добавим визуальную колонку на форму программно или интерактивно.

Посмотрим на пример реализации кода в обработчике формы расширения:


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

Важные технические нюансы и оптимизация

При модификации запросов динамических списков необходимо учитывать следующие ограничения платформы 1С:Предприятие:

  1. Свойство «Основная таблица»: Убедимся, что у динамического списка заполнено свойство ОсновнаяТаблица (для списка сотрудников — Справочник.Сотрудники). Если основная таблица не задана, платформа отключает динамическое считывание данных порциями, что приводит к полной выборке всех записей и критическому замедлению открытия формы.
  2. Производительность соединений: Использование срезов последних на произвольную дату в динамическом списке создает дополнительную нагрузку на СУБД. По возможности соединяйте список с физической таблицей регистра или срезом без параметров, если логика структуры данных это позволяет.
  3. Ограничения прав доступа (RLS): Если у пользователя нет прав на чтение присоединяемого регистра сведений, открытие формы может завершиться ошибкой нарушения прав доступа. Необходимо убедиться, что соответствующие роли назначены профилям пользователей.
  4. Сброс настроек формы: Если после добавления кода поле не отображается в режиме 1С:Предприятие, пользователю необходимо выполнить команду Еще – Установить стандартные настройки, чтобы сбросить закешированное пользовательское состояние колонок формы.

Альтернативные варианты вывода информации

Если нет необходимости выполнять сортировку или отбор по данным регистра непосредственно в общем списке, можно использовать альтернативные методы:

  1. Контекстная информационная панель: Считывание данных регистра в событии ПриАктивизацииСтроки таблицы сотрудников и вывод информации в отдельную надпись или панель под списком. Это полностью исключает утяжеление запроса динамического списка.
  2. Механизм дополнительных реквизитов и сведений: Если данные хранятся как дополнительные сведения БСП, их можно вывести в список штатно через интерфейс Еще – Изменить форму без изменения программного кода.
← На главную