Привет, начинающие 1С-разработчики!
Когда вы пишете код на встроенном языке 1С или составляете запросы, ваши переменные, поля объектов или поля таблиц в базе данных могут содержать самые разные данные: числа, строки (текст), даты, ссылки на документы или справочники, и даже специальные значения вроде Неопределено
или NULL
. Иногда программе или запросу очень важно знать, какого именно типа значение хранится в данный момент. Почему? Чтобы избежать ошибок и чтобы логика работала правильно.
Представьте, вы хотите сложить два числа, а в одной из переменных вместо числа оказался текст. Попытка сложить число и текст вызовет ошибку! Или вы ожидаете получить из функции ссылку на клиента, а функция вернула Неопределено
, потому что клиента не нашла. Если вы попробуете использовать это Неопределено
как ссылку (например, получить ИНН клиента), снова будет ошибка. То же самое может произойти и внутри запроса, если пытаться оперировать с полями разных типов без проверки.
Вот для этого и нужна проверка типа значения. Давайте разберемся, как это делать в 1С – и во встроенном языке, и в языке запросов.
Зачем проверять тип значения в 1С?
- Предотвращение ошибок: Самая частая причина. Нельзя складывать строки с числами напрямую, нельзя вызывать методы объекта у значения
Неопределено
, нельзя применять строковые функции к числовому полю в запросе. Проверка типа перед операцией спасает от сбоев. - Разная логика: В зависимости от типа значения, ваша программа или запрос могут выполнять разные действия. Например, если в переменной число – умножить его на 2, если строка – вывести ее в сообщение. В запросе можно выбирать разные поля в зависимости от типа значения в другом поле.
- Обработка необязательных данных: Функции, поля объектов или поля таблиц могут быть не заполнены. Часто в таких случаях они возвращают
Неопределено
(в коде) или содержатNULL
(в базе данных). Нужно уметь это проверять, чтобы понять, есть ли данные для работы.
Как проверить тип в 1С?
1. Проверка типа во встроенном языке 1С
Здесь есть несколько способов узнать тип значения. Самые главные – это функция ТипЗнч()
и прямое сравнение со специальными значениями Неопределено
и NULL
.
Функция ТипЗнч()
Это основной инструмент для определения типа в коде. Она принимает на вход переменную (или любое значение), а возвращает… сам тип этого значения. Чтобы сравнить его с нужным типом, мы используем другую функцию – Тип()
, которая по строковому имени типа возвращает его описание.
Пример:
// Допустим, у нас есть переменная МояПеременная = 123; // Сейчас в ней число // Проверяем, является ли значение в переменной числом Если ТипЗнч(МояПеременная) = Тип("Число") Тогда Сообщить("В переменной хранится число!"); ИначеЕсли ТипЗнч(МояПеременная) = Тип("Строка") Тогда Сообщить("В переменной хранится строка!"); ИначеЕсли ТипЗнч(МояПеременная) = Тип("Дата") Тогда Сообщить("В переменной хранится дата!"); // И так далее для других типов... КонецЕсли; // Поменяем значение МояПеременная = "Привет, мир!"; // Снова проверим Если ТипЗнч(МояПеременная) = Тип("Строка") Тогда Сообщить("Теперь в переменной точно строка!"); КонецЕсли;
Какие типы можно указывать в Тип("...")
?
"Число"
,"Строка"
,"Дата"
,"Булево"
(Истина
/Ложь
)"Неопределено"
,"Null"
- Ссылки на объекты:
"СправочникСсылка.<ИмяСправочника>"
,"ДокументСсылка.<ИмяДокумента>"
и т.д. - И многие другие (Массив, Структура, Соответствие…)
Сравнение с Неопределено
и NULL
Эти два значения особенные и их следует проверять напрямую.
Неопределено
: Обозначает отсутствие значения в логике 1С (неинициализированная переменная, необязательный параметр, функция не вернула результат).NULL
: Чаще всего приходит из базы данных (пустое значение в поле таблицы SQL).
Проверить их можно простым сравнением:
ПеременнаяРезультат = МояФункцияКотораяМожетНичегоНеВернуть(); // Проверяем на Неопределено Если ПеременнаяРезультат = Неопределено Тогда Сообщить("Функция не вернула результат."); Иначе Сообщить("Результат функции: " + ПеременнаяРезультат); КонецЕсли; ЗначениеИзБазы = ПолучитьЗначениеПоляИзЗапроса(); // Представим, что функция вернула NULL Если ЗначениеИзБазы = NULL Тогда Сообщить("В базе данных для этого поля нет значения (NULL)."); ИначеЕсли ЗначениеИзБазы = Неопределено Тогда Сообщить("Значение не было получено (Неопределено)."); // Важно различать! Иначе Сообщить("Получено значение: " + ЗначениеИзБазы); КонецЕсли;
Вы можете проверить их и через ТипЗнч()
, но прямое сравнение (= Неопределено
, = NULL
) часто короче и нагляднее.
2. Проверка типа в языке запросов 1С
В запросах тоже часто нужно проверять типы, особенно когда работаете с составными типами данных (когда поле может хранить значения разных типов) или нужно отфильтровать записи с незаполненными полями (NULL
).
Основные инструменты в запросах:
Оператор ТИПЗНАЧЕНИЯ()
Это аналог функции ТипЗнч()
из встроенного языка. Он позволяет сравнить тип значения поля с конкретным типом.
ВЫБРАТЬ
Док.Ссылка,
Док.Контрагент // Поле составного типа (Справочник.Контрагенты, Справочник.ФизЛица)
ИЗ
Документ.РеализацияТоваровУслуг КАК Док
ГДЕ
// Выбираем только те документы, где Контрагент - это ссылка на справочник Контрагенты
ТИПЗНАЧЕНИЯ(Док.Контрагент) = ТИП(Справочник.Контрагенты)
Оператор ЕСТЬ NULL
(IS NULL)
Стандартный способ проверить, содержит ли поле значение NULL
(то есть, пусто в базе данных).
ВЫБРАТЬ
Контрагент.Ссылка,
Контрагент.Комментарий
ИЗ
Справочник.Контрагенты КАК Контрагент
ГДЕ
// Выбираем контрагентов, у которых поле Комментарий не заполнено (равно NULL)
Контрагент.Комментарий ЕСТЬ NULL
// Или наоборот - заполнено:
// Контрагент.Комментарий ЕСТЬ НЕ NULL
Оператор ССЫЛКА
Этот оператор проверяет, является ли значение поля ссылкой на объект определенного типа (или на любой объект указанной таблицы метаданных). Это особенно полезно для полей составного типа.
ВЫБРАТЬ
Док.Ссылка,
Док.Ответственный
ИЗ
Документ.ПоступлениеТоваровУслуг КАК Док
ГДЕ
// Выбираем документы, где Ответственный - это ссылка на любой справочник
Док.Ответственный ССЫЛКА Справочник
// ИЛИ конкретный справочник:
// Док.Ответственный ССЫЛКА Справочник.Пользователи
Пример из жизни (встроенный язык)
Представьте, у вас есть функция, которая ищет клиента по ИНН. Она может вернуть:
- Ссылку на клиента (если нашла одного).
Неопределено
(если клиент с таким ИНН не найден).- Массив ссылок (если нашлось несколько клиентов с одинаковым ИНН).
Как обработать результат?
РезультатПоиска = НайтиКлиентаПоИНН("1234567890"); Если ТипЗнч(РезультатПоиска) = Тип("СправочникСсылка.Контрагенты") Тогда // Нашли одного клиента Сообщить("Найден клиент: " + РезультатПоиска.Наименование); ИначеЕсли ТипЗнч(РезультатПоиска) = Тип("Массив") Тогда // Нашли несколько Сообщить("Найдено несколько клиентов с таким ИНН!"); Для Каждого Клиент Из РезультатПоиска Цикл Сообщить(" - " + Клиент.Наименование); КонецЦикла; ИначеЕсли РезультатПоиска = Неопределено Тогда // Ничего не нашли Сообщить("Клиент с таким ИНН не найден."); Иначе // Неожиданный результат? Сообщить("Функция вернула неожиданный тип данных: " + ТипЗнч(РезультатПоиска)); КонецЕсли;
Заключение
Проверка типа значения – это базовый, но очень важный навык для любого 1С-разработчика, как при написании кода, так и при составлении запросов. Она помогает писать надежный, предсказуемый код и эффективные запросы, избегать ошибок и корректно обрабатывать разные ситуации.
Запомните главное:
- В коде: Используйте
ТипЗнч(...) = Тип(...)
для большинства типов и прямое сравнение= Неопределено
/= NULL
для этих спецзначений. - В запросах: Используйте
ТИПЗНАЧЕНИЯ(...) = ТИП(...)
для проверки конкретных типов,ПОЛЕ ЕСТЬ NULL
для проверки наNULL
, иПОЛЕ ССЫЛКА ТипОбъекта
для проверки ссылочных типов.
Практикуйтесь, и скоро проверка типов станет для вас таким же естественным делом, как написание цикла или условия! Удачи вам в разработке!