Определение типа значения — одна из самых частых задач при разработке в 1С:Предприятие 8. Без этого невозможно корректно обработать данные, избежать ошибок при преобразованиях или реализовать универсальные алгоритмы. Новички часто путают типы значений (Число, Строка, Дата) с типами объектов (СправочникСсылка, ДокументОбъект), что приводит к трудноуловимым багам. В этой статье разберём все способы получения типа — от базовых функций до малоизвестных приёмов для опытных разработчиков.

Особенность платформы в том, что здесь нет жёсткой типизации: одна и та же переменная может хранить то число, то строку, то ссылку на объект. Это гибкость даёт и головную боль — без проверки типа легко получить ошибку"Ошибка приведения значения к типу". Мы рассмотрим не только стандартные методы вроде ТипЗнч, но и нюансы работы с динамическими типами в управляемых формах, где поведение может отличаться от обычных модулей.

1. Базовый метод: функция ТипЗнч

Стандартная функция ТипЗнч(<Параметр>) — первый инструмент, который должен знать каждый разработчик. Она возвращает строку с именем типа значения, например: "Число", "СправочникСсылка.Номенклатура" или "Структура".

Пример использования:

ТипДанных = ТипЗнч(100); // Вернёт"Число"

ТипДанных = ТипЗнч("Привет"); // Вернёт"Строка"

ТипДанных = ТипЗнч(Справочники.Номенклатура.НайтиПоНаименованию("Товар 1"));

  • ✅ Простота: один вызов — сразу результат
  • ✅ Работает во всех контекстах: и в тонком клиенте, и на сервере
  • ⚠️ Не различает Неопределён и Null (вернёт "Неопределено" для обоих)
  • ⚠️ Для ссылок на объекты возвращает составной тип (например, "СправочникСсылка.Контрагенты"), который нужно дополнительно разбирать
💡

Если нужно проверить именно"пустое" значение (а не тип), используйте конструкцию Значение = Неопределено ИЛИ Значение = NULL — функция ТипЗнч здесь не поможет.

2. Проверка конкретных типов: оператор ТИП

Когда требуется не просто узнать тип, а проверить соответствие ожидаемому, удобнее использовать оператор ТИП. Он возвращает Истина или Ложь, что идеально подходит для условных конструкций.

Синтаксис:

Если ТипЗнч(Переменная) = Тип("Число") Тогда

// Обработка числа

КонецЕсли;

Ключевые случаи применения:

  • 🔢 Проверка числовых значений перед математическими операциями
  • 📅 Валидация дат перед сравнениями (Тип("Дата"))
  • 🔗 Определение ссылочных типов (например, Тип("СправочникСсылка.Номенклатура"))
Чем отличается Тип от ТипЗнч?

Функция ТипЗнч возвращает строку с описанием типа существующего значения, а конструкция Тип("ИмяТипа") создаёт объект типа ОписаниеТипа, с которым можно сравнивать другие типы. Например, Тип("Число") — это не строка"Число", а специальный объект для сравнений.

Важный нюанс: для проверки ссылок на объекты метаданных (справочники, документы) нужно указывать полное имя типа, включая имя метаданного. Например:

Если ТипЗнч(Ссылка) = Тип("СправочникСсылка.Контрагенты") Тогда

// Это ссылка на справочник"Контрагенты"

КонецЕсли;

3. Работа с динамическими типами в управляемых формах

В управляемых формах тип значения может"меняться" в зависимости от контекста. Например, поле ввода (ПолеФормы) может возвращать разные типы в зависимости от того, что ввёл пользователь. Здесь ТипЗнч часто даёт неожиданные результаты.

Типичные проблемы:

  • 🎭 Поле с типом"Число" возвращает строку, если пользователь ввёл текст
  • 📅 Поле даты может содержать Неопределено, если не заполнено
  • 🔗 Поле выбора справочника возвращает либо ссылку, либо Неопределено, либо строку (если включён режим"Показывать наименование")

