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