Как заменить стандартную номенклатуру на номенклатуру партнера в печатной форме Счета на оплату

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

При работе с крупными контрагентами часто возникает необходимость выводить в печатных формах (например, в Счете на оплату) наименования товаров именно так, как они называются у клиента. В системе 1С:Предприятие 8 для этого используется справочник НоменклатураПартнеров. Разберем подробно, как правильно модифицировать внешнюю печатную форму (ВПФ), чтобы заменить стандартное название на партнерское, сохранив при этом возможность вывода обычного названия, если партнерское не заполнено.

Анализ проблемы и типичные ошибки

Рассмотрим ситуацию: разработчик берет типовую процедуру ЗаполнитьТабличныйДокументСчетаНаОплату и пытается вставить дополнительный запрос непосредственно в цикл вывода строк. Это приводит к двум проблемам:

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

Проанализируем структуру данных. В типовых конфигурациях (УТ 11, ERP, КА) данные для печати собираются заранее в структуру ДанныеДляПечати. Табличная часть товаров обычно выгружается в таблицу значений Товары. Наша задача — вмешаться в процесс формирования этой таблицы до того, как начнется цикл вывода в ТабличныйДокумент.

Способ №1: Модификация исходного запроса (рекомендуемый)

Самый правильный и «чистый» способ — изменить текст запроса, который собирает данные для печати. Обычно этот запрос находится в функции СформироватьДанныеДляПечати... в модуле менеджера объекта. В случае с ВПФ мы копируем этот код в модуль обработки.

Выясним, как соединить данные. Нам необходимо левое соединение с таблицей Справочник.НоменклатураПартнеров. Важно помнить, что связь должна идти не только по номенклатуре, но и по Партнеру, указанному в документе.

Рассмотрим пример кода запроса с использованием конструкции ВЫБОР:


// В тексте запроса добавляем левое соединение
"ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НоменклатураПартнеров КАК НоменклатураПартнера
ПО (НоменклатураПартнера.Номенклатура = ТаблицаТовары.Номенклатура)
И (НоменклатураПартнера.Владелец = &Партнер)
И (НоменклатураПартнера.Характеристика = ТаблицаТовары.Характеристика)"

// В поле ВЫБРАТЬ используем условие
"ВЫБОР
    КОГДА НоменклатураПартнера.Наименование ЕСТЬ НЕ NULL И НоменклатураПартнера.Наименование <> """"
        ТОГДА НоменклатураПартнера.Наименование
    ИНАЧЕ ТаблицаТовары.Номенклатура.НаименованиеПолное
КОНЕЦ КАК НаименованиеДляПечати"

Использование ЕСТЬ НЕ NULL гарантирует, что если связь не найдена, система корректно перейдет к стандартному наименованию.

Способ №2: Программная постобработка таблицы значений

Если вы не хотите менять сложный типовой запрос, можно воспользоваться методом «перехвата» таблицы Товары непосредственно в процедуре ЗаполнитьТабличныйДокументСчетаНаОплату. Рассмотрим, как это сделать по шагам.

Найдем в коде строку, где данные выгружаются в таблицу:

Товары = ДанныеДляПечати.РезультатПоТабличнойЧасти.Выгрузить();

Сразу после этой строки мы можем программно дополнить таблицу нужными данными. Проанализируем пример кода:


// 1. Получаем массив уникальных ссылок на номенклатуру из таблицы товаров
МассивНоменклатуры = Товары.ВыгрузитьКолонку("Номенклатура");
Партнер = ДанныеПечати.Партнер; // Ссылка на партнера из шапки

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

ЗапросНК.УстановитьПараметр("Партнер", Партнер);
ЗапросНК.УстановитьПараметр("МассивНоменклатуры", МассивНоменклатуры);

ТаблицаСоответствия = ЗапросНК.Выполнить().Выгрузить();
ТаблицаСоответствия.Индексы.Добавить("Номенклатура");

// 3. Обходим основную таблицу товаров и подменяем наименование
Для Каждого СтрокаТовара Из Товары Цикл
    ПараметрыПоиска = Новый Структура("Номенклатура", СтрокаТовара.Номенклатура);
    НайденныеСтроки = ТаблицаСоответствия.НайтиСтроки(ПараметрыПоиска);
    
    Если НайденныеСтроки.Количество() > 0 Тогда
        // Подменяем полное наименование, которое используется функцией формирования представления
        СтрокаТовара.НаименованиеПолное = НайденныеСтроки[0].НаименованиеПартнера;
    КонецЕсли;
КонецЦикла;

Этот подход хорош тем, что он не затрагивает логику формирования областей и параметров макета, которая идет ниже в типовом коде.

Использование поля «Содержание»

В типовых решениях 1С:УТ/ERP есть важная особенность: если в строке табличной части документа заполнено поле Содержание, печатная форма приоритетно выводит именно его. Выясним, как это использовать в коде. В процедуре печати часто встречается вызов функции:

НоменклатураКлиентСервер.ПредставлениеНоменклатурыДляПечати(...)

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

Важные замечания по характеристикам и упаковкам

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

Также не забудьте про Артикул. У номенклатуры партнера может быть свой артикул, отличный от вашего. Если требования заказчика включают вывод артикула клиента, вам потребуется добавить еще одну колонку в таблицу Товары и аналогично заполнить её данными из справочника НоменклатураПартнеров.

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

← На главную