Решение — комбинировать проверки:

Значение = ЭлементыФормы.ПолеВвода.Значение;

Если ТипЗнч(Значение) = Тип("Строка") И Значение <>"" Тогда

// Пользователь ввёл текст

ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда

// Введено число

КонецЕсли;

📊 Какой метод проверки типов вы используете чаще?
ТипЗнч
Оператор ТИП
Проверка через ПОПЫТКА...ИСКЛЮЧЕНИЕ
Своя функция-обёртка

4. Продвинутый подход: функция Метаданные.Тип

Для работы с типами объектов метаданных (справочники, документы, регистры) полезна функция Метаданные.Тип. Она возвращает объект ОписаниеТипа, который можно использовать для сравнений или получения дополнительной информации.

Примеры:

// Получение типа справочника"Номенклатура"

ТипНоменклатуры = Метаданные.Справочники.Номенклатура.Тип;

// Проверка, что переменная содержит ссылку на номенклатуру

Если ТипЗнч(Ссылка) = ТипНоменклатуры Тогда

// Это номенклатура

КонецЕсли;

Преимущества метода:

СпособПреимуществаНедостатки
Тип("СправочникСсылка.Номенклатура")ПростотаПри переименовании справочника в метаданных код сломается
Метаданные.Справочники.Номенклатура.ТипАвтоматическое обновление при изменении метаданныхДлиннее записывать
Закешированное значение типаБыстродействиеНужно обновлять кэш при изменении конфигурации
💡

Используйте Метаданные.Тип для ссылочных типов в крупных проектах — это защитит код от ошибок при рефакторинге метаданных.

5. Обработка ошибок: конструкция ПОПЫТКА...ИСКЛЮЧЕНИЕ

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

Пример для безопасного преобразования строки в число:

Функция СтрокуВЧисло(Значение)

Попытка

Возврат Число(Значение);

Исключение

Возврат Неопределено; // или 0, или генерация своей ошибки

КонецПопытки;

КонецФункции;

Когда это уместно:

  • 🔄 Преобразование данных из внешних источников (JSON, XML, файлы)
  • 📊 Обработка пользовательского ввода с неизвестной структурой
  • 🔧 Работа с устаревшими данными, где типы могли измениться

☑️ Безопасное преобразование типов

Выполнено: 0 / 4

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

6. Работа с составными типами и коллекциями

Особую сложность представляют составные типы (Массив, Структура, Соответствие, ТаблицаЗначений) и коллекции объектов. Здесь ТипЗнч вернёт только общий тип контейнера, но не типы элементов внутри.

Примеры проблемных случаев:

Массив = Новый Массив;

Массив.Добавить(10);

Массив.Добавить("Строка");

// ТипЗнч(Массив) вернёт"Массив", но не покажет типы элементов

Структура = Новый Структура("Ключ1, Ключ2", 100,"Текст");

// ТипЗнч(Структура) =>"Структура"

Решения:

  1. Рекурсивная проверка элементов (для массивов и коллекций)
  2. Использование ТипЗнч для каждого элемента структуры по ключу
  3. Специализированные функции для типовых структур (например, проверка что все элементы массива — числа)

Пример рекурсивной проверки массива:

Функция ВсеЭлементыЧисла(Массив)

Для Каждого Элемент Из Массив Цикл

Если ТипЗнч(Элемент) <> Тип("Число") Тогда

Возврат Ложь;

КонецЕсли;

КонецЦикла;

Возврат Истина;

КонецФункции;

7. Специфические случаи: Null, Неопределён, пустые ссылки

Три"особенных" значения в , которые часто путают:

  • Неопределён — значение по умолчанию для неинициализированных переменных
  • NULL — специальное значение для ссылочных типов (например, пустая ссылка на справочник)
  • Пустая строка ("") — это полноценное значение типа"Строка"

