Как правильно получить фамилию или ФИО физического лица для макета печати в 1С

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

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

Анализ проблемы: почему нельзя обращаться к элементам формы

Рассмотрим типичную ошибку в программном коде:


Форма = Сотрудник.ПолучитьФорму("ФормаЭлемента");
Фамилия = Форма.ЭлементыФормы.Фамилия;
ОбластьПечати.Параметры.Сотрудник = Фамилия;

Выясним причину некорректной работы такого подхода:

  1. Обращение к элементу управления вместо значения. Выражение Форма.ЭлементыФормы.Фамилия возвращает объект элемента интерфейса (например, ПолеВвода), а не само строковое значение.
  2. Форма не инициализирована. Метод ПолучитьФорму() лишь создает объект формы в памяти. При этом не отрабатывают события открытия и инициализации данных, поэтому свойство Значение у элемента формы остается пустым.
  3. Нарушение клиент-серверной архитектуры. Работа с формами и элементами управления предназначена исключительно для интерактивного интерфейса. В алгоритмах формирования печатных форм, отчетов, фоновых заданий или серверных процедур обращение к формам вызывает исключения и приводит к падению производительности.
  4. Хранение истории ФИО в регистрах. В типовых конфигурациях 1С (УТ 10.3, УПП 1.3, КА 1.1, ЗУП) фамилия, имя и отчество являются периодическими данными и хранятся не в реквизитах самого справочника, а в периодическом регистре сведений ФИОФизЛиц.

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

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

Посмотрим на пример текста запроса и его обработки:


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

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

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

Обратите внимание: измерение регистра сведений называется ФизЛицо, а не Сотрудник. Передача неправильного имени измерения в отбор вызывает ошибку платформы «Недопустимое значение параметра».

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

Если требуется получить данные для одного физического лица без построения сложного запроса, разберем метод объектной модели ПолучитьПоследнее().

Рассмотрим по шагам реализацию выборки:


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

ДанныеФИО = РегистрыСведений.ФИОФизЛиц.ПолучитьПоследнее(КонецДня(ДатаДокумента), СтруктураОтбора);

Фамилия = ДанныеФИО.Фамилия;
Если ПустаяСтрока(Фамилия) Тогда
    // Резервное получение данных из наименования элемента
    Фамилия = Сотрудник.Наименование;
КонецЕсли;

ОбластьПечати.Параметры.Сотрудник = Фамилия;

Этот метод возвращает структуру с полями-ресурсами регистра: Фамилия, Имя, Отчество. Важно помнить, что если в регистре нет записей по указанному физлицу, метод вернет структуру с пустыми строками, поэтому рекомендуется предусмотреть проверку на заполненность.

Способ 3. Использование типовых функций конфигурации

Проанализируем готовые инструменты, встроенные в типовые конфигурации. Для формирования представления вида «Фамилия И. О.» или полного ФИО разработчики платформы реализовали экспортные функции общего назначения.

В конфигурациях на обычных формах (например, УТ 10.3, УПП 1.3):


// Функция возвращает строку вида "Иванов И. И."
ФамилияИнициалы = ОбщегоНазначения.ФамилияИнициалыФизЛица(Сотрудник);
ОбластьПечати.Параметры.Сотрудник = ФамилияИнициалы;

В конфигурациях с внедренной Библиотекой Стандартных Подсистем (БСП):

ФамилияИнициалы = ФизическиеЛицаКлиентСервер.ФамилияИнициалыФизЛица(СтрокаФИО);

Сводные рекомендации

  1. Никогда не используйте вызовы экранных форм и свойства коллекции ЭлементыФормы для получения данных при печати или проведении документов.
  2. Для массовой выборки физических лиц всегда применяйте запросы к таблице РегистрСведений.ФИОФизЛиц.СрезПоследних, чтобы избежать лишней нагрузки на СУБД.
  3. При отборе по регистру ФИОФизЛиц используйте измерение ФизЛицо со ссылкой на справочник ФизическиеЛица.
← На главную