При разработке и кастомизации печатных форм в системе 1С:Предприятие 8 одной из наиболее частых задач является вывод контактной информации контрагентов, партнеров или собственных организаций. В современных конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), для этих целей реализован мощный и гибкий механизм управления контактной информацией. Прямое обращение к табличным частям объектов или регистрам сведений крайне не рекомендуется, так как структура хранения данных может меняться от версии к версии. Вместо этого следует использовать стандартизованный программный интерфейс.
В этой статье мы подробно разберем, как правильно использовать стандартную функцию КонтактнаяИнформацияОбъекта общего модуля УправлениеКонтактнойИнформацией, рассмотрим особенности ее параметров, научимся избегать критических ошибок производительности при групповой печати и разберем нюансы работы с историей изменений адресов.
Если перед нами стоит задача просто получить текстовое представление юридического адреса головной организации и вывести его в параметр печатной формы, наиболее лаконичным и правильным решением будет вызов функции с установленным флагом ТолькоПредставление = Истина. Давайте посмотрим на готовый пример кода, который решает эту задачу в одну строку:
ОбластьПодвал1.Параметры.ГоловнаяОрганизацияАдресЮридический =
УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(
СсылкаНаДокумент.ГоловнаяОрганизация,
Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации,
СсылкаНаДокумент.Дата,
Истина
);
Разберем детально, что происходит в данном фрагменте кода:
СсылкаНаДокумент.ГоловнаяОрганизация.Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации.СсылкаНаДокумент.Дата). Это критически важно для корректного получения исторических данных, о чем мы подробно поговорим далее.Истина (параметр ТолькоПредставление). Это указывает системе, что нам не нужна таблица со служебными данными, а достаточно получить простую готовую строку с адресом.Иногда возникает необходимость получить сразу несколько видов контактной информации для одного объекта (например, и юридический адрес, и телефон, и email) за один вызов функции, чтобы не перегружать базу данных лишними запросами. В таком случае параметр ТолькоПредставление следует установить в значение Ложь (или оставить по умолчанию).
Проанализируем пример получения таблицы значений и извлечения из нее нужного адреса с помощью метода Найти():
// Получаем таблицу со всеми видами контактной информации объекта
ТаблицаКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(
СсылкаНаДокумент.ГоловнаяОрганизация,
Неопределено,
СсылкаНаДокумент.Дата,
Ложь
);
// Ищем строку, соответствующую юридическому адресу
СтрокаЮрАдрес = ТаблицаКИ.Найти(Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации, "Вид");
Если СтрокаЮрАдрес <> Неопределено Тогда
ОбластьПодвал1.Parameтры.ГоловнаяОрганизацияАдресЮридический = СтрокаЮрАдрес.Представление;
Иначе
ОбластьПодвал1.Параметры.ГоловнаяОрганизацияАдресЮридический = "Адрес не заполнен";
КонецЕсли;
Обратите внимание: объявление переменной в виде Адрес = Новый ТаблицаЗначений; перед вызовом функции является грубой ошибкой и лишним действием. Функция КонтактнаяИнформацияОбъекта сама инициализирует и возвращает готовую таблицу значений. Предварительное создание пустого объекта таблицы лишь бессмысленно расходует оперативную память и процессорное время.
Для глубокого понимания работы механизма рассмотрим структуру параметров функции:
ЛюбаяСсылка или Объект) — ссылка на элемент справочника (например, Организации, Контрагенты, ФизическиеЛица, Партнеры), информацию о котором мы хотим получить.СправочникСсылка.ВидыКонтактнойИнформации) — необязательный параметр. Если он опущен или передан как Неопределено, функция вернет данные по всем доступным видам контактной информации для указанного объекта.Дата) — необязательный параметр. Дата, на которую запрашивается состояние контактной информации. Используется в конфигурациях, где включено хранение истории изменений КИ.Булево) — определяет тип возвращаемого значения. При значении Истина возвращается строка, при Ложь — таблица значений со служебными полями (такими как XML/JSON-структура адреса, коды КЛАДР/ФИАС и т.д.).В старых версиях конфигураций 1С (на платформе 1С:Предприятие 8.1 и ранних версиях 8.2) виды контактной информации хранились в Планах видов характеристик (ПВХ). Однако в современных решениях на БСП вся контактная информация классифицируется с помощью справочника ВидыКонтактнойИнформации.
Значение ЮрАдресОрганизации является предопределенным элементом этого справочника. Он жестко зашит в конфигурации на этапе разработки и относится к группе предопределенных элементов, связанных со справочником Организации. Это гарантирует, что разработчик всегда может обратиться к нему непосредственно из кода через точку, не опасаясь, что пользователи переименуют или случайно удалят этот элемент в режиме предприятия.
Рассмотрим очень важный нюанс, связанный с быстродействием системы. Функция КонтактнаяИнформацияОбъекта при каждом своем вызове обращается к базе данных с помощью запроса.
Представим сценарий: пользователь выводит на печать реестр из 100 документов или выполняет групповую печать накладных. Если мы поместим вызов функции КонтактнаяИнформацияОбъекта внутрь цикла обхода документов, программа выполнит 100 отдельных запросов к базе данных. Это классическая проблема производительности N+1 запрос, которая может привести к значительному зависанию интерфейса и избыточной нагрузке на СУБД.
Для решения этой проблемы в БСП предусмотрен альтернативный метод пакетного получения данных — УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов (обратите внимание на множественное число в имени функции). Давайте разберем, как правильно организовать получение адресов для списка документов:
// Шаг 1. Собираем массив уникальных организаций из списка документов
МассивОрганизаций = Новый Массив;
Для Каждого СтрокаДокумента Из СписокДокументов Цикл
Если МассивОрганизаций.Найти(СтрокаДокумента.Организация) = Неопределено Тогда
МассивОрганизаций.Добавить(СтрокаДокумента.Организация);
КонецЕсли;
КонецЦикла;
// Шаг 2. Задаем массив интересующих нас видов контактной информации
МассивВидовКИ = Новый Массив;
МассивВидовКИ.Добавить(Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации);
// Шаг 3. Делаем ОДИН запрос к базе данных для получения КИ всех объектов сразу
ТаблицаАдресовОрганизаций = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(
МассивОрганизаций,
МассивВидовКИ,
ТекущаяДата()
);
// Шаг 4. При формировании печатных форм находим адреса в локальной таблице значений
Для Каждого СтрокаДокумента Из СписокДокументов Цикл
// Код вывода секции печатной формы...
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Объект", СтрокаДокумента.Организация);
ПараметрыОтбора.Вставить("Вид", Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации);
НайденныеСтроки = ТаблицаАдресовОрганизаций.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() > 0 Тогда
АдресДляПечати = НайденныеСтроки[0].Представление;
Иначе
АдресДляПечати = "";
КонецЕсли;
// Заполняем параметры области
ОбластьСтроки.Параметры.Адрес = АдресДляПечати;
КонецЦикла;
Использование этого подхода позволяет сократить количество запросов к СУБД с сотен до одного-единственного, что обеспечивает мгновенное формирование печатных форм даже при больших объемах данных.
В конфигурациях 1С часто включается опция хранения истории изменений контактной информации. Это необходимо для случаев, когда организация меняет свой фактический или юридический адрес, но старые документы (например, накладные или акты трехлетней давности) должны по закону быть распечатаны со старыми реквизитами, актуальными на момент совершения сделки.
Если при вызове функции КонтактнаяИнформацияОбъекта мы проигнорируем третий параметр (оставим его пустым), система вернет адрес, актуальный на текущий момент времени. Если организация переехала месяц назад, то при печати архивного документа за прошлый год на печать выведется новый адрес, что является юридической ошибкой.
Всегда передавайте дату документа в качестве третьего параметра функции, чтобы обеспечить историческую достоверность выводимых реквизитов:
// Правильное получение адреса с учетом историчности изменений
АдресНаДату = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(
СсылкаНаДокумент.ГоловнаяОрганизация,
Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации,
СсылкаНаДокумент.Дата,
Истина
);
Если вы работаете в таких комплексных конфигурациях, как 1С:ERP Управление предприятием, Комплексная автоматизация или Управление торговлей, в них присутствует специализированный общий модуль ОрганизацииСервер. Данный модуль предоставляет еще более простой программный интерфейс для работы с данными организаций.
Вместо ручного указания ссылок на справочник видов контактной информации мы можем вызвать готовый метод, который вернет структуру с заполненными текстовыми представлениями основных адресов:
// Запрашиваем структуру сведений по организации
СписокПолей = "ЮридическийАдрес, ФактическийАдрес, Телефоны";
ДанныеОрганизации = ОрганизацииСервер.КонтактнаяИнформацияОрганизации(
СсылкаНаДокумент.ГоловнаяОрганизация,
СписокПолей,
СсылкаНаДокумент.Дата
);
// Заполняем параметры печатной формы
ОбластьПодвал1.Параметры.ГоловнаяОрганизацияАдресЮридический = ДанныеОрганизации.ЮридическийАдрес;
Этот способ удобен тем, что разработчику не нужно знать точные имена предопределенных элементов в справочнике КИ, система сама выполнит все сопоставления под капотом.
Иногда стандартного текстового представления адреса бывает недостаточно. Например, если в печатной форме жестко регламентировано разделение адреса по отдельным полям (индекс, субъект РФ, город, улица, дом) или требуется программно проанализировать код региона.
Для реализации такой логики нам потребуется получить структурированные данные. Для этого мы вызываем функцию с параметром ТолькоПредставление = Ложь и используем вспомогательные функции БСП для парсинга XML или JSON структуры:
ТаблицаКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(
СсылкаНаДокумент.ГоловнаяОрганизация,
Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации,
СсылкаНаДокумент.Дата,
Ложь
);
Если ТаблицаКИ.Количество() > 0 Тогда
СтрокаКИ = ТаблицаКИ[0];
// Получаем структуру полей адреса с помощью специализированного модуля
СведенияОбАдресе = РаботаСАдресами.СведенияОбАдресе(СтрокаКИ.ЗначенияПолей, СтрокаКИ.Представление);
// Теперь мы можем обращаться к отдельным составляющим адреса
ПочтовыйИндекс = СведенияОбАдресе.Индекс;
Город = СведенияОбАдресе.Город;
Улица = СведенияОбАдресе.Улица;
Дом = СведенияОбАдресе.Дом;
// Пример вывода только индекса и города
ОбластьПодвал1.Параметры.КраткийАдрес = ПочтовыйИндекс + ", г. " + Город;
КонецЕсли;
Подводя итоги, сформулируем основные правила работы с контактной информацией в среде 1С:Предприятие 8 на базе БСП:
КонтактнаяИнформация справочников. Используйте методы API БСП.УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта.Дата документа при запросе КИ, чтобы избежать вывода неактуальных юридических адресов на старых печатных формах.УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов для предотвращения деградации производительности вашей СУБД.РаботаСАдресами.СведенияОбАдресе для преобразования внутреннего формата хранения в удобную структуру 1С.