Как вывести паспортные данные контрагента (физлица) на печатную форму в 1С

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

При формировании печатных форм договоров, актов или счетов в 1С:Управление торговлей (УТ 11), ERP или Комплексной автоматизации часто возникает необходимость вывести паспортные данные контрагента, если он является физическим лицом или индивидуальным предпринимателем. В отличие от простых реквизитов, таких как ИНН или адрес, паспортные данные хранятся в специальном регистре сведений, что требует особого подхода к их извлечению. Рассмотрим подробно, как решить эту задачу несколькими способами. В качестве альтернативного варианта для быстрого внедрения можно использовать печатную форму согласия на обработку персональных данных, где вывод необходимых реквизитов физлица уже настроен.

Понимание структуры хранения данных

Прежде всего, проанализируем, где именно в системе хранятся нужные нам сведения. В современных конфигурациях паспортные данные не привязаны напрямую к справочнику Контрагенты. Они хранятся в регистре сведений ДокументыФизическихЛиц. При этом запись в регистре привязывается к элементу справочника ФизическиеЛица.

Таким образом, наша цепочка действий должна быть следующей:

  1. Найти ссылку на физическое лицо, связанное с контрагентом.
  2. Обратиться к регистру сведений за актуальной записью о документе (паспорте).
  3. Получить конкретные поля: серию, номер, дату выдачи и кем выдан документ.
  4. Передать эти данные в параметры макета печатной формы.

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

Этот метод является классическим и наиболее гибким. Мы будем использовать виртуальную таблицу СрезПоследних, чтобы получить самую актуальную информацию на дату формирования документа. Рассмотрим пример запроса, который можно вставить в процедуру формирования печатной формы.

Разберем программный код:


// Предположим, что СсылкаНаФизЛицо — это полученная ранее ссылка на элемент справочника ФизическиеЛица
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ДокументыФизическихЛицСрезПоследних.Серия КАК Серия,
    |	ДокументыФизическихЛицСрезПоследних.Номер КАК Номер,
    |	ДокументыФизическихЛицСрезПоследних.ДатаВыдачи КАК ДатаВыдачи,
    |	ДокументыФизическихЛицСрезПоследних.КемВыдан КАК КемВыдан
    |ИЗ
    |	РегистрСведений.ДокументыФизическихЛиц.СрезПоследних(&Период, ФизЛицо = &ФизЛицо И ВидДокумента = &ВидДокумента) КАК ДокументыФизическихЛицСрезПоследних";

Запрос.УстановитьПараметр("Период", ТекущаяДата()); // Или дата документа
Запрос.УстановитьПараметр("ФизЛицо", СсылкаНаФизЛицо);
Запрос.УстановитьПараметр("ВидДокумента", Справочники.ВидыДокументовФизическихЛиц.ПаспортРФ);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
    // Формируем строку представления или заполняем параметры макета напрямую
    ПаспортныеДанные = "Паспорт: серия " + Выборка.Серия + " № " + Выборка.Номер + ", выдан " + Выборка.КемВыдан + " " + Формат(Выборка.ДатаВыдачи, "ДФ=dd.MM.yyyy");
КонецЕсли;

В данном примере мы используем параметр ВидДокумента. Это критически важный момент, так как у одного физического лица в базе могут быть заведены разные документы: загранпаспорт, водительское удостоверение, свидетельство о рождении и т.д. Если не указать фильтр по виду документа ПаспортРФ, запрос может вернуть данные не того документа.

Способ 2: Использование встроенных функций конфигурации (УТ 11, ERP)

Если вы работаете в конфигурации, использующей Библиотеку стандартных подсистем (БСП) или специфические модули УТ 11, профессиональнее будет использовать готовые функции. Это упрощает код и делает его более устойчивым к изменениям структуры регистра в будущем.

Проанализируем пример использования функции из общего модуля ФизическиеЛицаУТ:


// Получаем структуру данных документа через встроенный механизм
ДокументФизЛица = ФизическиеЛицаУТ.ПолучитьДокументФизическогоЛицаПоУмолчанию(СсылкаНаФизЛицо, Справочники.ВидыДокументовФизическихЛиц.ПаспортРФ);

// Если документ найден, мы можем получить его готовое текстовое представление
Если ДокументФизЛица <> Неопределено Тогда
    ПаспортныеДанные = ДокументФизЛица.Представление; 
    // Представление обычно уже содержит склеенную строку: "Паспорт РФ серия... номер... выдан..."
КонецЕсли;

Этот метод хорош тем, что система сама заботится о правильном форматировании строки. Вам не нужно вручную проверять, пустая ли серия или заполнена ли дата выдачи.

Как правильно найти связь между Контрагентом и Физлицом

Часто программисты допускают ошибку, пытаясь найти реквизит ФизЛицо непосредственно у контрагента. В УТ 11 структура данных может быть сложнее. Рассмотрим, как надежно получить ссылку на физическое лицо:

  1. Если Контрагент является физическим лицом (проверяется через реквизит ЮрФизЛицо), то в конфигурациях типа УТ 11 у него обычно есть реквизит Партнер.
  2. У Партнера, в свою очередь, есть признак ФизическоеЛицо.
  3. Однако чаще всего в коде печатных форм используется поиск по самому контрагенту. Если контрагент — ИП или частное лицо, проверьте наличие реквизита ФизЛицо прямо в его карточке.

Вывод данных в макет (Табличный документ)

После того как данные получены (неважно, запросом или функцией), их нужно вывести в область макета. Рассмотрим, как это сделать правильно, чтобы не "сломать" оформление печатной формы.

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


ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет"); // Получаем макет обработки или документа
Область = Макет.ПолучитьОбласть("ДанныеПокупателя");

// Предположим, мы уже получили строку ПаспортныеДанные одним из способов выше
Область.Параметры.Паспорт = ПаспортныеДанные;

// Также можно заполнять структуру параметров целиком, если имена в запросе совпали с именами в макете
// ЗаполнитьЗначенияСвойств(Область.Параметры, Выборка); 

ТабДок.Вывести(Область);

Важные нюансы и советы

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

Права доступа: Паспортные данные — это персональные данные. Убедитесь, что у пользователя, который будет печатать форму, есть права на чтение регистра ДокументыФизическихЛиц. В противном случае запрос вернет пустой результат, даже если данные в базе есть.

Массовая печать: Если вам нужно вывести паспортные данные сразу для списка контрагентов (например, в реестре договоров), категорически не рекомендуется делать запрос в цикле. В этом случае лучше сначала собрать все ссылки на физлиц в массив, одним запросом получить данные по всем лицам в таблицу значений, а затем извлекать их из этой таблицы при выводе каждой строки.

Разберем, как это сделать эффективно:


// Подготовка массива ссылок
МассивФизЛиц = СписокФизЛиц.ВыгрузитьКолонку("ФизЛицо");

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ... ГДЕ ФизЛицо В (&МассивФизЛиц) ...";
Запрос.УстановитьПараметр("МассивФизЛиц", МассивФизЛиц);

ТаблицаПаспортов = Запрос.Выполнить().Выгрузить();
ТаблицаПаспортов.Индексы.Добавить("ФизЛицо"); // Для быстрого поиска

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

Используя эти методы, вы сможете корректно и профессионально реализовать вывод персональных данных в любые печатные формы ваших документов. Для этой задачи также можно применить готовое решение, например, внешнюю печатную форму трудового договора, которая автоматически заполняет необходимые реквизиты сотрудника.

← На главную