Как добавить произвольную колонку в динамический список справочника Сотрудники в КА 2.4 и ЗУП 3.1

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

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

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

Почему стандартный подход не работает

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

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

При создании формы на сервере срабатывает цепочка процедур, которая полностью перезаписывает свойство ТекстЗапроса вашего динамического списка. Система буквально собирает SQL-запрос «по кирпичикам», и все ваши правки, сделанные в визуальном редакторе конфигуратора, просто игнорируются.

Где искать логику формирования запроса

Проанализируем структуру общих модулей. Основная магия происходит в модулях, названия которых начинаются на СотрудникиФормы. Нам наиболее интересны следующие:

  1. СотрудникиФормы — общие методы для работы с формами.
  2. СотрудникиФормыВнутренний — внутренняя логика подсистемы.
  3. СотрудникиФормыРасширенный — именно здесь находятся функции, которые возвращают фрагменты текста запроса.

Как подсказывают опытные разработчики, ключевой точкой входа является функция ТекстыЗапросовФормыВыбораСотрудников. Она возвращает структуру, содержащую части запроса, которые потом объединяются в итоговый текст.

Решение проблемы через расширение

Рассмотрим пошагово, как добавить свою колонку (например, какой-то дополнительный реквизит или данные из регистра) в список сотрудников.

Шаг 1. Создание расширения и захват модуля.
Создаем новое расширение, добавляем в него общий модуль СотрудникиФормыРасширенный. Нам нужно перехватить функцию ТекстыЗапросовФормыВыбораСотрудников.

Шаг 2. Модификация функции.
Для того чтобы добавить свое поле, лучше всего использовать аннотацию &После. Посмотрим на пример кода, который модифицирует структуру запроса:


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

Важный нюанс: В реальных условиях запрос может быть очень сложным. Рекомендуется не просто использовать СтрЗаменить, а внимательно изучить структуру Параметры и того, что возвращает Результат. Часто в структуре Результат есть отдельные ключи для полей выбора, условий и соединений.

Работа с регистром «Текущие кадровые данные сотрудников»

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

Если ваша задача — вывести данные, которые уже есть в этом регистре, но не отображаются в списке, вам нужно убедиться, что они включены в запрос в модуле СотрудникиФормыВнутренний в процедуре, отвечающей за описание полей (поищите процедуры со словом СведенияОПоляхСписка).

Как вывести колонку на форму в расширении

После того как мы программно изменили запрос, нам нужно, чтобы платформа «увидела» это поле и позволила разместить его на форме.

  1. Добавьте форму списка справочника Сотрудники в расширение.
  2. В дереве элементов формы найдите динамический список Список.
  3. Вручную добавьте поле в список ПутьКДанным которого будет соответствовать вашему псевдониму из запроса (например, Список.МойСпецРеквизит).
  4. Перетащите это поле в элементы формы (в таблицу списка).

Обратите внимание на типизацию: Если вы используете сложные выражения в ВЫБОР КОГДА..., система может не определить тип поля. В этом случае в расширении в настройках динамического списка (вкладка "Настройка списка" -> "Поля") принудительно укажите тип данных для вашего нового поля.

Что делать, если колонка все равно не появилась?

Если вы выполнили все действия, но в режиме «1С:Предприятие» колонка не отображается, разберем возможные причины:

1. Оптимизация динамического списка.
Платформа 1С очень «умная»: если она видит, что поле не выведено на экран и не используется в группировках или отборах, она просто исключает его из итогового SQL-запроса для экономии ресурсов. Чтобы принудительно заставить систему читать данные, можно программно добавить поле в коллекцию выбранных полей:


ЭлементПоля = Список.ВыбранныеПоля.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ЭлементПоля.Поле = Новый ПолеКомпоновкиДанных("МойСпецРеквизит");
ЭлементПоля.Использование = Истина;

2. Сохраненные настройки пользователя.
Это самая частая причина «невидимости» новых колонок. 1С сохраняет настройки формы для каждого пользователя. Если пользователь раньше открывал эту форму, его старые настройки (где вашей колонки еще не было) имеют приоритет.
Решение: Зайдите в меню «Ещё» -> «Изменить форму» и нажмите кнопку «Установить стандартные настройки».

3. Функциональные опции.
Проверьте, не обернуто ли ваше поле в конфигурации какими-либо функциональными опциями. В расширении иногда требуется явно указать, что видимость поля не зависит от опций, если вы хотите показывать его всегда.

Резюме

Для успешного добавления колонки в список сотрудников в КА 2.4 / ЗУП 3.1 недостаточно визуальных правок. Необходимо использовать расширение для модификации функции ТекстыЗапросовФормыВыбораСотрудников в общем модуле СотрудникиФормыРасширенный. Только изменив структуру, которую возвращает этот метод, вы сможете гарантировать, что ваш запрос не будет перезаписан стандартными механизмами системы при создании формы.

← На главную