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