При работе в 1С:Зарплата и управление персоналом 3.1 пользователи часто сталкиваются с необходимостью кастомизации трудовых договоров. Использование макетов в формате Open Office XML (DOCX) — это удобный способ редактирования шаблонов без изменения конфигурации. Однако стандартный набор полей, доступный в документе Прием на работу, часто ограничен. Одной из самых распространенных проблем является невозможность вывести паспортные данные сотрудника напрямую из доступного списка полей макета.
В этой статье мы подробно разберем, почему паспортные данные не попадают в макет «из коробки», и рассмотрим несколько способов решения этой задачи с помощью инструментов разработки, чтобы вы могли реализовать, например, печать соглашения о неразглашении из документа Прием на работу.
Прежде чем переходить к коду, проанализируем ситуацию. В системе 1С данные о документах, удостоверяющих личность, хранятся не в самом справочнике Сотрудники или документе Прием на работу, а в периодическом регистре сведений Документы физических лиц. Механизм печати по шаблонам (DOCX/ODT) (поможет конструктор документов Word по шаблонам из 1С) использует определенную структуру данных, которую подготавливает программный модуль менеджера объекта. Если разработчики фирмы «1С» не включили паспортные данные в структуру ДанныеПечати для конкретного документа, они не появятся в списке доступных полей в редакторе Word.
Один из самых простых и понятных способов — это добавление нового реквизита в документ через расширение конфигурации. Рассмотрим этот метод пошагово:
ПриемНаРаботу.ПаспортныеДанныеДляПечати) с типом Строка (неограниченной длины или достаточно большой, чтобы вместить полное представление).ПередЗаписью реализуем заполнение этого реквизита.Разберем пример кода для извлечения данных. Мы воспользуемся встроенными функциями общего модуля КадровыйУчет (полный перечень инструментов содержит справочник методов ЗУП 3.1), который является наиболее правильным инструментом для получения личных данных в ЗУП:
// Пример получения паспортных данных через КадровыйУчет
Данные = "ДокументВид, ДокументСерия, ДокументНомер, ДокументКемВыдан, ДокументКодПодразделения, ДокументДатаВыдачи";
Сведения = КадровыйУчет.КадровыеДанныеСотрудника(Истина, ЭтотОбъект.ФизическоеЛицо, Данные, ЭтотОбъект.Дата);
ПаспортСтрокой = "" + Сведения.ДокументВид + ", серия " + Сведения.ДокументСерия + " № " + Сведения.ДокументНомер
+ " выдан " + Формат(Сведения.ДокументДатаВыдачи, "ДЛФ=Д") + " г. " + Сведения.ДокументКемВыдан;
ЭтотОбъект.ПаспортныеДанныеДляПечати = ПаспортСтрокой;
После добавления реквизита и его заполнения он автоматически появится в списке доступных полей при редактировании макета Word в пользовательском режиме. Вам останется только перетащить его в нужное место шаблона — для этого подойдёт готовая печатная форма трудового договора в Word.
Более «чистый» с точки зрения архитектуры способ — вмешаться в процесс формирования данных непосредственно перед выводом на печать. Для этого в Библиотеке стандартных подсистем (БСП), на которой построена ЗУП, существует механизм УправлениеПечатьюПереопределяемый (изучить его возможности поможет справочник по методам БСП).
Проанализируем процедуру ПриОпределенииИсточниковДанныхПечати. Этот метод позволяет дополнить структуру данных, передаваемых в макет, без добавления лишних реквизитов в базу данных. Посмотрим на логику реализации:
ПриемНаРаботу (по схожему принципу работает печать Уведомлений об отпуске из Графика отпусков).КадровыйУчет.ДокументыФизическихЛиц, чтобы получить актуальные сведения на дату документа.Пример кода для реализации в обработчике:
// Получаем данные физлица на нужную дату
ДанныеФизЛица = КадровыйУчет.ДокументыФизическихЛиц(ОбъектПечати.ФизическоеЛицо, Истина, ОбъектПечати.Дата);
Если ДанныеФизЛица.Количество() > 0 Тогда
СтрокаПаспорта = "" + ДанныеФизЛица[0].ВидДокумента + ", "
+ ДанныеФизЛица[0].Серия + " " + ДанныеФизЛица[0].Номер
+ ", выдан: " + ДанныеФизЛица[0].КемВыдан;
// Вставляем данные в структуру для макета
ДанныеОбъекта.Вставить("СотрудникПаспорт", СтрокаПаспорта);
КонецЕсли;
Важный нюанс: при использовании этого метода параметр СотрудникПаспорт нужно будет прописать в Word-макете вручную в квадратных скобках: [СотрудникПаспорт], так как система может не увидеть его в конструкторе, если он не описан в метаданных.
Иногда требуется получить данные не одной строкой, а отдельными компонентами (только серия, только номер и т.д.). В этом случае выясним причину использования прямых запросов к регистру. Это позволяет максимально гибко управлять форматированием данных в макете.
Рассмотрим пример функции, которую можно разместить в модуле менеджера или в расширении:
Функция ПолучитьПредставлениеПаспорта(ФизЛицо, ДатаСведений) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокументыФизическихЛиц.ВидДокумента.Наименование КАК Вид,
| ДокументыФизическихЛиц.Серия КАК Серия,
| ДокументыФизическихЛиц.Номер КАК Номер,
| ДокументыФизическихЛиц.ДатаВыдачи КАК ДатаВыдачи,
| ДокументыФизическихЛиц.КемВыдан КАК КемВыдан
|ИЗ
| РегистрСведений.ДокументыФизическихЛиц.СрезПоследних(&ДатаСведений, Физлицо = &Физлицо) КАК ДокументыФизическихЛиц";
Запрос.УстановитьПараметр("ДатаСведений", ДатаСведений);
Запрос.УстановитьПараметр("Физлицо", ФизЛицо);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат СтрШаблон("%1, серия %2 № %3, выдан %4, %5",
Выборка.Вид, Выборка.Серия, Выборка.Номер, Формат(Выборка.ДатаВыдачи, "ДЛФ=Д"), Выборка.КемВыдан);
КонецЕсли;
Возврат "";
КонецФункции
При разработке и внедрению паспортных данных в печатные формы рекомендуем придерживаться следующих правил:
ДанныеОбъекта помните, что имена полей в Word-шаблоне (внутри квадратных скобок) чувствительны к регистру.Таким образом, мы выяснили, что отсутствие паспортных данных в макетах ЗУП — это не ошибка, а особенность оптимизации системы. С помощью расширений или программных функций общего модуля КадровыйУчет вы можете легко дополнить печатную форму любыми необходимыми сведениями.