Ошибки платформы 1С

Ошибка «Тип не определен» в 1С: причины и как исправить

Коротко

«Тип не определен (ИмяТипа)» означает, что в момент выполнения оператора Новый или функции Тип() платформа не нашла тип с таким именем в текущем контексте. Четыре главные причины: клиентский тип (ОписаниеОповещения, ДиалогВыбораФайла) вызван в серверном коде; опечатка в имени типа; внешняя компонента AddIn не подключена или недоступно расширение; несуществующий тип в тексте запроса (ССЫЛКА, ВЫРАЗИТЬ).

Лечится переносом кода под правильную директиву компиляции, исправлением имени, проверкой подключения компоненты и сверкой типа с метаданными через Метаданные.НайтиПоТипу().

Что означает ошибка «Тип не определен» в 1С 8.3

В 1С ошибка «Тип не определен» — это ошибка времени выполнения: интерпретатор дошёл до строки, где имя типа нужно превратить в реальный тип платформы, и не нашёл его. Имя типа в скобках сообщения — главная подсказка:

Тип не определен (ОписаниеОповещения)
Тип не определен (ТаблицаЗначении)
Тип не определен (AddIn.Scaner.ScanerDriver)

Важно понимать: набор доступных типов в 1С 8.3 зависит от контекста исполнения. Один и тот же оператор Новый ТекстовыйДокумент отработает в толстом клиенте и упадёт на сервере в клиент-серверной базе. Поэтому первый вопрос при разборе — не «есть ли такой тип вообще», а «есть ли такой тип там, где выполняется строка».

Тип не определен (ОписаниеОповещения): клиентские типы на сервере

Самый частый случай из практики — «1с тип не определен описаниеоповещения». ОписаниеОповещения, ДиалогВыбораФайла, ТекстовыйДокумент, ТабличныйДокумент (в части интерактивных методов) и другие интерфейсные типы существуют только на клиенте. Как только конструктор такого типа попадает в процедуру с директивой &НаСервере или в серверный общий модуль — код падает:

&НаСервере
Процедура ОбработатьНаСервере()
    // Падает: Тип не определен (ОписаниеОповещения)
    Оповещение = Новый ОписаниеОповещения("ЗавершениеВопроса", ЭтотОбъект);
КонецПроцедуры

Исправление — перенести создание оповещения и весь интерактив в клиентскую процедуру, а на сервер отдавать только обработку данных:

&НаКлиенте
Процедура ПередЗаписьюДокумента()
    Оповещение = Новый ОписаниеОповещения(
        "ЗавершениеВопроса", ЭтотОбъект);
    ПоказатьВопрос(Оповещение,
        "Провести документ?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры

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

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

Опечатка в имени типа в Новый и Тип()

Оператор Новый и функция Тип() принимают имя типа как есть, без подсказок конфигуратора внутри строковых литералов. Любая опечатка проявится только при выполнении:

// Падает: Тип не определен (ТаблицаЗначении)
ТЗ = Новый ТаблицаЗначении;   // пропущена "й"

// Падает: Тип не определен (СправочникСсылка.Номенклотура)
ИскомыйТип = Тип("СправочникСсылка.Номенклотура");

// Правильно
ТЗ = Новый ТаблицаЗначений;
ИскомыйТип = Тип("СправочникСсылка.Номенклатура");

Отдельная ловушка — конструктор по строке Новый("ИмяТипа") и имена объектов метаданных: тип существует, только если объект есть в конфигурации и в подключённых расширениях текущей базы. Код, переносимый между базами, часто падает именно здесь: в базе-источнике справочник был, в базе-приёмнике его нет — и Тип("СправочникСсылка.Скидки") роняет модуль.

Тип не определен AddIn: внешние компоненты

Ошибка «1с тип не определен addin» возникает, когда код создаёт объект внешней компоненты (Новый ("AddIn.Имя.Класс")), а компонента в этом сеансе и контексте не подключена. Тип AddIn.* регистрируется только после успешного ПодключитьВнешнююКомпоненту() — и действует именно там, где вызвано подключение:

&НаКлиенте
Процедура ПодключитьСканер()
    Подключено = ПодключитьВнешнююКомпоненту(
        "ОбщийМакет.КомпонентаСканера", "Scaner",
        ТипВнешнейКомпоненты.Native);
    Если Подключено Тогда
        Драйвер = Новый ("AddIn.Scaner.ScanerDriver");
    Иначе
        // Без подключения Новый упадёт:
        // Тип не определен (AddIn.Scaner.ScanerDriver)
        Сообщить("Компонента не подключена");
    КонецЕсли;
КонецПроцедуры

Проверьте по порядку:

  • ПодключитьВнешнююКомпоненту() вызвана до Новый и вернула Истина;
  • подключение и создание объекта выполняются в одном контексте: компонента, подключённая на клиенте, не даёт типа на сервере (и наоборот);
  • идентификатор в Новый ("AddIn.Идентификатор.Класс") совпадает со вторым параметром подключения, а имя класса — с манифестом компоненты;
  • разрядность и ОС компоненты соответствуют процессу: 32-битная DLL не поднимется в 64-битном сервере 1С.

Тип не определен в запросе: ССЫЛКА и ВЫРАЗИТЬ

Вариант «1с тип не определен запрос» платформа выдаёт на этапе компиляции текста запроса, указывая имя в кавычках: Тип не определен "Справочник.Заказы". Причина — в операторах ССЫЛКА, ВЫРАЗИТЬ ... КАК или ТИП() указан тип, которого нет в конфигурации, либо имя объекта написано с ошибкой:

ВЫБРАТЬ
    Продажи.Регистратор
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГДЕ
    // Падает, если документа РеализацияТоваров нет в конфигурации:
    Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваров
    // Та же ошибка в ВЫРАЗИТЬ:
    И ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваров).Контрагент = &Контрагент

