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