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