Как получить данные удостоверения физического лица из внешней обработки в 1С

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке внешних обработок и отчетов разработчики нередко сталкиваются с ситуацией, когда на форме справочника отображается поле (например, Удостоверение или паспортные данные), однако в списке реквизитов самого справочника ФизическиеЛица такое поле отсутствует. Попытка получить значение через программное обращение к форме объекта вроде Справочники.ФизическиеЛица.ПолучитьФорму() приводит к тому, что поле оказывается пустым или недоступным. Разберем, почему возникает эта проблема и как правильно получать данные физических лиц.

Почему нельзя обращаться к элементам формы для чтения данных

Проанализируем архитектуру платформы 1С:Предприятие и выясним причины, по которым считывание данных через элементы интерфейса является ошибочным подходом:

  1. Разделение данных и интерфейса: Элементы формы (коллекция ЭлементыФормы в обычном приложении или Элементы в управляемом) представляют собой визуальные контролы пользовательского интерфейса, а не объекты хранения данных базы. Хранилищем информации выступают таблицы базы данных (табличные части, реквизиты объектов, регистры).
  2. Особенности инициализации формы: При вызове метода ПолучитьФорму() без открытия ее пользователю события инициализации интерфейса (такие как ПриОткрытии, ПриСозданииНаСервере или ПриЧтенииНаСервере) могут не выполняться вовсе, либо форма инициализируется пустыми значениями по умолчанию. Программный код, заполняющий визуальные поля данными из базы, срабатывает только в процессе штатного интерактивного открытия формы.
  3. Производительность и клиент-серверная модель: Инициализация графических объектов ради чтения одной строки создает избыточную нагрузку на память и процессор, а на стороне сервера создание визуальных окон и вовсе недопустимо.

Где фактически хранятся паспортные данные и удостоверения

В типовых конфигурациях 1С (таких как ЗУП, УПП, Комплексная автоматизация, Бухгалтерия предприятия, ERP) личные документы физических лиц могут изменяться со временем (например, при замене паспорта по возрасту или смене фамилии). По этой причине они вынесены в периодические регистры сведений:

  1. В конфигурациях на обычных формах (толстый клиент): Данные хранятся в периодическом регистре сведений ПаспортныеДанныеФизЛиц с измерением ФизЛицо и ресурсами ДокументВид, ДокументСерия, ДокументНомер, ДокументДатаВыдачи, ДокументКемВыдан.
  2. В современных конфигурациях на управляемых формах: Данные хранятся в регистре сведений ДокументыФизическихЛиц с измерениями Физлицо и ВидДокумента.

При открытии формы элемента справочника ФизическиеЛица платформа автоматически или программно считывает самую актуальную запись из этого регистра и подставляет ее строковое представление в поле ввода формы.

Способ 1. Получение данных с помощью запроса к срезу последних (рекомендуемый)

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

Посмотрим на пример реализации запроса:


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

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

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

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

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

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


Отбор = Новый Структура;
Отбор.Вставить("ФизЛицо", СсылкаНаФизЛицо);

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

Если ТаблицаСреза.Количество() > 0 Тогда
    Запись = ТаблицаСреза[0];
    Серия = Запись.ДокументСерия;
    Номер = Запись.ДокументНомер;
    КемВыдан = Запись.ДокументКемВыдан;
КонецЕсли;

Способ 3. Интерактивное открытие формы с передачей ссылки

Если цель состоит не в фоновом извлечении строки, а в открытии формы существующего элемента справочника для пользователя из внешней обработки, разберем по шагам, как передать ссылку на объект в форму, чтобы все реквизиты и элементы заполнились штатно.

Для обычного приложения (толстый клиент):


// Получаем форму конкретного элемента справочника по его ссылке
ФормаЭлемента = СсылкаНаФизЛицо.ПолучитьФорму("ФормаЭлемента");
ФормаЭлемента.Открыть();

Для управляемого приложения:


ПараметрыФормы = Новый Структура("Ключ", СсылкаНаФизЛицо);
ОткрытьФорму("Справочник.ФизическиеЛица.ФормаОбъекта", ПараметрыФормы);

Таким образом, для получения любых дополнительных сведений об объекте из внешних обработок всегда следует анализировать структуру метаданных конфигурации (регистры сведений, подчиненные справочники) и извлекать данные напрямую из источника хранения с помощью запросов.

← На главную