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