Как добавить и отобразить новый реквизит в форме списка справочника «Сотрудники» в ЗУП 3.1

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

При работе с конфигурацией «Зарплата и управление персоналом», редакция 3.1, программисты часто сталкиваются с ситуацией, когда стандартные методы добавления реквизитов на форму не приносят результата. Вы добавляете реквизит в объект, меняете запрос динамического списка в конструкторе формы, выносите поле на форму, но в пользовательском режиме колонка так и не появляется. В этой статье мы разберем, почему это происходит и как правильно решить задачу двумя способами: без программирования и с помощью расширения конфигурации.

Почему реквизит не отображается стандартным способом?

Проанализируем архитектуру ЗУП 3.1. В отличие от простых конфигураций, форма списка справочника Сотрудники является крайне сложным объектом. Текст запроса динамического списка здесь не статичен — он формируется программно «на лету» при открытии формы. Для этого система использует метод УстановитьЗапросДинамическогоСписка.

Даже если вы внесли изменения в запрос через визуальный конструктор, при запуске код конфигурации полностью перезаписывает этот запрос своим текстом. Следовательно, ваш добавленный реквизит просто исчезает из выборки. Рассмотрим подробнее, как обойти это ограничение.

Вариант 1. Использование дополнительных реквизитов (без кода)

Прежде чем приступать к разработке, выясним, обязательно ли менять структуру конфигурации. В ЗУП 3.1 предусмотрен мощный механизм Дополнительных реквизитов и сведений. Это наиболее предпочтительный метод для добавления строковых, числовых или ссылочных данных.

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

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

Вариант 2. Программное добавление через расширение

Если задача требует именно добавления физического реквизита в базу данных, нам придется вмешаться в процесс программного формирования запроса. Разберем по шагам, как это сделать правильно через расширение.

Основная логика сборки запроса сосредоточена в общем модуле СотрудникиФормыРасширенный. Нам необходимо перехватить формирование текста запроса в функции ЗапросДинамическогоСписка. Рассмотрим пример кода для расширения:


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

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


&После("ПриСозданииНаСервере")
Процедура Мой_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Добавляем элемент формы программно, если его еще нет
    Если Элементы.Найти("МойНовыйРеквизит") = Неопределено Тогда
        НовыйЭлемент = Элементы.Добавить("МойНовыйРеквизит", Тип("ПолеФормы"), Элементы.Список);
        НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
        НовыйЭлемент.ПутьКДанным = "Список.МойНовыйРеквизит";
        НовыйЭлемент.Заголовок = "Мой реквизит";
    КонецЕсли;
КонецПроцедуры

Почему реквизит все равно может быть не виден?

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

Итоги

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

← На главную