Как в 1С:ERP при печати ТОРГ-12 заменить данные контрагента на данные партнера?

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

При оформлении отгрузок в современных конфигурациях на платформе «1С:Предприятие 8» (таких как 1С:ERP, 1С:Комплексная автоматизация 2 и 1С:Управление торговлей 11) пользователи часто сталкиваются с необходимостью кастомизации печатных форм. Типичный пример — требование выводить в полях «Грузополучатель» и «Поставщик» товарной накладной ТОРГ-12 данные управленческого партнера (фактического клиента или конкретной торговой точки) вместо юридического контрагента. В этой статье мы подробно разберем, как решить эту задачу правильно с точки зрения методологии учета и как реализовать изменения на уровне программного кода.

Важное методологическое предупреждение

Прежде чем вносить изменения в логику системы, давайте проанализируем разницу между сущностями в ERP-решениях 1С. В системе реализовано жесткое разделение:

Важно помнить: Товарная накладная ТОРГ-12 является регламентированным первичным учетным документом. Согласно законодательству РФ, в полях «Грузополучатель» и «Поставщик» должны фигурировать именно юридические лица с их официальными реквизитами. Вывод данных управленческого партнера вместо официального контрагента может привести к тому, что налоговые органы признают документ недействительным, а покупатель потеряет право на вычет НДС или признание расходов. Обязательно согласуйте эти изменения с бухгалтерией предприятия перед внедрением доработки.

Вариант 1. Типовые решения без изменения кода

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

Способ А. Использование реквизитов печати ТОРГ-12 в документе

В документе «Реализация товаров и услуг» предусмотрена возможность ручной корректировки печатных данных:

  1. Откроем документ реализации и перейдем на вкладку «Дополнительно».
  2. Найдем и нажмем на гиперссылку «Реквизиты печати ТОРГ-12 / Акта на передачу прав».
  3. В открывшемся окне мы можем вручную выбрать другого контрагента-грузополучателя, изменить адрес доставки или указать индивидуальные сведения для печати.

Способ Б. Механизм обособленных подразделений

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

  1. Для головного контрагента создадим подчиненного контрагента с видом «Обособленное подразделение».
  2. В договоре с клиентом включим настройку «Разрешена работа с дочерними партнерами».
  3. При оформлении документов мы сможем выбирать нужного партнера-получателя, а система автоматически подставит корректного контрагента (филиал) для регламентированной печати ТОРГ-12.

Вариант 2. Программное решение (для разработчика)

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

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

Шаг 1. Получение ссылки на партнера из документа

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


// Получаем ссылку на Партнера (Клиента) из документа реализации
ПартнерСсылка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДанныеПечати.Ссылка, "Партнер");

Шаг 2. Получение контактной информации партнера через механизмы БСП

Для корректного извлечения фактического или юридического адреса партнера воспользуемся общим модулем УправлениеКонтактнойИнформацией:


// Определяем вид контактной информации (например, Фактический адрес партнера)
ВидАдреса = Справочники.ВидыКонтактнойИнформации.ФактическийАдресПартнера;

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

// Получаем наименование партнера для вывода в форму
НаименованиеПартнера = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПартнерСсылка, "Наименование");

Шаг 3. Интеграция изменений в запрос печатной формы (Оптимальный метод)

Использовать метод ОбщегоНазначения.ЗначениеРеквизитаОбъекта внутри цикла печати документов крайне неэффективно, так как это порождает избыточные запросы к базе данных (проблема N+1 запроса). Гораздо правильнее изменить сам запрос, собирающий данные для печати ТОРГ-12.

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


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

Запрос.УстановитьПараметр("МассивДокументов", МассивДокументов);
Запрос.УстановитьПараметр("ВидАдреса", Справочники.ВидыКонтактнойИнформации.ФактическийАдресПартнера);

РезультатЗапроса = Запрос.Выполнить();

Внедрив данный запрос в процедуру формирования данных печати ТОРГ-12, мы получим оптимизированное решение, которое работает быстро даже при пакетной печати большого объема документов. В дальнейшем полученные переменные ПартнерНаименование и ПартнерАдресФактический мы передаем в структуру сведений о грузополучателе вместо аналогичных полей контрагента.

← На главную