При работе с платформой «1С:Предприятие 8.3» разработчики и администраторы иногда сталкиваются с диагностическим сообщением «Конструктор не обнаружен». Эта ошибка может сбить с толку, так как она часто возникает в типовых механизмах (например, при запуске глобального поиска) или при использовании внешних обработок, которые ранее работали корректно. Рассмотрим подробнее, почему возникает эта ситуация, проанализируем стек вызовов и разберем по шагам методы решения проблемы.
Давайте проанализируем типичный сценарий возникновения ошибки. В сообщении №5 лога системы мы видим следующую последовательность:
{ОбщийМодуль.ГлобальныйПоискКлиент.Модуль(108)}: Возврат Вычислить("Новый ПланГлобальногоПоиска");
{ОбщийМодуль.ГлобальныйПоискКлиент.Модуль(123)}: ПланПоиска = НовыйПланГлобальногоПоиска;
Здесь система пытается создать объект типа ПланГлобальногоПоиска. Ошибка «Конструктор не обнаружен» в данном контексте означает, что платформа «не знает» о существовании такого типа данных или не может инициализировать его через оператор Новый. Это кажется странным, если вы используете современную версию платформы (например, 8.3.16 или выше), где этот объект официально задекларирован. Выясним причину этого противоречия.
Это самая распространенная причина. Платформа 1С развивается итерационно: в каждой новой версии (8.3.14, 8.3.15, 8.3.20 и т.д.) добавляются новые типы объектов и методы. Однако для обеспечения стабильности старых прикладных решений в свойствах конфигурации предусмотрен параметр «Режим совместимости».
Рассмотрим ситуацию: вы используете платформу версии 8.3.16, но в свойствах вашей конфигурации установлен режим совместимости «Версия 8.3.14». Объект ПланГлобальногоПоиска был добавлен только в версии 8.3.15. Несмотря на то что физически файлы платформы поддерживают этот объект, программный интерфейс для конкретной базы данных «обрезан» настройками совместимости. Платформа намеренно скрывает конструктор объекта, чтобы код вел себя так же, как на старой версии.
Как проверить и исправить:
Обратим внимание на строку Возврат Вычислить("Новый ПланГлобальногоПоиска");. Разработчики Библиотеки Стандартных Подсистем (БСП) часто используют функцию Вычислить, чтобы написать универсальный код, который не будет вызывать ошибку компиляции на старых платформах. Если бы в модуле было написано напрямую План = Новый ПланГлобальногоПоиска, конфигуратор просто не дал бы сохранить модуль на версии 8.3.14.
Использование Вычислить позволяет коду «проскочить» проверку при сохранении, но в момент реальной работы (Runtime), когда интерпретатор пытается выполнить эту строку, он не находит описание конструктора в текущем пространстве имен. Это классический пример того, как механизмы адаптации БСП сталкиваются с реальными ограничениями версии.
Чтобы избежать подобных исключений в собственном коде, разберем пример безопасной инициализации объекта:
Попытка
ПланПоиска = Вычислить("Новый ПланГлобальногоПоиска");
Исключение
// Если конструктор не обнаружен, значит платформа или режим
// совместимости не поддерживают данный функционал
ПланПоиска = Неопределено;
КонецПопытки;
Иногда ошибка возникает после миграции базы данных (например, переезд с файлового варианта на PostgreSQL или смена сервера приложений), даже если режимы совместимости настроены верно. Причина кроется в «протухании» кэша. Клиентское приложение хранит часть метаданных локально, и если структура объектов изменилась или была обновлена платформа, старый кэш может ссылаться на несуществующие или некорректные дескрипторы объектов.
Разберем процедуру очистки кэша:
%AppData%\1C\1Cv8%LocalAppData%\1C\1Cv8Также полезно использовать параметр запуска /ClearCache в дополнительных параметрах командной строки для конкретной информационной базы.
В сообщении №10 упоминается ошибка в обработке икВыгрузкаПлатежныхДокументовВГИСЖКХ на строке 960. В таких отраслевых решениях причина часто отличается от режима совместимости. Рассмотрим ситуацию, когда код пытается создать внешний объект, например:
// Пример кода, который может вызвать ошибку конструктора
КриптоМенеджер = Новый МенеджерКриптографии("", "", 75);
// Или
Excel = Новый COMОбъект("Excel.Application");
Если в системе не установлен соответствующий криптопровайдер или не инсталлирован пакет Microsoft Office, платформа 1С может выдать ошибку «Конструктор не обнаружен», так как она не может инициализировать системную библиотеку, стоящую за этим объектом. Выясним, установлен ли нужный софт на сервере или клиенте (в зависимости от того, где выполняется код).
Некоторые объекты 1С доступны только в определенных контекстах выполнения. Например, ПланГлобальногоПоиска — это чисто клиентский объект. Он доступен в тонком, толстом и веб-клиенте. Если вы попытаетесь вызвать создание этого объекта внутри серверной процедуры (директива &НаСервере) или в фоновом задании, система может вернуть ошибку отсутствия конструктора, так как на стороне сервера этого типа данных в принципе не существует.
Проанализируем контекст выполнения перед вызовом:
#Если Клиент Тогда
// Здесь создание объекта ПланГлобальногоПоиска будет легальным
План = Новый ПланГлобальногоПоиска;
#Иначе
// На сервере код создания вызовет ошибку
ЗаписьЖурналаРегистрации("Ошибка",,,,"Попытка создания клиентского объекта на сервере");
#КонецЕсли
Подводя итог, для устранения ошибки «Конструктор не обнаружен» мы рекомендуем придерживаться следующего алгоритма:
ПланГлобальногоПоиска нужен режим «Не использовать» или версия не ниже 8.3.15./ЗапуститьОбновлениеИнформационнойБазы).Соблюдение этих правил поможет вам быстро локализовать и устранить проблему, обеспечив стабильную работу информационной системы.