Как добавить и сохранить свою колонку в табличной части документа «Начисление зарплаты и взносов» в 1С:ЗУП 3.1?

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

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

Выясним причину: почему очищается табличная часть?

Разберем внутреннее устройство документа. НачислениеЗарплатыИВзносов — это основной «двигатель» расчета зарплаты. В отличие от простых документов в других конфигурациях, табличные части здесь управляются программным модулем расчета. Когда вы меняете сотрудника, подразделение или нажимаете кнопку «Пересчитать», система не просто обновляет значения в полях — она полностью перезаполняет строки.

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

Метод 1. Использование механизма «Показатели расчета зарплаты» (Штатный способ)

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

  1. Перейдем в меню Настройка — Показатели расчета зарплаты.
  2. Создадим новый показатель, например, НомерЗаказа.
  3. В настройках укажем: «Для сотрудника», «Используется только в месяце, в котором вводится значение (разовое использование)» и «Вводится непосредственно в документе начисления».
  4. Включим этот показатель в формулу любого начисления, которое используется у сотрудников. Даже если этот показатель не должен влиять на сумму, его можно добавить в формулу как + НомерЗаказа * 0.

После этих манипуляций система сама добавит колонку в табличную часть Начисления. Главный плюс этого метода в том, что 1С будет сама следить за сохранением этого значения, так как оно становится частью официального расчетного механизма. Данные будут записываться в регистры расчета и не пропадут при пересчетах.

Метод 2. Расширение конфигурации с кэшированием данных

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

Рассмотрим алгоритм реализации в расширении:

  1. Создадим расширение и добавим в него документ НачислениеЗарплатыИВзносов с нужной табличной частью.
  2. Добавим в ТЧ реквизит НомерЗаказа.
  3. Найдем в общем модуле или модуле формы процедуру, отвечающую за начало пересчета (например, работа с общим модулем РасчетЗарплатыРасширенныйКлиент). Нам нужно перехватить момент перед вызовом ОчиститьСписокСотрудниковКРасчету.

Посмотрим на пример логики, которую необходимо реализовать (схематично):


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

Затем, после завершения типового заполнения (аннотация &После), нам нужно пройтись по новой табличной части и, сопоставляя строки по сотруднику и виду расчета, вернуть значения из нашего кэша обратно в колонку НомерЗаказа.

Метод 3. Использование справочника «Территории» или «Условия труда»

Проанализируем еще один интересный способ, который часто используют опытные внедренцы. В ЗУП 3.1 есть штатный механизм учета работ на разных территориях. Если в настройках состава начислений включить использование обособленных территорий, в табличной части начислений появится колонка Территория.

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

Важный нюанс: проведение документа

Если вы все же решили идти путем добавления своего реквизита в ТЧ через расширение, помните о регистрах. Мало видеть данные в документе — их нужно «провести». Выясним, что для этого нужно:

Данные из табличной части документа НачислениеЗарплатыИВзносов при проведении должны попадать в Регистр расчета «Начисления». Вам необходимо:

  1. Добавить аналогичный реквизит НомерЗаказа в регистр расчета Начисления через расширение.
  2. В расширении модуля объекта документа перехватить процедуру ОбработкаПроведения (или соответствующие процедуры в общих модулях формирования движений), чтобы значение из документа перетекало в запись регистра.

Без этого шага ваш «Номер заказа» останется просто декоративным полем, которое нельзя будет вытянуть ни в один отчет, так как отчеты в ЗУП строятся не по документам, а по регистрам.

Резюме

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

← На главную