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