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