Как программно получить ТТН из реализации и вывести данные в печатную форму УПД в 1С:ERP

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

В конфигурациях на платформе 1С:Предприятие 8.3, таких как 1С:ERP Управление предприятием, Комплексная автоматизация или Управление торговлей 11, часто возникает задача кастомизации печатных форм. Одной из популярных задач является вывод информации о связанных документах «Транспортная накладная» (ТТН) непосредственно в форму УПД, формируемую на основании документа «Реализация товаров и услуг» (РТУ).

Проблема заключается в том, что в типовой архитектуре ERP документ «Реализация товаров и услуг» не содержит прямого реквизита, указывающего на ТТН. Связь реализована «в обратную сторону»: в документе «Транспортная накладная» есть реквизит ДокументОснование, который ссылается на реализацию. Разберем подробно, как извлечь эти данные и интегрировать их в механизм печати.

Анализ структуры связей в 1С:ERP

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

Рассмотрим, как система получает этот текст. В программном коде типовых конфигураций за это отвечает специализированная функция. Проанализируем пример вызова из модуля формы:


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

Этот метод ищет все созданные на основании реализации транспортные накладные и формирует строку с их номерами и датами. Если нам нужна именно ссылка на объект (для получения дополнительных реквизитов ТТН), нам придется написать собственный запрос или воспользоваться критериями отбора.

Шаг 1: Получение связанных ТТН программным способом

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


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

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

Этот запрос позволяет нам получить все актуальные (не помеченные на удаление) документы ТТН. Если ваша задача — просто вывести номер и дату в строку [8] «Основание передачи» в УПД, то данных из запроса будет достаточно.

Шаг 2: Модификация механизма печати УПД

Печатная форма УПД является общей для многих документов. Основная логика ее формирования в ERP вынесена в модуль менеджера или специализированные обработки (например, Обработка.ПечатьОбщихФорм). Разберем по шагам, где именно нужно внести изменения.

Проанализируем процедуру ЗаполнитьТабличныйДокументУПД. В современных версиях ERP данные для печати собираются в структуру или таблицу значений ДанныеДляПечати. Наша задача — внедрить данные о ТТН в этот поток данных до того, как они будут переданы в макет.

  1. Создание расширения. Никогда не меняйте типовой код напрямую. Создайте расширение и добавьте в него модуль, в котором формируется УПД.
  2. Перехват подготовки данных. Используйте аннотацию &После для процедуры, подготавливающей данные для макета. Обычно это функция типа ПодготовитьДанныеДляПечатиУПД.
  3. Добавление поля в макет. Если вы хотите вывести ТТН в новое место, вам нужно добавить параметр в макет УПД (также через расширение).

Шаг 3: Пример кода для вывода в печатную форму

Посмотрим на пример реализации в модуле менеджера через расширение. Допустим, нам нужно дополнить строку основания информацией о транспортной накладной.


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

В данном примере мы используем ДанныеДляПечати — это коллекция, которая содержит поля, сопоставленные с именами параметров в макете .mxl. Модифицируя поле Основание, мы автоматически увидим изменения в напечатанном документе без правки самого макета в области строки [8].

Использование критериев отбора

Рассмотрим альтернативный способ получения ссылки, который часто бывает быстрее при разработке. В системе существует критерий отбора СвязанныеДокументы. Мы можем использовать его для поиска ТТН без написания ручных запросов к таблицам.


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

Этот метод удобен тем, что он универсален для любых связанных документов, однако запрос к конкретной таблице (как в Шаге 1) работает производительнее на больших объемах данных.

Важные нюансы при работе с ERP

Проанализируем ситуацию, когда УПД формируется не из документа «Реализация товаров и услуг», а из документа «Счет-фактура выданный». В этом случае ОбъектПечати будет ссылаться на счет-фактуру. Чтобы найти ТТН, вам сначала придется получить основание самого счета-фактуры (коим и будет являться реализация), и только потом искать ТТН. Всегда проверяйте тип объекта, который передается в печать, чтобы избежать ошибок Метод объекта не обнаружен.

Также стоит помнить, что в 1С:ERP существует несколько видов транспортных документов: «Транспортная накладная» и «Электронная транспортная накладная». Если ваша организация использует ЭТрН, поиск нужно производить по соответствующим типам метаданных.

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

  1. Определить источник связи (через ДокументОснование в ТТН).
  2. Выбрать метод получения данных (запрос, критерий отбора или типовая функция ТекстТТН).
  3. Внедрить получение данных в механизм печати УПД через расширение, используя модификацию структуры ДанныеДляПечати.

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

← На главную