Как выводить в печатной форме 1С наименования товаров контрагента вместо собственных?

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

Часто возникают ситуации, когда контрагенты требуют, чтобы в печатных формах (например, в ТОРГ-12) товары были указаны под их собственными наименованиями, которые отличаются от номенклатуры в вашей учетной системе. Попытки автоматизировать это через прямую загрузку из Excel при каждом формировании документа ведут к ошибкам и дублированию данных. Рассмотрим правильный архитектурный подход к решению этой задачи внутри 1С.

Отказ от использования Excel в печатных формах

Использование внешних файлов Excel как источника данных для формирования печатных форм — это неэффективная практика. Она разрывает целостность данных и требует постоянного ручного вмешательства. Вместо того чтобы «прогибать» печатную форму под файлы заказчика, перенесем логику хранения соответствий непосредственно в 1С. Это обеспечит надежность, возможность аудита и автоматизацию процесса.

Реализация через Регистр сведений

Наилучшим инструментом для связи вашей номенклатуры и номенклатуры поставщика является Регистр сведений. Это позволит хранить уникальное соответствие «Контрагент — ВашаНоменклатура — НаименованиеДляПечати».

  1. Создадим Регистр сведений (можно через расширение).
  2. Добавим измерения: Контрагент (тип СправочникСсылка.Партнеры), Номенклатура (тип СправочникСсылка.Номенклатура), Характеристика (опционально).
  3. Добавим ресурс: НаименованиеДляПечати (тип Строка).

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

Техническая реализация в печатной форме

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

Шаг 1: Сбор данных. Вместо запроса внутри цикла, соберем все номенклатурные позиции документа в массив или список значений.

Шаг 2: Один запрос к регистру. Получим все необходимые соответствия за один вызов базы данных:


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

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

Шаг 3: Вывод данных. Выгрузим результат в Соответствие, где ключом будет ссылка на номенклатуру. В цикле обхода строк документа мы просто будем обращаться к этому соответствию:


// В цикле обхода строк ТЧ Товары:
ТекущаяНоменклатура = СтрокаТовары.Номенклатура;
НаименованиеДляПечати = Соответствие.Получить(ТекущаяНоменклатура);

Если ЗначениеЗаполнено(НаименованиеДляПечати) Тогда
    СтрокаПечатнойФормы.Наименование = НаименованиеДляПечати;
Иначе
    СтрокаПечатнойФормы.Наименование = ТекущаяНоменклатура.Наименование;
КонецЕсли;

Как избежать проблем с выбором «последней записи»

Если у вас возникает ситуация, когда для одной номенклатуры существует несколько записей в регистре (например, для разных условий или периодов), убедитесь, что ваш запрос содержит все необходимые фильтры. Если нужно выводить уникальные наименования, используйте Характеристику в измерениях регистра. Всегда ограничивайте выборку в ГДЕ конкретными значениями из документа: Номенклатура = &Номенклатура И Характеристика = &Характеристика.

Преимущества данного подхода

Переход на хранение соответствий в Регистре сведений дает вам следующие преимущества:

Таким образом, мы превращаем «болото» ручной правки документов в стройную систему управления мастер-данными контрагентов, что значительно упрощает работу как программистам, так и пользователям.

← На главную