При разработке печатных форм и отчетов начинающие разработчики нередко пытаются получить реквизиты объекта через его экранную форму, обращаясь к коллекции элементов интерфейса. Разберем, почему попытка прочитать фамилию через ПолучитьФорму() и ЭлементыФормы приводит к ошибкам, и как корректно извлекать персональные данные физических лиц из базы данных.
Рассмотрим типичную ошибку в программном коде:
Форма = Сотрудник.ПолучитьФорму("ФормаЭлемента");
Фамилия = Форма.ЭлементыФормы.Фамилия;
ОбластьПечати.Параметры.Сотрудник = Фамилия;
Выясним причину некорректной работы такого подхода:
Форма.ЭлементыФормы.Фамилия возвращает объект элемента интерфейса (например, ПолеВвода), а не само строковое значение.ПолучитьФорму() лишь создает объект формы в памяти. При этом не отрабатывают события открытия и инициализации данных, поэтому свойство Значение у элемента формы остается пустым.ФИОФизЛиц.Разберем наиболее надежный и производительный вариант. Использование запроса к виртуальной таблице СрезПоследних позволяет получить актуальные данные на нужную дату документа или отчета, а также корректно обработать случаи, когда запись в регистре сведений отсутствует.
Посмотрим на пример текста запроса и его обработки:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЕСТЬNULL(ФИОФизЛиц.Фамилия, """") КАК Фамилия,
| ЕСТЬNULL(ФИОФизЛиц.Имя, """") КАК Имя,
| ЕСТЬNULL(ФИОФизЛиц.Отчество, """") КАК Отчество,
| ФизЛица.Наименование КАК ФИОПоУмолчанию
|ИЗ
| Справочник.ФизическиеЛица КАК ФизЛица
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизЛиц.СрезПоследних(&Период, ФизЛицо = &ФизЛицо) КАК ФИОФизЛиц
| ПО ФизЛица.Ссылка = ФИОФизЛиц.ФизЛицо
|ГДЕ
| ФизЛица.Ссылка = &ФизЛицо";
Запрос.УстановитьПараметр("Период", ДатаДокумента);
Запрос.УстановитьПараметр("ФизЛицо", Сотрудник);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Фамилия = Выборка.Фамилия;
// Если запись в регистре не найдена, используем наименование справочника
Если ПустаяСтрока(Фамилия) Тогда
Фамилия = Выборка.ФИОПоУмолчанию;
КонецЕсли;
ОбластьПечати.Параметры.Сотрудник = Фамилия;
КонецЕсли;
Обратите внимание: измерение регистра сведений называется ФизЛицо, а не Сотрудник. Передача неправильного имени измерения в отбор вызывает ошибку платформы «Недопустимое значение параметра».
Если требуется получить данные для одного физического лица без построения сложного запроса, разберем метод объектной модели ПолучитьПоследнее().
Рассмотрим по шагам реализацию выборки:
СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить("ФизЛицо", Сотрудник);
ДанныеФИО = РегистрыСведений.ФИОФизЛиц.ПолучитьПоследнее(КонецДня(ДатаДокумента), СтруктураОтбора);
Фамилия = ДанныеФИО.Фамилия;
Если ПустаяСтрока(Фамилия) Тогда
// Резервное получение данных из наименования элемента
Фамилия = Сотрудник.Наименование;
КонецЕсли;
ОбластьПечати.Параметры.Сотрудник = Фамилия;
Этот метод возвращает структуру с полями-ресурсами регистра: Фамилия, Имя, Отчество. Важно помнить, что если в регистре нет записей по указанному физлицу, метод вернет структуру с пустыми строками, поэтому рекомендуется предусмотреть проверку на заполненность.
Проанализируем готовые инструменты, встроенные в типовые конфигурации. Для формирования представления вида «Фамилия И. О.» или полного ФИО разработчики платформы реализовали экспортные функции общего назначения.
В конфигурациях на обычных формах (например, УТ 10.3, УПП 1.3):
// Функция возвращает строку вида "Иванов И. И."
ФамилияИнициалы = ОбщегоНазначения.ФамилияИнициалыФизЛица(Сотрудник);
ОбластьПечати.Параметры.Сотрудник = ФамилияИнициалы;
В конфигурациях с внедренной Библиотекой Стандартных Подсистем (БСП):
ФамилияИнициалы = ФизическиеЛицаКлиентСервер.ФамилияИнициалыФизЛица(СтрокаФИО);
ЭлементыФормы для получения данных при печати или проведении документов.РегистрСведений.ФИОФизЛиц.СрезПоследних, чтобы избежать лишней нагрузки на СУБД.ФИОФизЛиц используйте измерение ФизЛицо со ссылкой на справочник ФизическиеЛица.