Как программно заполнить перечень всей номенклатуры в пункте 3 транспортной накладной в 1С?

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

При работе с типовыми конфигурациями 1С программисты часто сталкиваются с тем, что в печатной форме «Транспортная накладная» в Разделе 3 («Груз») выводится обобщенное название, например, «Товар». Однако требования контрагентов или особенности логистики могут требовать вывода полного перечня номенклатуры. В данной статье мы рассмотрим подробнее, как реализовать механизм автоматического сбора всех наименований товаров из документов-оснований и их корректного вывода в макет.

Анализ структуры макета и поиск нужного параметра

Для начала нам необходимо определить, куда именно программа передает данные. Откроем макет транспортной накладной в конфигураторе и найдем область, отвечающую за заполнение сведений о грузе. Как правило, это параметр с именем Пункт3_1 или аналогичный. Проанализируем ситуацию: если при изменении настроек в «Администрировании» (например, «Наименование груза для печати») текст меняется, значит, код обращается к конкретной структуре данных.

Разберем по шагам, как найти это место в коде:

  1. Найдем в модуле менеджера или в модуле печати документа процедуру, отвечающую за формирование печатной формы.
  2. Поищем строку кода, где получается область макета, например: Область = Макет.ПолучитьОбласть("Горизонталь...").
  3. Найдем заполнение параметра: Область.Параметры.Пункт3_1 = ... или использование метода Область.Параметры.Заполнить(СтруктураДанных).

Разработка функции сбора данных о номенклатуре

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

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

Ниже представлен пример реализации функции для получения списка товаров:


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

Интеграция полученных данных в печатную форму

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

Пример интеграции кода в процедуру печати:


// В месте, где заполняются параметры области Раздела 3
ИменаТоваров = ПолучитьСведенияОНоменклатуре(ДанныеПечати.Ссылка);

Если ЗначениеЗаполнено(ИменаТоваров) Тогда
    ОбластьМакета.Параметры.Пункт3_1 = ИменаТоваров;
Иначе
    // Если список пуст, можно оставить типовое заполнение
    ОбластьМакета.Параметры.Пункт3_1 = "Груз согласно товарным накладным";
КонецЕсли;

Важные нюансы при заполнении пункта 3

Рассмотрим подробнее несколько критических моментов, которые часто упускаются при такой доработке:

  1. Законодательные требования. Согласно Постановлению Правительства №2200, в пункте 3 желательно указывать не только названия, но и количество мест, вид упаковки и массу. Если грузов очень много, простая склейка имен через запятую может сделать документ нечитаемым.
  2. Размещение текста в макете. Перейдите в свойства ячейки Пункт3_1 в конфигураторе. Убедитесь, что свойство «Размещение текста» установлено в значение «Переносить». Если этого не сделать, длинная строка с перечнем товаров просто обрежется по границе ячейки.
  3. Дублирование позиций. В запросе выше мы использовали ВЫБРАТЬ РАЗЛИЧНЫЕ. Это необходимо, чтобы в случае, если один и тот же товар встречается в нескольких реализациях, привязанных к одной ТН, его название не дублировалось в печатной форме по многу раз.
  4. Длина строки. 1С имеет ограничения на объем текста в одной ячейке. Если список номенклатуры насчитывает сотни позиций, лучше использовать стандартную фразу «Груз согласно сопроводительной ведомости (УПД №...)» и прикладывать сам УПД, что допускается правилами перевозок.

Использование внешних печатных форм (ВПФ)

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

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

← На главную