Как программно заполнить колонку Сумма на руки в документе Данные для расчета зарплаты в 1С:ЗУП 3.1

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

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

Рассмотрим подробнее ситуацию, когда нам нужно перенести данные из внешнего файла (например, Excel) в колонку Сумма на руки для начислений, рассчитываемых «от обратного». Выясним, как устроена структура документа «под капотом» и какими методами можно заполнить его табличные части так, чтобы данные корректно отобразились в интерфейсе пользователя.

Разбор структуры документа и поиск нужных показателей

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

Проанализируем состав основных табличных частей документа:

  1. ФизическиеЛица — здесь перечисляются сотрудники, по которым вводятся данные.
  2. ЗначенияПоказателей — здесь хранятся сами числовые данные. Каждая строка этой ТЧ связана с конкретным сотрудником и конкретным показателем.

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

Реализация заполнения через объект документа

Рассмотрим пример кода, который позволяет заполнить документ данными из таблицы значений (например, полученной из Excel). Основная задача здесь — синхронно заполнить обе табличные части. Обратите внимание на использование колонки ИдентификаторСтроки: она критически важна для связи данных о сотруднике и его показателях.


// Предположим, у нас есть ТаблицаСотрудников с колонками: Сотрудник, Физлицо, Сумма
// ПоказательСсылка - ссылка на элемент справочника ПоказателиРасчетаЗарплаты (Сумма на руки)

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

Проблема обновления данных на форме

Многие разработчики сталкиваются с тем, что после выполнения кода по заполнению табличных частей на открытой форме документа ничего не меняется или отображаются старые данные. Это происходит потому, что данные в оперативной памяти (в объекте Объект на форме) и визуальное представление в динамических колонках не синхронизируются автоматически при прямом обращении к ТЧ.

Самый простой, но «грубый» способ — это записать документ в базу и перечитать его. Однако это неудобно для пользователя, который хочет проверить данные перед сохранением. Правильный подход заключается в использовании механизма преобразования данных формы в объект и обратно.

Разберем, как обновить форму «на лету» без принудительной записи в базу данных:


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

Использование метода ЗначениеВДанныеФормы заставляет платформу перестроить динамические колонки на форме, и пользователь сразу увидит внесенные изменения в колонке Сумма на руки.

Лучшая практика: Использование внешней обработки заполнения

Проанализируем еще один эффективный метод — подключение вашей логики как Дополнительной обработки заполнения объекта. В этом случае пользователю достаточно будет нажать кнопку «Заполнить» в самом документе.

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

Основные преимущества этого метода:

Важное замечание про расчет Gross (начисление сверху)

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

Таким образом, для успешного заполнения колонки «Сумма на руки» необходимо работать с ТЧ ЗначенияПоказателей, обеспечивать связь с ТЧ ФизическиеЛица через идентификаторы строк и использовать методы ДанныеФормыВЗначение / ЗначениеВДанныеФормы для актуализации интерфейса.

← На главную