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