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