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