Определение типа значения — одна из самых частых задач при разработке в 1С:Предприятие 8. Без этого невозможно корректно обработать данные, избежать ошибок при преобразованиях или реализовать универсальные алгоритмы. Новички часто путают типы значений (Число, Строка, Дата) с типами объектов (СправочникСсылка, ДокументОбъект), что приводит к трудноуловимым багам. В этой статье разберём все способы получения типа — от базовых функций до малоизвестных приёмов для опытных разработчиков.
Особенность платформы 1С в том, что здесь нет жёсткой типизации: одна и та же переменная может хранить то число, то строку, то ссылку на объект. Это гибкость даёт и головную боль — без проверки типа легко получить ошибку"Ошибка приведения значения к типу". Мы рассмотрим не только стандартные методы вроде ТипЗнч, но и нюансы работы с динамическими типами в управляемых формах, где поведение может отличаться от обычных модулей.
1. Базовый метод: функция ТипЗнч
Стандартная функция ТипЗнч(<Параметр>) — первый инструмент, который должен знать каждый разработчик. Она возвращает строку с именем типа значения, например: "Число", "СправочникСсылка.Номенклатура" или "Структура".
Пример использования:
ТипДанных = ТипЗнч(100); // Вернёт"Число"
ТипДанных = ТипЗнч("Привет"); // Вернёт"Строка"
ТипДанных = ТипЗнч(Справочники.Номенклатура.НайтиПоНаименованию("Товар 1"));
- ✅ Простота: один вызов — сразу результат
- ✅ Работает во всех контекстах: и в тонком клиенте, и на сервере
- ⚠️ Не различает
НеопределёниNull(вернёт"Неопределено"для обоих) - ⚠️ Для ссылок на объекты возвращает составной тип (например,
"СправочникСсылка.Контрагенты"), который нужно дополнительно разбирать
Если нужно проверить именно"пустое" значение (а не тип), используйте конструкцию Значение = Неопределено ИЛИ Значение = NULL — функция ТипЗнч здесь не поможет.
2. Проверка конкретных типов: оператор ТИП
Когда требуется не просто узнать тип, а проверить соответствие ожидаемому, удобнее использовать оператор ТИП. Он возвращает Истина или Ложь, что идеально подходит для условных конструкций.
Синтаксис:
Если ТипЗнч(Переменная) = Тип("Число") Тогда
// Обработка числа
КонецЕсли;
Ключевые случаи применения:
- 🔢 Проверка числовых значений перед математическими операциями
- 📅 Валидация дат перед сравнениями (
Тип("Дата")) - 🔗 Определение ссылочных типов (например,
Тип("СправочникСсылка.Номенклатура"))
Чем отличается Тип от ТипЗнч?
Функция ТипЗнч возвращает строку с описанием типа существующего значения, а конструкция Тип("ИмяТипа") создаёт объект типа ОписаниеТипа, с которым можно сравнивать другие типы. Например, Тип("Число") — это не строка"Число", а специальный объект для сравнений.
Важный нюанс: для проверки ссылок на объекты метаданных (справочники, документы) нужно указывать полное имя типа, включая имя метаданного. Например:
Если ТипЗнч(Ссылка) = Тип("СправочникСсылка.Контрагенты") Тогда
// Это ссылка на справочник"Контрагенты"
КонецЕсли;
3. Работа с динамическими типами в управляемых формах
В управляемых формах 1С тип значения может"меняться" в зависимости от контекста. Например, поле ввода (ПолеФормы) может возвращать разные типы в зависимости от того, что ввёл пользователь. Здесь ТипЗнч часто даёт неожиданные результаты.
Типичные проблемы:
- 🎭 Поле с типом"Число" возвращает строку, если пользователь ввёл текст
- 📅 Поле даты может содержать
Неопределено, если не заполнено - 🔗 Поле выбора справочника возвращает либо ссылку, либо
Неопределено, либо строку (если включён режим"Показывать наименование")
Решение — комбинировать проверки:
Значение = ЭлементыФормы.ПолеВвода.Значение;
Если ТипЗнч(Значение) = Тип("Строка") И Значение <>"" Тогда
// Пользователь ввёл текст
ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда
// Введено число
КонецЕсли;
4. Продвинутый подход: функция Метаданные.Тип
Для работы с типами объектов метаданных (справочники, документы, регистры) полезна функция Метаданные.Тип. Она возвращает объект ОписаниеТипа, который можно использовать для сравнений или получения дополнительной информации.
Примеры:
// Получение типа справочника"Номенклатура"
ТипНоменклатуры = Метаданные.Справочники.Номенклатура.Тип;
// Проверка, что переменная содержит ссылку на номенклатуру
Если ТипЗнч(Ссылка) = ТипНоменклатуры Тогда
// Это номенклатура
КонецЕсли;
Преимущества метода:
| Способ | Преимущества | Недостатки |
|---|---|---|
Тип("СправочникСсылка.Номенклатура") | Простота | При переименовании справочника в метаданных код сломается |
Метаданные.Справочники.Номенклатура.Тип | Автоматическое обновление при изменении метаданных | Длиннее записывать |
| Закешированное значение типа | Быстродействие | Нужно обновлять кэш при изменении конфигурации |
Используйте Метаданные.Тип для ссылочных типов в крупных проектах — это защитит код от ошибок при рефакторинге метаданных.
5. Обработка ошибок: конструкция ПОПЫТКА...ИСКЛЮЧЕНИЕ
Иногда проще попытаться привести значение к нужному типу и отловить ошибку, чем проверять тип заранее. Этот подход полезен для сложных случаев, где тип может быть неочевиден.
Пример для безопасного преобразования строки в число:
Функция СтрокуВЧисло(Значение)
Попытка
Возврат Число(Значение);
Исключение
Возврат Неопределено; // или 0, или генерация своей ошибки
КонецПопытки;
КонецФункции;
Когда это уместно:
- 🔄 Преобразование данных из внешних источников (JSON, XML, файлы)
- 📊 Обработка пользовательского ввода с неизвестной структурой
- 🔧 Работа с устаревшими данными, где типы могли измениться
☑️ Безопасное преобразование типов
Важно: не злоупотребляйте этим методом в высоконагруженных участках кода — обработка исключений замедляет выполнение.
6. Работа с составными типами и коллекциями
Особую сложность представляют составные типы (Массив, Структура, Соответствие, ТаблицаЗначений) и коллекции объектов. Здесь ТипЗнч вернёт только общий тип контейнера, но не типы элементов внутри.
Примеры проблемных случаев:
Массив = Новый Массив;
Массив.Добавить(10);
Массив.Добавить("Строка");
// ТипЗнч(Массив) вернёт"Массив", но не покажет типы элементов
Структура = Новый Структура("Ключ1, Ключ2", 100,"Текст");
// ТипЗнч(Структура) =>"Структура"
Решения:
- Рекурсивная проверка элементов (для массивов и коллекций)
- Использование
ТипЗнчдля каждого элемента структуры по ключу - Специализированные функции для типовых структур (например, проверка что все элементы массива — числа)
Пример рекурсивной проверки массива:
Функция ВсеЭлементыЧисла(Массив)
Для Каждого Элемент Из Массив Цикл
Если ТипЗнч(Элемент) <> Тип("Число") Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции;
7. Специфические случаи: Null, Неопределён, пустые ссылки
Три"особенных" значения в 1С, которые часто путают:
Неопределён— значение по умолчанию для неинициализированных переменных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,"Текст");
Сообщить(ТипЗнч(Объект)); // Вернёт"Структура"
Как узнать тип поля в управляемой форме до ввода данных?
Используйте свойство ПолеФормы.ТипЗначения — оно возвращает ожидаемый тип поля согласно настройкам формы:
ОжидаемыйТип = ЭлементыФормы.ПолеВвода.ТипЗначения;
Если ОжидаемыйТип = Тип("Число") Тогда
// Поле предназначено для чисел
КонецЕсли;