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