Почему возникает ошибка «Тип не определен (КонструкторСхемыКомпоновкиДанных)» в тонком клиенте?

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

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

Причина возникновения ошибки

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

Способ решения 1: Настройка параметров формы

Часто ошибка возникает не из-за того, что вы напрямую вызываете конструктор, а из-за того, что механизм инициализации отчета требует правильной передачи параметров на сервер. Как показала практика, добавление процедур для управления настройками формы при создании на сервере позволяет корректно инициализировать отчет.

Рассмотрим пример кода, который помогает решить проблему инициализации:


Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    Настройки.ФормироватьСразу = Истина;
    Настройки.События.ПриСозданииНаСервере = Истина;
КонецПроцедуры

Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
    ОбъектыНазначения = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Форма.Параметры, "ОбъектыНазначения");
    Если ОбъектыНазначения <> Неопределено Тогда
        Форма.ФормаПараметры.УстановитьЗанчениеПараметра("Регистратор", ОбъектыНазначения);
    КонецЕсли;
КонецПроцедуры

Этот подход позволяет платформе правильно обработать параметры отчета, минуя попытки вызова недоступных в тонком клиенте конструкторов внутри стандартных библиотек.

Способ решения 2: Использование директив препроцессора

Если в вашем коде действительно присутствуют вызовы, которые требуют функционала конструктора (например, для специфической модификации схемы), вам необходимо ограничить выполнение этого кода только «Толстым клиентом». Для этого используйте директивы препроцессора #Если.

Разберем, как правильно обернуть проблемный код, чтобы он не вызывал ошибку в тонком клиенте:


#Если ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
    Конструктор = Новый КонструкторСхемыКомпоновкиДанных;
    // Дальнейшая работа с конструктором
#Иначе
    ТекстСообщения = НСтр("ru='Работа с конструктором схемы компоновки данных доступна только в толстом клиенте!'");
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ТекстСообщения;
    Сообщение.Сообщить();
#КонецЕсли

Важное замечание: использование директив — это способ «спрятать» код. Если логика работы отчета требует обязательной модификации схемы в тонком клиенте, вам следует отказаться от использования объекта КонструкторСхемыКомпоновкиДанных в пользу методов прямого изменения объекта СхемаКомпоновкиДанных.

Рекомендации по доработке кода

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

Следуя этим советам, вы сможете обеспечить стабильную работу вашего внешнего отчета как в толстом, так и в тонком клиенте 1С:Предприятие.

← На главную