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