Как получить и вывести номер телефона грузополучателя в УПД в 1С

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При формировании универсального передаточного документа (УПД) в программе «1С:Бухгалтерия предприятия 3.0» часто возникает необходимость кастомизации печатной формы. Одной из наиболее распространенных задач является вывод контактных данных контрагента — в частности, номера телефона грузополучателя. Начинающие разработчики часто сталкиваются с трудностями при попытке извлечь этот реквизит, получая ошибку определения параметра. В этой статье мы подробно разберем, как устроен механизм формирования сведений об организациях и контрагентах, и рассмотрим несколько способов решения этой задачи.

Выясняем причину ошибки: как работает ОписаниеОрганизации

Для начала проанализируем ситуацию, с которой сталкивается программист при попытке напрямую подставить интуитивно понятные параметры вроде НомерТелефона, ТелефонОрганизации или Телефон в код формирования печатной формы. При вызове функции формирования адреса и наименования программа выдает ошибку о том, что значение параметра не определено.

Дело в том, что печатные формы в современных конфигурациях 1С формируются с использованием специализированных функций Библиотеки Стандартных Подсистем (БСП) и внутренних механизмов конфигурации. В «1С:Бухгалтерии 3.0» ключевую роль при компоновке текстового представления реквизитов играет функция ОбщегоНазначенияБПВызовСервера.ОписаниеОрганизации. Она принимает структуру подготовленных сведений и строку-шаблон с перечислением требуемых полей.

Внутри этой функции происходит разбор переданной строки. Названия параметров жестко предопределены в логике БСП. Если попытаться передать туда произвольное имя реквизита, система его проигнорирует или вернет ошибку. Правильное имя параметра для вывода контактных телефонов в этой структуре — Телефоны.

Решение 1. Быстрый способ (добавление телефона в общее представление)

Если вам необходимо вывести телефон грузополучателя одной строкой вместе с его наименованием и адресом доставки, рассмотрим самый простой и быстрый способ. Нам достаточно отредактировать список полей, передаваемых в функцию ОписаниеОрганизации.

Разберем по шагам, как выглядит типовой вызов и как его нужно изменить:


// ТИПОВОЙ ВАРИАНТ:
ПредставлениеГрузополучателя = ОбщегоНазначенияБПВызовСервера.ОписаниеОрганизации(
    СведенияОГрузополучателе, "НаименованиеДляПечатныхФорм,ПочтовыйАдрес,");

// ИСПРАВЛЕННЫЙ ВАРИАНТ С ВЫВОДОМ ТЕЛЕФОНА:
ПредставлениеГрузополучателя = ОбщегоНазначенияБПВызовСервера.ОписаниеОрганизации(
    СведенияОГрузополучателе, "НаименованиеДляПечатныхФорм,ПочтовыйАдрес,Телефоны");

При таком подходе функция ОписаниеОрганизации самостоятельно извлечет значение телефона из переданной структуры СведенияОГрузополучателе, отформатирует его и аккуратно добавит через запятую после почтового адреса.

Решение 2. Вывод телефона в отдельное поле макета

Бывают ситуации, когда дизайн печатной формы УПД требует вывода телефона грузополучателя не в общую кучу с адресом, а строго в отдельную ячейку макета (например, под параметром ТелефонГрузополучателя). В этом случае использовать функцию ОписаниеОрганизации не совсем удобно, так как она возвращает единую склеенную строку.

Для точечного получения контактной информации в БСП предусмотрен специальный программный интерфейс. Мы можем напрямую обратиться к модулю управления контактной информацией. Рассмотрим пример кода, который решает эту задачу универсально, определяя тип грузополучателя (это может быть как сторонняя организация-контрагент, так и наша собственная организация):


// Определяем ссылку на грузополучателя из реквизитов документа
СсылкаНаГрузополучателя = Шапка.Грузополучатель; 
ТелефонСтрокой = "";

