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