Сверьте точное имя объекта в дереве метаданных конфигуратора — в запросе используется имя, а не синоним. Если тип приходит из расширения, ошибка появится в базе, где расширение отключено или не смонтировано. Для динамических запросов, собираемых конкатенацией строк, проверяйте существование типа заранее (см. следующий раздел), а не ловите исключение выполнения.

Запрос падает только на проде и непонятно, какого типа не хватает? Вставьте текст запроса в Консоль кода и попросите агента выполнить его и сверить упомянутые в ССЫЛКА/ВЫРАЗИТЬ типы с метаданными базы — он вернёт список отсутствующих объектов вместо голого текста исключения.

Директивы компиляции: куда на самом деле попадает код

Директивы &НаКлиенте, &НаСервере, &НаСервереБезКонтекста определяют, в каком контексте компилируется процедура — а значит, какие типы ей доступны. Типовые сценарии, когда ошибка появляется «внезапно»:

  • кусок кода перенесли из клиентской процедуры в серверную при рефакторинге — вместе с Новый ДиалогВыбораФайла;
  • общий модуль с флагами «Клиент» и «Сервер» одновременно: код компилируется в обоих контекстах, и клиентский тип в общей процедуре уронит серверный вызов;
  • процедура без директивы в модуле формы по умолчанию становится серверной (&НаСервере подразумевается только в модулях команд; в форме директива обязательна — её отсутствие само по себе ошибка компиляции);
  • код выполняется через Выполнить()/Вычислить() на сервере, хотя писался для клиента.

Правило простое: интерактив и файловые диалоги — только под &НаКлиенте; данные, запросы и объекты конфигурации — на сервере; обмен между ними — через параметры и возвращаемые значения, а не через общие переменные.

Проверка типа через Тип() и Метаданные.НайтиПоТипу

Если код должен работать в базах с разным составом метаданных (типовая + расширения, универсальные обработки), не полагайтесь на то, что тип существует, — проверяйте. Сама Тип("Имя") с несуществующим именем падает, поэтому оборачивайте её в Попытка, а принадлежность типа метаданным сверяйте через Метаданные.НайтиПоТипу():

&НаСервере
Функция ТипДоступен(ИмяТипа)
    Попытка
        ИскомыйТип = Тип(ИмяТипа);
    Исключение
        Возврат Ложь; // Тип не определен — имени нет в контексте
    КонецПопытки;
    // Для ссылочных типов дополнительно сверяем с метаданными
    Возврат Метаданные.НайтиПоТипу(ИскомыйТип) <> Неопределено;
КонецФункции

Если ТипДоступен("СправочникСсылка.Скидки") Тогда
    // безопасно работаем с типом
