Как в УПД подставить адрес доставки в поле "Адрес грузополучателя" в 1С: Управление торговлей 11?

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

В процессе работы в 1С: Управление торговлей (УТ 11) часто возникает задача, когда в печатной форме Универсального передаточного документа (УПД) в поле "Адрес грузополучателя" необходимо указывать фактический адрес доставки товара, а не юридический или фактический адрес контрагента-покупателя. Стандартная логика программы по умолчанию подставляет именно данные из карточки контрагента, что не всегда соответствует реальным бизнес-процессам, особенно при наличии у клиента множества торговых точек или складов.

Интересно, что пользователи часто замечают расхождение в поведении печатных форм: например, в форме ТОРГ-12 адрес может подставляться корректно (из данных по доставке), а в УПД — нет. Давайте разберемся, почему так происходит и как настроить программу для корректного вывода адреса доставки.

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

Решение 1: Стандартный механизм и его ограничения

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

В документе Реализация товаров и услуг есть закладка "Дополнительно". На ней расположено поле Грузополучатель, где можно выбрать другого контрагента, который и будет являться получателем груза. Соответственно, его адрес и будет подставлен в печатную форму УПД.

Исходя из этой логики, стандартный подход, который часто предлагают, выглядит так:

  1. Для каждой точки доставки клиента создать в справочнике Контрагенты отдельный элемент.
  2. При оформлении документа реализации выбирать в поле Грузополучатель того контрагента, который соответствует нужному адресу доставки.

Однако у этого способа есть серьезные недостатки:

Такое решение в сообществе 1С считается "грязным" и не рекомендуется для постоянного использования ввиду перечисленных проблем. Оно может подойти как временная мера при очень небольшом количестве адресов доставки.

Решение 2: Доработка через расширение конфигурации (Рекомендуемый способ)

Самым правильным, гибким и безопасным способом решения нашей задачи является создание расширения конфигурации. Этот механизм позволяет изменить поведение типовой программы, не внося правок в основной код, что критически важно для последующих обновлений. Для реализации такой модификации без изменения типовых алгоритмов печати подойдёт решение для постобработки печатных форм БСП через расширение.

Суть метода:

Мы создаем небольшое расширение, которое "перехватывает" процесс формирования печатной формы УПД и вносит в него нужные изменения. Вместо того чтобы брать адрес из реквизитов контрагента-грузополучателя, код будет обращаться к адресу доставки, указанному непосредственно в документе реализации или связанном с ним заказе клиента.

Рассмотрим по шагам, как это работает на логическом уровне:

  1. Создание расширения. В режиме конфигуратора создается новое расширение, в которое будет заимствована процедура или функция, отвечающая за формирование данных для печати УПД. Обычно это функции в общих модулях, таких как УправлениеПечатью или модуль менеджера документа РеализацияТоваровУслуг.
  2. Перехват процедуры. С помощью аннотаций &Вместо или &После мы изменяем выполнение стандартной процедуры. Чаще всего используется аннотация &После, чтобы не переписывать весь типовой код, а лишь изменить нужный нам параметр в уже сформированной структуре данных для печати.
  3. Получение адреса доставки. В коде расширения мы получаем доступ к документу-основанию (объекту РеализацияТоваровУслуг). Из него можно получить адрес доставки. Адрес доставки обычно хранится в виде строки в одноименном реквизите или может быть получен из контактной информации партнера, если настроена соответствующая связь.
  4. Подмена данных. Полученное строковое представление адреса доставки мы программно записываем в поле структуры данных, отвечающее за адрес грузополучателя, перед тем как она будет передана в макет печатной формы.

Посмотрим на гипотетический пример кода, который мог бы находиться в модуле расширения. Допустим, мы перехватываем процедуру в общем модуле УправлениеПечатью.


&После("СформироватьДанныеДляПечатиУПД")
Процедура Расш1_СформироватьДанныеДляПечатиУПД(СсылкаНаДокумент, ТаблицаДанныхДляПечати)

    // Получаем адрес доставки из документа реализации
    // Предполагаем, что он хранится в реквизите "АдресДоставки"
    АдресДоставкиСтрокой = СсылкаНаДокумент.АдресДоставки;

    // Если адрес доставки не заполнен в реализации,
    // можно попробовать получить его из заказа-основания
    Если НЕ ЗначениеЗаполнено(АдресДоставкиСтрокой) И ЗначениеЗаполнено(СсылкаНаДокумент.ЗаказКлиента) Тогда
        АдресДоставкиСтрокой = СсылкаНаДокумент.ЗаказКлиента.АдресДоставки;
    КонецЕсли;

    // Если мы нашли адрес доставки, подменяем его в таблице данных
    Если ЗначениеЗаполнено(АдресДоставкиСтрокой) Тогда
        // Находим строку, отвечающую за адрес грузополучателя и меняем значение
        // Имя параметра может отличаться в зависимости от версии УТ
        Для Каждого Строка Из ТаблицаДанныхДляПечати Цикл
            Если Строка.Имя = "АдресГрузополучателя" Тогда
                Строка.Значение = АдресДоставкиСтрокой;
                Прервать;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;

КонецПроцедуры

Важно: При работе с адресами в современных конфигурациях 1С они часто хранятся в структурированном виде в регистре сведений Контактная информация. Для получения корректного строкового представления адреса (с индексами, регионами и т.д.) рекомендуется использовать стандартные функции БСП, например, РаботаСКонтактнойИнформацией.ПредставлениеАдреса.

Решение 3: Использование внешней печатной формы (ВПФ)

Если создание расширения кажется слишком сложным, есть альтернативный вариант — внешняя печатная форма. Этот способ также не требует изменения конфигурации. В качестве готовой основы для доработки можно взять внешнюю печатную форму УПД с открытым кодом.

Алгоритм действий:

  1. Сохраняем типовую форму. Открываем стандартную печатную форму УПД в конфигураторе (например, через общий макет) и сохраняем ее как внешнюю обработку (.epf).
  2. Редактируем код. Открываем сохраненный файл в конфигураторе и находим в его модуле процедуру, отвечающую за формирование данных. Вносим в нее правки, аналогичные тем, что мы рассмотрели для расширения: получаем адрес доставки из документа и подставляем его в нужное поле.
  3. Подключаем ВПФ в 1С. В режиме "Предприятие" заходим в раздел НСИ и администрирование -> Печатные формы, отчеты и обработки -> Дополнительные отчеты и обработки. Добавляем нашу измененную печатную форму, указывая, к какому документу она относится (Реализация товаров и услуг).

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

Преимущества ВПФ: простота подключения и отключения.

Недостатки ВПФ: если в будущем законодательно изменится формат УПД и 1С выпустит обновление, вам придется вручную обновлять вашу внешнюю печатную форму, повторяя в ней все изменения из типовой.

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

← На главную