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