Как вывести дополнительные начисления в форму списка сотрудников 1С:ERP 2 и почему они могут не отображаться

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

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

Анализ структуры данных динамического списка сотрудников

Прежде всего, разберем, как устроена форма списка сотрудников в типовых решениях. В отличие от простых справочников, список сотрудников в ERP строится на сложном динамическом списке, который объединяет данные из нескольких источников для обеспечения высокой производительности подбора и поиска. Основным источником данных здесь выступает не сам справочник Сотрудники, а регистр сведений ДанныеДляПодбораСотрудников.

Проанализируем стандартный запрос динамического списка. В нем активно используются левые соединения с кадровыми регистрами и регистрами состояния. Рассмотрим фрагмент типового запроса, который служит фундаментом для вывода информации:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Сотрудники.Ссылка КАК Ссылка,
    Сотрудники.Код КАК Код,
    Сотрудники.Наименование КАК Наименование,
    ДанныеДляПодбора.Подразделение КАК Подразделение,
    ДанныеДляПодбора.Должность КАК Должность,
    ДанныеОбОплатеТрудаДляПодбора.ФОТ КАК ФОТ,
    ДанныеОбОплатеТрудаДляПодбора.ТарифнаяСтавка КАК ТарифнаяСтавка
ИЗ
    РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбора
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
        ПО ДанныеДляПодбора.Сотрудник = Сотрудники.Ссылка
        {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеОбОплатеТрудаДляПодбораСотрудников КАК ДанныеОбОплатеТрудаДляПодбора
        ПО ДанныеДляПодбора.Сотрудник = ДанныеОбОплатеТрудаДляПодбора.Сотрудник}

Интеграция дополнительных показателей расчета зарплаты

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

Рассмотрим дополненный вариант запроса, где мы подключаем таблицу показателей:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    // ... стандартные поля ...
    ЗначенияПоказателейСрезПоследних.Значение КАК ДопНачисления,
    ДанныеДляПодбора.МестоВСтруктуреПредприятия КАК МестоВСтруктуреПредприятия
ИЗ
    РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбора
    // ... стандартные соединения ...
    {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.СрезПоследних КАК ЗначенияПоказателейСрезПоследних
    ПО ДанныеДляПодбора.Сотрудник = ЗначенияПоказателейСрезПоследних.Сотрудник
        И (ЗначенияПоказателейСрезПоследних.Период <= &ДатаОкончания)
        И (ЗначенияПоказателейСрезПоследних.ДействуетДо >= &ДатаНачалаСведений
            ИЛИ ЗначенияПоказателейСрезПоследних.ДействуетДо = ДАТАВРЕМЯ(1, 1, 1))}

Важный технический нюанс: при соединении с регистром периодических показателей необходимо учитывать, что у одного сотрудника может быть несколько разных показателей (например, «Оклад», «Процент надбавки» и т.д.). Если не наложить фильтр по конкретному показателю в условии связи или в параметрах виртуальной таблицы, динамический список может начать «дублировать» строки сотрудников. Проанализируем ситуацию: если у сотрудника 3 активных показателя, в списке он появится 3 раза. Чтобы этого избежать, всегда добавляйте условие по ссылке на конкретный показатель из справочника ПоказателиРасчетаЗарплаты.

Почему колонка не отображается: основные причины и решения

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

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

Рекомендации по правильной доработке

Чтобы ваша доработка не «слетела» при первом же обновлении системы и работала стабильно, придерживайтесь следующих правил:

Во-первых, используйте механизм расширений. Вместо правки типовой формы «в лоб», создайте расширение и используйте обработчик &После("ПриСозданииНаСервере"). В этом обработчике вы можете программно проверить текущий текст запроса списка и добавить в него свои соединения и поля. Рассмотрим пример кода для добавления поля программно:


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

Во-вторых, обратите внимание на регистр ДанныеОбОплатеТрудаДляПодбораСотрудников. Если вам нужно выводить данные о доходах массово для всех сотрудников, правильнее будет расширить состав этого регистра (добавить в него новый ресурс), обеспечить его заполнение при кадровых изменениях, и тогда данные в списке сотрудников будут появляться «сами собой» через стандартный механизм, без тяжелых соединений со срезами последних в динамическом списке.

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

← На главную