КонецЕсли;
НайтиПоТипу
Типтип, для которого ищется объект метаданных
ОбъектМетаданных; Неопределено

НайтиПоТипу() доступен на сервере, в толстом клиенте и во внешнем соединении — для тонкого клиента выносите проверку в серверную функцию. Для примитивных и универсальных типов (Строка, ТаблицаЗначений) он вернёт Неопределено — там достаточно первой проверки через Попытка.

Как найти строку падения по стеку

Сообщение об ошибке 1С показывает модуль, номер строки и стек вызовов — читайте его снизу вверх: последняя строка стека и есть место, где имя типа не разрешилось. В клиент-серверной базе обращайте внимание на маркер контекста в стеке: если падение в серверном вызове, ищите клиентский тип именно в серверной цепочке. В фоновых заданиях и веб-сервисах, где окно с ошибкой никто не увидит, фиксируйте полный стек в журнал регистрации:

Попытка
    ВыполнитьОбработкуДанных();
Исключение
    ЗаписьЖурналаРегистрации("ОбработкаДанных",
        УровеньЖурналаРегистрации.Ошибка, , ,
        ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    ВызватьИсключение;
КонецПопытки;

ПодробноеПредставлениеОшибки() сохранит и текст «Тип не определен (…)», и полный стек с номерами строк — этого достаточно, чтобы локализовать проблему без повторного воспроизведения.

В Консоли кода агент выполняет фрагменты в серверном контексте: вставьте падающий кусок и попросите воспроизвести ошибку — агент покажет стек, определит, что тип клиентский или отсутствует в метаданных, и предложит рабочий вариант переноса кода.

Частые ошибки при разборе «Тип не определен»

  • Чинят имя типа, а проблема в контексте. ОписаниеОповещения написан без опечаток — он просто вызван под &НаСервере. Сначала смотрите, где выполняется строка, потом — что в ней написано.
  • Путают с «Переменная не определена». Это разные ошибки: та — про имя переменной на этапе компиляции модуля, «Тип не определен» — про имя типа. Способы исправления не пересекаются.
  • Проверяют файловую базу и уверены, что в клиент-серверной будет так же. В файловом варианте толстого клиента серверный контекст не изолирован, и клиентские типы «случайно» работают. Тестируйте в клиент-серверной архитектуре или с включённой эмуляцией серверного контекста.
  • Создают объект AddIn до подключения компоненты или в другом контексте. Подключили на клиенте — создавайте на клиенте; для сервера подключайте отдельно в серверном коде.
  • Игнорируют расширения. Тип из расширения существует только там, где расширение подключено и активно. При переносе кода между базами сверяйте состав расширений, а в универсальном коде проверяйте тип через Метаданные.НайтиПоТипу().
  • Глушат исключение пустой Попыткой. Скрытая ошибка всплывёт дальше по коду в куда менее понятном виде. Логируйте ПодробноеПредставлениеОшибки() и пробрасывайте исключение.

Частые вопросы об ошибке «Тип не определен» в 1С

Почему «Тип не определен (ОписаниеОповещения)» возникает только на сервере?

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

Как проверить существование типа, не роняя код?

Оберните Тип("ИмяТипа") в Попытка…Исключение: на несуществующем имени функция сама выбрасывает «Тип не определен». Для ссылочных типов дополнительно проверьте Метаданные.НайтиПоТипу(): если вернулось Неопределено, объекта нет в конфигурации.

Что делать при «Тип не определен (AddIn.…)»?

Убедитесь, что ПодключитьВнешнююКомпоненту() вызвана до Новый и вернула Истина, что подключение и создание объекта идут в одном контексте (клиент или сервер), а идентификатор и имя класса совпадают с манифестом компоненты. Отдельно проверьте разрядность: 32-битная компонента не поднимется в 64-битном процессе сервера.

Тарифы

ИИ Консоль кода 1С

Лайт

Бесплатно
≈ 1,5 млн токенов

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно

Старт

1990 руб. в месяц
≈ 10 млн токенов

Для индивидуального использования

Выбрать тариф

Продвинутый

Популярный выбор
3990 руб. в месяц
≈ 25 млн токенов

Для интенсивного использования или команд

  • До 15 конфигураций
  • Встроенный агент запросов 1С
  • Свои подписки Codex, Claude и любые OpenAI-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка
Выбрать тариф