Если ЗначениеЗаполнено(СсылкаНаГрузополучателя) Тогда
    // В зависимости от типа объекта выбираем подходящий вид контактной информации
    Если ТипЗнч(СсылкаНаГрузополучателя) = Тип("СправочникСсылка.Контрагенты") Тогда
        ВидКИ = Справочники.ВидыContactнойИнформации.ТелефонКонтрагента;
    Иначе
        ВидКИ = Справочники.ВидыContactнойИнформации.ТелефонОрганизации;
    КонецЕсли;

    // Получаем строковое представление телефона напрямую через БСП
    ТелефонСтрокой = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(СсылкаНаГрузополучателя, ВидКИ);
КонецЕсли;

// Заполняем параметр в области макета УПД
ОбластьМакета.Параметры.ТелефонГрузополучателя = ТелефонСтрокой;

Этот способ является более гибким, так как исключает появление лишних знаков препинания (запятых, двоеточий) и позволяет форматировать вывод телефона на макете независимо от адреса.

Как эти данные устроены в базе данных

Проанализируем структуру хранения данных, чтобы понимать, откуда БСП извлекает информацию о телефонах. В современных версиях платформы 1С v8.3 контактная информация не хранится в реквизитах справочника. Вместо этого используется табличная часть КонтактнаяИнформация у соответствующих справочников (Контрагенты, Организации, ФизическиеЛица).

Если вы пишете собственный сложный запрос для сбора данных перед печатью и хотите получить представление телефона одной выборкой, обращаться нужно к этой табличной части. Посмотрим на пример такого запроса:


ВЫБРАТЬ
    КИ.Представление КАК ТелефонСтрокой
ИЗ
    Справочник.Контрагенты.КонтактнаяИнформация КАК КИ
ГДЕ
    КИ.Ссылка = &Грузополучатель
    И КИ.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ТелефонКонтрагента)

Поле Представление в этой табличной части хранит уже готовую, отформатированную строку номера телефона, введенную пользователем.

Что проверить в режиме пользователя, если телефон не выводится

Иногда программный код написан абсолютно верно, но при выводе на печать поле телефона все равно остается пустым. В таком случае рекомендуем проверить следующие моменты непосредственно в режиме «1С:Предприятие»:

  1. Заполнение карточки контрагента: Откройте карточку контрагента, который выступает грузополучателем в документе. Перейдите в раздел «Адреса и телефоны» и убедитесь, что поле «Телефон» заполнено.
  2. Настройки доставки в документе: В самом документе реализации в левом нижнем углу найдите гиперссылку «Доставка». Нажмите на неё. Если в поле «Грузополучатель» выбрано значение «Он же (Покупатель)», система будет обращаться к карточке покупателя. Если выбрано значение «Другой», убедитесь, что выбран именно тот контрагент, у которого заполнен телефон в справочнике.

Рекомендация по правильной доработке системы

В ходе обсуждения на форумах разработчики часто вносят правки напрямую в типовой общий модуль УчетНДС или в модуль менеджера документа РеализацияТоваровУслуг. Настоятельно не рекомендуем делать это напрямую в основной конфигурации! Снятие конфигурации с поддержки усложнит последующие обновления программы.

Для решения этой задачи правильнее использовать один из двух подходов:

  1. Расширение конфигурации: Создайте новое расширение, заимствуйте туда процедуру печати УПД (например, ПечатьУПД или вспомогательные методы заполнения структуры реквизитов шапки) и используйте аннотацию &После или &Вместо для переопределения логики заполнения контактных данных.
  2. Внешняя печатная форма (ВПФ): Создайте внешнюю печатную форму УПД. Это полностью изолирует ваш код от обновлений типовой конфигурации. Даже если фирма «1С» кардинально изменит структуру общего модуля УчетНДС в новом релизе, ваша база обновится без ошибок, а печатную форму при необходимости можно будет легко адаптировать без изменения метаданных.
← На главную