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