При разработке печатных форм в системе «1С:Предприятие 8» часто возникает задача адаптивного вывода контактной информации. Типичный сценарий: необходимо вывести юридический адрес организации, но если он не заполнен в базе данных, программа должна автоматически подставить фактический адрес. Рассмотрим подробно, как реализовать такую логику программно, используя современные стандарты разработки и механизмы Библиотеки стандартных подсистем (БСП).
Прежде чем переходить к сложной логике выбора адреса, разберем базовый механизм вывода данных в табличный документ. Любая печатная форма строится на основе макета, разделенного на области. Для вывода динамических данных в ячейках макета используются параметры. Рассмотрим, как инициализировать область и передать в неё значение:
ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
// Присвоение значения параметру напрямую
ОбластьМакета.Параметры.АдресОрганизации = "г. Москва, ул. Центральная, д. 1";
Проблема заключается в том, что данные редко бывают статичными. Нам нужно добавить условие, которое будет проверять наличие данных перед их выводом. Проанализируем простейший алгоритм выбора:
Если ЗначениеЗаполнено(ЮридическийАдрес) Тогда
ОбластьМакета.Параметры.АдресОрганизации = ЮридическийАдрес;
Иначе
ОбластьМакета.Параметры.АдресОрганизации = ФактическийАдрес;
КонецЕсли;
В современных конфигурациях (таких как «Бухгалтерия предприятия 3.0», «ERP» или «Управление торговлей 11») контактная информация хранится в специальных табличных частях. Напрямую обращаться к полям объекта не совсем корректно. Для получения представления адреса рекомендуется использовать программный интерфейс БСП — общий модуль УправлениеКонтактнойИнформацией. Выясним, как правильно получить данные по конкретному виду информации.
Рассмотрим пример получения юридического и фактического адресов для организации:
// Получаем юридический адрес
АдресЮридический = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(
ОрганизацияСсылка,
Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации,
ТекущаяДатаСеанса(),
Истина
);
// Получаем фактический адрес
АдресФактический = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(
ОрганизацияСсылка,
Справочники.ВидыКонтактнойИнформации.ФактАдресОрганизации,
ТекущаяДатаСеанса(),
Истина
);
В данном коде четвертый параметр Истина означает, что функция вернет текстовое представление адреса в виде строки. Это именно то, что нам нужно для печатной формы.
Теперь объединим получение данных и логику их вывода. Важно помнить, что функция получения контактной информации может вернуть пустую строку, если адрес не задан. Для проверки на пустоту в 1С лучше всего использовать универсальную функцию ЗначениеЗаполнено(). Она корректно отрабатывает со строками, ссылками и другими типами данных.
Разберем итоговый фрагмент кода, который решает поставленную задачу:
ОбластьМакета = Макет.ПолучитьОбласть("ДанныеОрганизации");
// Получаем оба варианта адреса
ЮрАдрес = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(Стр.Организация, Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации);
ФактАдрес = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(Стр.Организация, Справочники.ВидыКонтактнойИнформации.ФактАдресОрганизации);
// Проверяем заполненность юридического адреса
Если ЗначениеЗаполнено(ЮрАдрес) Тогда
// Если юридический адрес есть, выводим его
ОбластьМакета.Параметры.Адрес = ЮрАдрес;
Иначе
// Если юридического нет, выводим фактический (даже если он пустой)
ОбластьМакета.Параметры.Адрес = ФактАдрес;
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьМакета);
Проанализируем ситуации, с которыми часто сталкиваются начинающие разработчики при работе с адресами в макетах:
Если Адрес <> Неопределено Тогда. Это ошибка, так как функции получения контактной информации БСП чаще всего возвращают пустую строку "", а не Неопределено. Проверка ЗначениеЗаполнено() является наиболее надежной.ОбластьМакета.Параметры.Адрес, убедитесь, что в самом макете в нужной ячейке свойство «Заполнение» установлено в значение «Параметр», а имя параметра совпадает с кодом (в данном случае — Адрес).КонтактнаяИнформация вручную, если в конфигурации есть БСП. Стандартные функции учитывают историю изменений адресов и корректно формируют строковое представление.Если ваша печатная форма выводит список документов (например, реестр счетов), вызывать функцию получения адреса в цикле для каждой строки — плохая практика. Это создаст большую нагрузку на сервер. Посмотрим, как можно оптимизировать этот процесс:
В БСП существует метод УправлениеКонтактнойИнформацией.ПолучитьКонтактнуюИнформациюОбъектов(). Он позволяет передать массив ссылок на организации и получить все виды адресов за один запрос к базе данных. Это значительно ускоряет формирование отчетов и печатных форм.
Если адрес все равно не выводится, выполним следующие шаги по поиску причины:
ЮрАдрес и ФактАдрес. Если они пустые, значит, проблема в данных в самой базе или в неверно указанном виде контактной информации.Таким образом, комбинируя стандартные возможности платформы 1С и функции БСП, можно создать гибкий и отказоустойчивый механизм вывода данных, который будет корректно отображать информацию даже при частичном заполнении карточки организации.