Как вывести паспортные данные сотрудника в макет Word (Open Office XML) в 1С:ЗУП 3.1?

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

При работе в 1С:Зарплата и управление персоналом 3.1 пользователи часто сталкиваются с необходимостью кастомизации трудовых договоров. Использование макетов в формате Open Office XML (DOCX) — это удобный способ редактирования шаблонов без изменения конфигурации. Однако стандартный набор полей, доступный в документе Прием на работу, часто ограничен. Одной из самых распространенных проблем является невозможность вывести паспортные данные сотрудника напрямую из доступного списка полей макета.

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

Анализ проблемы: почему полей нет в списке?

Прежде чем переходить к коду, проанализируем ситуацию. В системе 1С данные о документах, удостоверяющих личность, хранятся не в самом справочнике Сотрудники или документе Прием на работу, а в периодическом регистре сведений Документы физических лиц. Механизм печати по шаблонам (DOCX/ODT) (поможет конструктор документов Word по шаблонам из 1С) использует определенную структуру данных, которую подготавливает программный модуль менеджера объекта. Если разработчики фирмы «1С» не включили паспортные данные в структуру ДанныеПечати для конкретного документа, они не появятся в списке доступных полей в редакторе Word.

Способ 1: Использование расширения и добавление реквизита

Один из самых простых и понятных способов — это добавление нового реквизита в документ через расширение конфигурации. Рассмотрим этот метод пошагово:

  1. Создадим расширение для конфигурации ЗУП 3.1.
  2. Добавим в расширение документ ПриемНаРаботу.
  3. Добавим новый реквизит (например, ПаспортныеДанныеДляПечати) с типом Строка (неограниченной длины или достаточно большой, чтобы вместить полное представление).
  4. В модуле объекта или в подписке на событие ПередЗаписью реализуем заполнение этого реквизита.

Разберем пример кода для извлечения данных. Мы воспользуемся встроенными функциями общего модуля КадровыйУчет (полный перечень инструментов содержит справочник методов ЗУП 3.1), который является наиболее правильным инструментом для получения личных данных в ЗУП:


// Пример получения паспортных данных через КадровыйУчет
Данные = "ДокументВид, ДокументСерия, ДокументНомер, ДокументКемВыдан, ДокументКодПодразделения, ДокументДатаВыдачи";
Сведения = КадровыйУчет.КадровыеДанныеСотрудника(Истина, ЭтотОбъект.ФизическоеЛицо, Данные, ЭтотОбъект.Дата);

ПаспортСтрокой = "" + Сведения.ДокументВид + ", серия " + Сведения.ДокументСерия + " № " + Сведения.ДокументНомер 
    + " выдан " + Формат(Сведения.ДокументДатаВыдачи, "ДЛФ=Д") + " г. " + Сведения.ДокументКемВыдан;

ЭтотОбъект.ПаспортныеДанныеДляПечати = ПаспортСтрокой;

После добавления реквизита и его заполнения он автоматически появится в списке доступных полей при редактировании макета Word в пользовательском режиме. Вам останется только перетащить его в нужное место шаблона — для этого подойдёт готовая печатная форма трудового договора в Word.

Способ 2: Использование переопределяемого модуля управления печатью

Более «чистый» с точки зрения архитектуры способ — вмешаться в процесс формирования данных непосредственно перед выводом на печать. Для этого в Библиотеке стандартных подсистем (БСП), на которой построена ЗУП, существует механизм УправлениеПечатьюПереопределяемый (изучить его возможности поможет справочник по методам БСП).

Проанализируем процедуру ПриОпределенииИсточниковДанныхПечати. Этот метод позволяет дополнить структуру данных, передаваемых в макет, без добавления лишних реквизитов в базу данных. Посмотрим на логику реализации:

  1. В расширении создаем программный код, который перехватывает формирование данных для типа документа ПриемНаРаботу (по схожему принципу работает печать Уведомлений об отпуске из Графика отпусков).
  2. Используем функцию КадровыйУчет.ДокументыФизическихЛиц, чтобы получить актуальные сведения на дату документа.

Пример кода для реализации в обработчике:


// Получаем данные физлица на нужную дату
ДанныеФизЛица = КадровыйУчет.ДокументыФизическихЛиц(ОбъектПечати.ФизическоеЛицо, Истина, ОбъектПечати.Дата);

Если ДанныеФизЛица.Количество() > 0 Тогда
    СтрокаПаспорта = "" + ДанныеФизЛица[0].ВидДокумента + ", " 
        + ДанныеФизЛица[0].Серия + " " + ДанныеФизЛица[0].Номер 
        + ", выдан: " + ДанныеФизЛица[0].КемВыдан;
    
    // Вставляем данные в структуру для макета
    ДанныеОбъекта.Вставить("СотрудникПаспорт", СтрокаПаспорта);
КонецЕсли;

Важный нюанс: при использовании этого метода параметр СотрудникПаспорт нужно будет прописать в Word-макете вручную в квадратных скобках: [СотрудникПаспорт], так как система может не увидеть его в конструкторе, если он не описан в метаданных.

Способ 3: Получение данных через запрос (для сложных случаев)

Иногда требуется получить данные не одной строкой, а отдельными компонентами (только серия, только номер и т.д.). В этом случае выясним причину использования прямых запросов к регистру. Это позволяет максимально гибко управлять форматированием данных в макете.

Рассмотрим пример функции, которую можно разместить в модуле менеджера или в расширении:


Функция ПолучитьПредставлениеПаспорта(ФизЛицо, ДатаСведений) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ДокументыФизическихЛиц.ВидДокумента.Наименование КАК Вид,
        |	ДокументыФизическихЛиц.Серия КАК Серия,
        |	ДокументыФизическихЛиц.Номер КАК Номер,
        |	ДокументыФизическихЛиц.ДатаВыдачи КАК ДатаВыдачи,
        |	ДокументыФизическихЛиц.КемВыдан КАК КемВыдан
        |ИЗ
        |	РегистрСведений.ДокументыФизическихЛиц.СрезПоследних(&ДатаСведений, Физлицо = &Физлицо) КАК ДокументыФизическихЛиц";
    
    Запрос.УстановитьПараметр("ДатаСведений", ДатаСведений);
    Запрос.УстановитьПараметр("Физлицо", ФизЛицо);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Возврат СтрШаблон("%1, серия %2 № %3, выдан %4, %5", 
            Выборка.Вид, Выборка.Серия, Выборка.Номер, Формат(Выборка.ДатаВыдачи, "ДЛФ=Д"), Выборка.КемВыдан);
    КонецЕсли;
    
    Возврат "";
КонецФункции

Полезные советы по работе с макетами Word

При разработке и внедрению паспортных данных в печатные формы рекомендуем придерживаться следующих правил:

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

← На главную