Почему возникают ошибки при открытии внешнего отчета на управляемых формах и как их исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разработка отчетов в среде 1С:Предприятие 8.3 на управляемых формах часто сопровождается рядом типичных ошибок, особенно когда разработчик пытается перенести логику формирования отчета из обычных форм или из модуля объекта напрямую в модуль формы. Рассмотрим, почему возникают ошибки типа «Тип не определен» и как правильно организовать работу с системой компоновки данных (СКД).

Разбираем причины возникновения ошибок

Основная проблема, с которой сталкиваются разработчики — это попытка вызова серверных конструкторов (таких как КомпоновщикМакетаКомпоновкиДанных или ПроцессорКомпоновкиДанных) непосредственно в процедурах, исполняемых на клиенте. В управляемом приложении клиентская часть не имеет прямого доступа к серверному ядру СКД. Когда мы прописываем код формирования отчета в процедуре &НаКлиенте, платформа выдает ошибку, так как не может найти определения указанных типов.

Другая распространенная проблема связана с некорректным доступом к свойствам отчета. При работе с внешним отчетом внутри управляемой формы, объект ЭтотОбъект (или просто Отчет) в контексте формы является лишь «данными формы», а не полноценным прикладным объектом. Поэтому обращение к ЭтотОбъект.КомпоновщикНастроек или ЭтотОбъект.СхемаКомпоновкиДанных вызывает ошибку «Поле объекта не обнаружено».

Шаг 1: Правильная организация серверного вызова

Для корректного формирования отчета необходимо строго соблюдать архитектуру «Клиент-Сервер». Весь код, взаимодействующий с объектами СКД, должен располагаться в процедурах с директивой &НаСервере. В свою очередь, процедура на клиенте должна лишь инициировать вызов серверной процедуры.

Шаг 2: Получение доступа к объекту отчета

Чтобы получить доступ к полноценному объекту отчета и его свойствам (таким как СхемаКомпоновкиДанных или КомпоновщикНастроек), необходимо воспользоваться методом РеквизитФормыВЗначение. Это позволяет преобразовать «легкие» данные формы в полноценный прикладной объект, с которым можно полноценно работать на сервере.

Рассмотрим пример правильного кода для серверной процедуры:


&НаСервере
Процедура СформироватьНаСервере()
    // Получаем полноценный объект отчета из формы
    ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
    
    // Теперь мы имеем доступ к Схеме и Компоновщику настроек
    НастройкиОтчета = ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(
        ОтчетОбъект.СхемаКомпоновкиДанных, 
        НастройкиОтчета, 
        ДанныеРасшифровки);
    
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,, ДанныеРасшифровки);
    
    // Выводим в табличный документ
    ДокументРезультат = ЭтаФорма.Результат;
    ДокументРезультат.Очистить();
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры

Шаг 3: Рекомендации по отладке и кэшированию

Иногда даже при верном коде платформа может выдавать ошибки доступа или «не видеть» изменения в структуре метаданных. Это часто связано с особенностями кэширования конфигурации на стороне клиента.

  1. Очистка кэша: Если вы уверены в коде, но ошибка сохраняется, попробуйте удалить базу из списка и добавить ее заново. Это принудительно очистит локальный кэш пользователя.
  2. Перезапуск службы: В редких случаях помогает перезапуск службы сервера 1С, так как на стороне сервера могут зависнуть старые версии кэшированных данных.
  3. Архитектурный совет: По возможности, старайтесь не дублировать код формирования в формах. Используйте штатный механизм события ПриКомпоновкеРезультата в модуле объекта. Это позволяет системе выполнять инициализацию процессоров и вывод в автоматическом режиме, избавляя вас от написания лишних строк кода и риска совершить ошибку.

Соблюдение этих правил — разделение контекстов выполнения (клиент/сервер) и правильная работа с объектами через РеквизитФормыВЗначение — позволит вам избежать большинства проблем при разработке отчетов на управляемых формах.

← На главную