Ошибка «Тип не определен» в 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С
Лайт
Для ознакомления с возможностями
- Полный набор инструментов без урезаний
- Без ввода карты
Старт
Для индивидуального использования
- До 5 конфигураций
- Встроенный агент запросов 1С
-
≈ 100 задач Подробнее про лимиты
- Техническая поддержка
Продвинутый
Популярный выборДля интенсивного использования или команд
- До 15 конфигураций
- Встроенный агент запросов 1С
-
≈ 300 задач Подробнее про лимиты
-
Свои подписки Codex, Claude и любые OpenAI-совместимые
-
Внешние обработки без Конфигуратора
- Приоритетная техническая поддержка