Часто возникают ситуации, когда контрагенты требуют, чтобы в печатных формах (например, в ТОРГ-12) товары были указаны под их собственными наименованиями, которые отличаются от номенклатуры в вашей учетной системе. Попытки автоматизировать это через прямую загрузку из Excel при каждом формировании документа ведут к ошибкам и дублированию данных. Рассмотрим правильный архитектурный подход к решению этой задачи внутри 1С.
Использование внешних файлов Excel как источника данных для формирования печатных форм — это неэффективная практика. Она разрывает целостность данных и требует постоянного ручного вмешательства. Вместо того чтобы «прогибать» печатную форму под файлы заказчика, перенесем логику хранения соответствий непосредственно в 1С. Это обеспечит надежность, возможность аудита и автоматизацию процесса.
Наилучшим инструментом для связи вашей номенклатуры и номенклатуры поставщика является Регистр сведений. Это позволит хранить уникальное соответствие «Контрагент — ВашаНоменклатура — НаименованиеДляПечати».
Регистр сведений (можно через расширение).Контрагент (тип СправочникСсылка.Партнеры), Номенклатура (тип СправочникСсылка.Номенклатура), Характеристика (опционально).НаименованиеДляПечати (тип Строка).Такая структура позволяет гибко управлять данными: если для одного контрагента нужно несколько вариантов наименования, мы всегда можем расширить ключ регистра или добавить фильтры.
Распространенная ошибка — попытка получить данные запросом внутри цикла обхода строк табличной части. Это ведет к низкой производительности и риску того, что во все строки будет подставлено одно и то же наименование. Рассмотрим правильный алгоритм.
Шаг 1: Сбор данных. Вместо запроса внутри цикла, соберем все номенклатурные позиции документа в массив или список значений.
Шаг 2: Один запрос к регистру. Получим все необходимые соответствия за один вызов базы данных:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Соответствие.Номенклатура КАК Номенклатура,
| Соответствие.НаименованиеДляПечати КАК НаименованиеДляПечати
|ИЗ
| РегистрСведений.СоответствиеНоменклатурыКонтрагентов КАК Соответствие
|ГДЕ
| Соответствие.Контрагент = &Контрагент
| И Соответствие.Номенклатура В(&СписокНоменклатуры)";
Запрос.УстановитьПараметр("Контрагент", СсылкаНаОбъект.Партнер);
Запрос.УстановитьПараметр("СписокНоменклатуры", МассивНоменклатуры);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Шаг 3: Вывод данных. Выгрузим результат в Соответствие, где ключом будет ссылка на номенклатуру. В цикле обхода строк документа мы просто будем обращаться к этому соответствию:
// В цикле обхода строк ТЧ Товары:
ТекущаяНоменклатура = СтрокаТовары.Номенклатура;
НаименованиеДляПечати = Соответствие.Получить(ТекущаяНоменклатура);
Если ЗначениеЗаполнено(НаименованиеДляПечати) Тогда
СтрокаПечатнойФормы.Наименование = НаименованиеДляПечати;
Иначе
СтрокаПечатнойФормы.Наименование = ТекущаяНоменклатура.Наименование;
КонецЕсли;
Если у вас возникает ситуация, когда для одной номенклатуры существует несколько записей в регистре (например, для разных условий или периодов), убедитесь, что ваш запрос содержит все необходимые фильтры. Если нужно выводить уникальные наименования, используйте Характеристику в измерениях регистра. Всегда ограничивайте выборку в ГДЕ конкретными значениями из документа: Номенклатура = &Номенклатура И Характеристика = &Характеристика.
Переход на хранение соответствий в Регистре сведений дает вам следующие преимущества:
Excel при каждом открытии формы.Excel в этот регистр один раз, чтобы не заполнять данные вручную.Таким образом, мы превращаем «болото» ручной правки документов в стройную систему управления мастер-данными контрагентов, что значительно упрощает работу как программистам, так и пользователям.