Как изменить наименование номенклатуры на наименование покупателя во внешней печатной форме УПД для БП 3.0

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

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

Постановка задачи и предварительные действия

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

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

Способ 1: Оптимизация через запрос (Рекомендуемый)

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


// В тексте запроса в функции получения данных для печати
// Находим место выбора полей из таблицы товаров
"ВЫБРАТЬ
|   ...
|   ВЫБОР
|       КОГДА РеализацияТоваровУслугТовары.НаименованиеДляПокупателя = """"
|           ТОГДА РеализацияТоваровУслугТовары.Номенклатура.Наименование
|       ИНАЧЕ РеализацияТоваровУслугТовары.НаименованиеДляПокупателя
|   КОНЕЦ КАК ТоварНаименование,
|   ..."

Использование конструкции ВЫБОР позволяет сразу получить готовое значение ТоварНаименование. Поскольку типовой макет УПД ищет именно этот параметр, нам не придется менять код вывода секций макета. Это наиболее чистый подход.

Способ 2: Доработка через постобработку таблицы данных

Иногда возникают ситуации, когда мы не можем или не хотим глубоко менять сложный типовой запрос (например, если он формируется динамически программным путем). В этом случае мы можем применить метод «дозагрузки» данных. Разберем ситуацию, когда данные сначала выбираются запросом, а затем модифицируются перед выводом в макет.

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


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

ЗапросДопДанных.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
РезультатДоп = ЗапросДопДанных.Выполнить().Выгрузить();

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

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

После того как данные добавлены в ТаблицаДокумента, переходим к процедуре ВывестиСчетФактуруВТабличныйДокумент (или аналогичной в УПД) и корректируем заполнение параметров области макета:


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

Анализ возможных ошибок

Разберем, почему может возникнуть ошибка на строке ТаблицаДокумента.Колонки.Добавить(...). В современных версиях БП 3.0 данные для печати УПД часто собираются через функцию СведенияОДокументеДляПечатиУПД. Эта функция возвращает структуру, в которой таблицы часто уже содержат все необходимые поля, если они были добавлены в конфигурацию. Если вы пытаетесь добавить колонку, которая уже есть в метаданных и попала в выборку, 1С выдаст исключение.

Рекомендация: Всегда проверяйте, не добавили ли вы этот реквизит в саму конфигурацию. Если реквизит является частью объекта Документ.РеализацияТоваровУслуг.Товары, то он может автоматически попадать в ТаблицаДокумента в зависимости от того, как написан основной запрос печати.

Использование штатного механизма «Номенклатура контрагентов»

Прежде чем писать код, проанализируем: возможно, стоит использовать типовой функционал 1С? В программе существует справочник НоменклатураКонтрагентов. Рассмотрим преимущества этого метода:

  1. Не нужно изменять структуру документа РеализацияТоваровУслуг.
  2. Наименования хранятся централизованно для каждого контрагента.
  3. Типовые механизмы ЭДО (электронного документооборота) умеют подтягивать эти данные автоматически.

Если вы решите пойти этим путем, в запросе печати нужно будет сделать ЛЕВОЕ СОЕДИНЕНИЕ с таблицей Справочник.НоменклатураКонтрагентов по условию соответствия вашей номенклатуры и владельца (контрагента).

Особенности для Электронного документооборота (ЭДО)

Выясним важный момент: если ваша компания отправляет УПД через ЭДО, то простая правка внешней печатной формы не изменит данные в XML-файле, который уходит клиенту. Внешняя печатная форма влияет только на визуализацию (PDF/печать на бумаге). Для изменения данных в ЭДО необходимо настраивать правила формирования электронного документа или использовать штатный механизм соответствий номенклатуры, о котором мы говорили выше.

Подведем итог: наиболее стабильным решением для ВПФ является модификация текста запроса с использованием оператора ВЫБОР. Это гарантирует правильное заполнение параметров макета и исключает ошибки дублирования колонок в таблице значений.

← На главную