Как их отличить:

Если Значение = Неопределено Тогда

// Переменная не инициализирована

ИначеЕсли Значение = NULL Тогда

// Это пустая ссылка (например, на справочник)

ИначеЕсли Значение ="" Тогда

// Пустая строка

КонецЕсли;

💡

Для проверки"пустоты" ссылочных полей в формах используйте свойство ПолеФормы.ЗначениеЗаполнено — оно возвращает Ложь для NULL и Неопределено.

Важный нюанс с NULL:

⚠️ Внимание: В некоторых версиях платформы 1С:Предприятие 8.3 поведение NULL в выражениях может отличаться. Например, конструкция Если Ссылка = NULL Тогда сработает, а Если Не Ссылка Тогда — нет. Всегда тестируйте логику работы с NULL на целевой версии платформы.

8. Создание универсальных функций для проверки типов

Для упрощения кода и уменьшения повторений полезно вынести часто используемые проверки в отдельные функции. Примеры:

1. Проверка что значение — число (включая пустые числа):

Функция ЭтоЧисло(Значение)

Возврат ТипЗнч(Значение) = Тип("Число") ИЛИ Значение = 0;

КонецФункции;

2. Проверка что значение — непустая строка:

Функция ЭтоНепустаяСтрока(Значение)

Возврат ТипЗнч(Значение) = Тип("Строка") И Значение <>"";

КонецФункции;

3. Проверка что значение — ссылка на конкретный справочник:

Функция ЭтоСсылкаНаНоменклатуру(Значение)

Возврат ТипЗнч(Значение) = Тип("СправочникСсылка.Номенклатура") И Значение <> NULL;

КонецФункции;

Преимущества такого подхода:

  • 🔄 Единообразие проверок по всему коду
  • 🛠 Легкость логики (изменил в одном месте — обновилось везде)
  • 📝 Улучшенная читаемость основного кода
💡

Выносите проверки типов в отдельные функции, если используете их более 2-3 раз в проекте. Это сократит объём кода и уменьшит количество ошибок.

FAQ: Частые вопросы по работе с типами в 1С

Как отличить пустую строку от Неопределён?

Пустая строка ("") — это полноценное значение типа"Строка", а Неопределён означает что переменная не инициализирована. Используйте явную проверку:

Если Значение = Неопределено Тогда

// Переменная не инициализирована

ИначеЕсли Значение ="" Тогда

// Пустая строка

КонецЕсли;

Почему ТипЗнч возвращает"Неопределено" для NULL?

Это особенность платформы: NULL и Неопределён с точки зрения ТипЗнч неразличимы. Для точного определения используйте сравнение:

Если Значение = NULL Тогда

// Это NULL (пустая ссылка)

ИначеЕсли Значение = Неопределено Тогда

// Это Неопределён

КонецЕсли;

Как проверить тип элемента в ТаблицеЗначений?

Нужно получить значение ячейки и проверить его тип стандартными методами. Пример для колонки"Сумма":

Для Каждого Строка Из Таблица Цикл

Значение = Строка.Сумма;

Если ТипЗнч(Значение) <> Тип("Число") Тогда

// Обработка ошибки

КонецЕсли;

КонецЦикла;

Можно ли получить тип динамически созданного объекта?

Да, даже для объектов, созданных через Новый, функция ТипЗнч работает корректно:

Объект = Новый Структура("Поле1, Поле2", 10,"Текст");

Сообщить(ТипЗнч(Объект)); // Вернёт"Структура"

Как узнать тип поля в управляемой форме до ввода данных?

Используйте свойство ПолеФормы.ТипЗначения — оно возвращает ожидаемый тип поля согласно настройкам формы:

ОжидаемыйТип = ЭлементыФормы.ПолеВвода.ТипЗначения;

Если ОжидаемыйТип = Тип("Число") Тогда

// Поле предназначено для чисел

КонецЕсли;