При переходе с конфигураций на базе обычных форм (например, 1С:Управление торговлей ред. 10.3) на современные конфигурации с управляемыми формами (1С:Управление торговлей ред. 11) разработчики часто сталкиваются с изменениями в архитектуре подсистемы печати Библиотеки Стандартных Подсистем (БСП).
Если в 1С:УТ 10.3 получение договора и его заполнение в макете выполнялось одной строкой вида ОбластьМакета.Параметры.Договор = СсылкаНаОбъект.ДоговорКонтрагента;, то в 1С:УТ 11 процесс разделен на этап подготовки данных печатной формы и этап непосредственного вывода этих данных в макет. Разберем, как устроена подсистема печати в УТ 11 и как корректно передать реквизит договора в макет печатной формы счета на оплату.
Проанализируем процедуру заполнения макета печатной формы счета на оплату. В типовых конфигурациях УТ 11 формирование и заполнение табличного документа происходит с использованием служебной структуры или выборки ДанныеПечати.
Процедура заполнения печатной формы получает сформированные данные через аргумент ДанныеПечати:
Процедура ЗаполнитьРеквизитыШапкиСчетаНаОплату(ДанныеПечати, Макет, ТабличныйДокумент, ТаблицаЭтапыОплаты, ТаблицаТовары)
// Получение области и заполнение параметров из структуры ДанныеПечати
ОбластьМакета = Макет.ПолучитьОбласть("Грузополучатель");
СтруктураДанныхГрузополучатель = Новый Структура;
// Для вывода договора необходимо обратиться к свойству структуры
СтруктураДанныхГрузополучатель.Вставить("Договор", ДанныеПечати.Договор);
ОбластьМакета.Параметры.Заполнить(СтруктураДанныхГрузополучатель);
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецПроцедуры
Если обратиться к несуществующему полю структуры ДанныеПечати.Договор, система выдаст ошибку или вернет пустое значение. Выясним, почему так происходит.
Данные для печати собираются заранее в отдельной функции (обычно это функция модуля менеджера соответствующего документа, например, СформироватьДанныеПечатиСчетаНаОплату). В этой функции исполняется запрос к базе данных, который формирует структуру или таблицу с нужными полями.
Чтобы реквизит договора корректно выводился в счет на оплату, разберем порядок действий по шагам:
ДанныеПечати. Убедимся, что в тексте запроса выборки данных присутствует реквизит договора (например, ЗаказКлиента.Договор КАК Договор).ДанныеПечати в параметры области макета:
СтруктураДанныхШапки = Новый Структура;
СтруктураДанныхШапки.Вставить("Договор", ДанныеПечати.Договор);
ОбластьМакета.Параметры.Заполнить(СтруктураДанныхШапки);
ОбластьМакета.Параметры.Договор = ДанныеПечати.Договор;
ДанныеПечати уже передается ссылка на документ (поле ДанныеПечати.Ссылка), то получить реквизит договора можно непосредственно от нее:
ОбластьМакета.Параметры.Договор = ДанныеПечати.Ссылка.Договор;
Однако наиболее предпочтительным с точки зрения производительности является получение договора напрямую в исходном запросе формирования данных печати.После добавления соответствующего параметра с именем Договор в ячейку макета печатной формы (установив тип заполнения ячейки в значение Параметр) реквизит будет успешно выводиться при печати счета на оплату.