Как настроить автозаполнение паспортных данных контрагента-физлица в 1С:Документооборот

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

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

Анализ структуры данных: почему данные не тянутся автоматически

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

Именно поэтому стандартный выбор через точку в настройках автозаполнения (например, Контрагент.ФизЛицо) не дает возможности выбрать номер паспорта — система видит ссылку на объект, но не «заглядывает» в связанные регистры. Для решения этой задачи нам потребуется написать скрипт на языке 1С.

Способ 1. Получение данных через запрос к регистру сведений

Это классический способ, который подходит для большинства версий 1С:Документооборот 2.1. Мы напишем запрос, который обратится к срезу последних записей регистра документов физлиц на дату создания нашего документа.

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


РезультатОбработки = "";
// Получаем объект документа-владельца файла
Документ = Файл.ВладелецФайла;

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

    Запрос.УстановитьПараметр("Период", Документ.Дата);
    Запрос.УстановитьПараметр("ФизЛицо", Документ.Contragent.ФизЛицо);
    
    // Важно: проверьте точное имя предопределенного элемента в вашей базе
    Запрос.УстановитьПараметр("ВидДокумента", Справочники.ВидыДокументовФизическихЛиц.ПаспортРФ);

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

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

КонецЕсли;

Важные моменты в этом коде:

  1. Проверка заполнения: Мы обязательно используем ЗначениеЗаполнено(), чтобы скрипт не упал с ошибкой, если в документе еще не выбран контрагент.
  2. Вид документа: В разных базах предопределенный элемент может называться ПаспортРФ или ПаспортГражданинаРФ. Рекомендуем проверить это в Конфигураторе или через консоль запросов.
  3. Форматирование даты: Используйте функцию Формат() с параметром "ДЛФ=D", чтобы дата выдачи выглядела как "01 января 2023 г.", а не как "01.01.2023 00:00:00".

Способ 2. Использование функций библиотеки стандартных подсистем (БСП)

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

Проанализируем пример использования встроенной функции:


РезультатОбработки = "";
ДокументОбъект = Файл.ВладелецФайла;

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

Функция ФизическиеЛица.ДокументУдостоверяющийЛичность возвращает уже готовую, корректно сформированную строку со всеми данными паспорта. Это самый быстрый и "чистый" способ реализации задачи.

Особенности работы в 1С:Документооборот 3.0

В новой редакции системы (3.0) подход к скриптам изменился. Теперь разработчики рекомендуют использовать Алгоритмы. Выясним, почему это удобнее:

В версии 3.0 обращение к объекту документа в контексте автозаполнения часто выполняется через Параметры.Объект. Учтите это при миграции ваших наработок с версии 2.1.

Разбор типичных ошибок

Рассмотрим ситуацию из практики: «Скрипт не выдает ошибку, но поле в документе остается пустым». Почему так происходит?

  1. Контрагент — юридическое лицо: Если в документе выбран контрагент-организация, у него реквизит ФизЛицо будет пустым. Скрипт просто не сработает. Рекомендуем добавить проверку типа контрагента.
  2. Права доступа: Пользователь, который нажимает кнопку «Заполнить», может не иметь прав на чтение регистра Документы физических лиц (это персональные данные). В этом случае запрос вернет пустой результат. Попробуйте выполнить код под полными правами для проверки.
  3. Дата документа: Если вы создаете документ «задним числом» (например, 1 января), а паспорт физлица был выдан 10 января, то СрезПоследних на дату документа не найдет запись. В таких случаях иногда лучше использовать срез на текущую дату (пустая дата в параметрах).

Итоговые рекомендации

Для качественного автозаполнения мы советуем комбинировать проверку данных. Сначала убедитесь, что контрагент заполнен и является физлицом. Затем попробуйте получить данные через БСП, а если требуется специфический формат (например, только номер без серии), используйте прямой запрос к регистру.

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

← На главную