Разработка и Конфигурация · 11 мин
Что такое значение в 1С и как с ним работать
Разбираем, что такое значение в 1С: типы значений, проверка заполненности, преобразование типов, работа с NULL и пустыми ссылками, примеры кода.
В языке 1С:Предприятия термин «значение» — это базовое понятие: любые данные, с которыми работает программа, являются значениями определённого типа. Число в поле документа, строка наименования товара, ссылка на элемент справочника, дата проведения — всё это значения, каждое из которых имеет строго определённый тип.
Понимание природы значений критично для разработчика и администратора: большинство ошибок вида «Преобразование значения к типу Число не может быть выполнено» или пустых отчётов связаны именно с неправильной работой со значениями — несовпадением типов, незаполненными реквизитами, значениями NULL в запросах.
В этой статье разберём, какие типы значений существуют в 1С, чем пустое значение отличается от NULL, как проверять и преобразовывать значения в коде и в запросах, а также какие ошибки встречаются чаще всего.
Что такое значение и какие типы значений есть в 1С
Значение — это конкретная порция данных, хранящаяся в переменной, реквизите объекта или поле таблицы. Каждое значение принадлежит одному типу, который определяет, какие операции с ним допустимы. Например, числа можно складывать, строки — соединять, а ссылки — сравнивать на равенство.
Типы значений в 1С условно делятся на несколько групп:
- Примитивные типы: Число, Строка, Дата, Булево. Это базовые типы, которые встречаются в любой конфигурации.
- Ссылочные типы: СправочникСсылка, ДокументСсылка, ПеречислениеСсылка и другие. Значение такого типа — это ссылка на объект в базе данных, а не сам объект целиком.
- Служебные значения: Неопределено (значение не присвоено) и NULL (отсутствие данных в результате запроса).
- Коллекции значений: Массив, Структура, Соответствие, ТаблицаЗначений, СписокЗначений — контейнеры, хранящие наборы других значений.
- Объектные типы: СправочникОбъект, ДокументОбъект и другие — программные представления объектов базы данных, позволяющие читать и изменять их данные.
Узнать тип конкретного значения можно функцией ТипЗнч(Значение), а сравнить его с нужным типом — через Тип("ИмяТипа"). Это стандартный приём проверки перед выполнением операций, зависящих от типа.
Пустые значения: Неопределено, NULL и пустые ссылки
Одна из самых частых причин ошибок — путаница между разными видами «пустоты». В 1С существует несколько состояний, которые означают отсутствие данных, но ведут себя по-разному.
Неопределено — значение по умолчанию для переменных и реквизитов составного типа, которым ничего не присвоено. Оно означает: «значение не задано вовсе».
NULL — специальное значение, которое появляется только в результатах запросов. Оно возникает, когда левое соединение не нашло соответствия в правой таблице, или когда обращение идёт к реквизиту, отсутствующему у данного вида документа. NULL нельзя сравнивать через знак равенства — для проверки используется конструкция ЕСТЬ NULL в запросе или функция ЕСТЬNULL().
Пустая ссылка — это ссылка соответствующего типа, которая не указывает ни на один объект базы. Например, незаполненный реквизит «Контрагент» содержит пустую ссылку типа СправочникСсылка.Контрагенты. Проверить её можно методом Пустая() или сравнением с Справочники.Контрагенты.ПустаяСсылка().
Для примитивных типов пустыми считаются: число 0, пустая строка "", дата '00010101' и значение Ложь. Универсальная проверка для всех случаев — функция ЗначениеЗаполнено(), которая возвращает Ложь для любого из перечисленных пустых состояний.
Как проверить значение в коде
Проверка значений — рутинная операция, которая должна предшествовать любой логике, зависящей от заполненности данных. Ниже типовые приёмы.
Проверка заполненности реквизита перед использованием:
Если ЗначениеЗаполнено(Объект.Контрагент) Тогда
// работаем с контрагентом
Иначе
Сообщить("Не указан контрагент");
КонецЕсли;
Проверка типа значения перед операцией:
Если ТипЗнч(Параметр) = Тип("СправочникСсылка.Номенклатура") Тогда
// обработка ссылки на номенклатуру
КонецЕсли;
Проверка пустой ссылки явным сравнением:
Если СсылкаНаСклад = Справочники.Склады.ПустаяСсылка() Тогда
// склад не выбран
КонецЕсли;
- 1Определите, какой вид «пустоты» возможен: Неопределено, NULL, пустая ссылка или пустое примитивное значение
- 2Для универсальной проверки вызовите ЗначениеЗаполнено(Значение)
- 3Для значений из запроса примените ЕСТЬNULL(Поле, ЗначениеПоУмолчанию)
- 4Для ссылочных типов при необходимости проверьте Пустая() или сравните с ПустаяСсылка()
- 5Проверьте результат на тестовых данных, включая заведомо незаполненные реквизиты
Преобразование значений между типами
1С выполняет автоматическое преобразование типов только в ограниченном числе случаев. Чаще преобразование нужно делать явно, иначе возникнет ошибка исполнения.
Основные функции преобразования:
Число("123,45")— строка в число. Если строка не содержит корректного числа, возникнет ошибка.Строка(Значение)— любое значение в строковое представление.Дата("20260115")— строка в формате ГГГГММДД в дату.Формат(Значение, "ЧГ=; ДФ=dd.MM.yyyy")— управляемое форматирование для вывода пользователю.
Безопасный приём для преобразования строки в число — предварительная проверка через СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке() из стандартных подсистем или обработка через попытку/исключение. Это защищает код от падения на некорректном вводе пользователя.
В запросах преобразование типов выполняется функцией ВЫРАЗИТЬ(Поле КАК Число(15,2)). Это особенно важно для реквизитов составного типа: явное приведение ускоряет запрос и позволяет корректно соединять таблицы.
Попытка
Результат = Число(ВведеннаяСтрока);
Исключение
Сообщить("Введено нечисловое значение");
Результат = 0;
КонецПопытки;Значения в запросах: NULL, ЕСТЬNULL и соединения
Работа со значениями в языке запросов имеет свою специфику. Главное правило: любое левое соединение потенциально порождает NULL в полях правой таблицы, если соответствие не найдено.
Функция ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) заменяет NULL на указанное значение и делает отчёт предсказуемым:
ВЫБРАТЬ
Продажи.Номенклатура,
ЕСТЬNULL(Цены.Цена, 0) КАК Цена
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних() КАК Цены
ПО Продажи.Номенклатура = Цены.Номенклатура
Ещё один нюанс — сравнение значений разных типов в условии ГДЕ. Если параметр запроса имеет составной тип, а поле — конкретный ссылочный, сравнение может не сработать. Решение — привести поле через ВЫРАЗИТЬ или передавать параметр строго нужного типа.
Значения реквизитов составного типа
Реквизит составного типа может хранить значения нескольких типов — например, «Покупатель» может быть и физлицом, и организацией. Это удобно, но требует аккуратности.
При обращении к реквизиту составного типа в запросе через точку (например, Документ.Покупатель.ИНН) платформа неявно соединяет все таблицы возможных типов, что замедляет запрос и порождает NULL у несоответствующих видов. Поэтому для реквизитов составного типа рекомендуется сужать тип через ВЫРАЗИТЬ или отбирать только нужный вид оператором ВЫБОР КОГДА ... ТОГДА.
В коде перед обращением к свойству значения составного типа обязательно проверяйте его фактический тип через ТипЗнч() — иначе получите ошибку «Поле объекта не обнаружено».
Частые ошибки при работе со значениями
Большинство проблем у начинающих разработчиков связано с небольшим набором повторяющихся ситуаций.
Отдельно стоит упомянуть сравнение дат. Пустая дата '00010101' меньше любой реальной даты, поэтому условие «Дата >= &НачалоПериода» без проверки заполненности параметра может вернуть весь период с начала времён. Проверяйте параметры отчётов до выполнения запроса.
Как проверить результат
Строки без соответствия показывают значение по умолчанию (0 или прочерк)
Строки исчезают или в полях пусто без объяснения
Некорректный ввод перехватывается и выдаёт понятное сообщение
Программа падает с ошибкой преобразования
Сравниваются значения одного типа, пустые ссылки отфильтрованы
Условие не срабатывает из-за разных типов сравниваемых значений
FAQ
Чем отличается Неопределено от NULL в 1С?
Неопределено — значение переменной или реквизита, которому ничего не присвоено в коде. NULL — результат отсутствия данных в запросе, чаще всего из-за несработавшего левого соединения. Неопределено можно сравнивать через «=», а NULL — только через ЕСТЬ NULL.
Как проверить, заполнен ли реквизит любого типа?
Используйте универсальную функцию ЗначениеЗаполнено(Реквизит). Она возвращает Ложь для пустых ссылок, нуля, пустой строки, пустой даты, Неопределено и NULL, и Истину — для любого осмысленного значения.
Почему возникает ошибка «Преобразование значения к типу Число не может быть выполнено»?
Функция Число() получила строку, которую нельзя интерпретировать как число: с буквами, пробелами внутри, неправильным разделителем. Перед преобразованием очищайте строку от лишних символов и оборачивайте вызов в Попытка/Исключение.
Как в запросе заменить NULL на ноль или пустую строку?
Примените функцию ЕСТЬNULL(Поле, ЗначениеПоУмолчанию): например, ЕСТЬNULL(Остатки.Количество, 0). Тип подставляемого значения должен быть совместим с типом поля.
Что такое пустая ссылка и чем она опасна?
Пустая ссылка — значение ссылочного типа, не указывающее ни на один объект базы. Опасна тем, что обращение к её реквизитам через точку в коде вызывает ошибку. Проверяйте методом Пустая() или функцией ЗначениеЗаполнено() перед использованием.
Можно ли реквизиту назначить несколько типов значений?
Да, в свойствах реквизита можно отметить составной тип — например, строку и ссылку на справочник. Учтите, что составные типы усложняют запросы и замедляют соединения, поэтому используйте их только там, где это действительно нужно по логике учёта.
Что важно запомнить
Значение в 1С — это данные строго определённого типа. Различайте Неопределено, NULL и пустые ссылки, проверяйте заполненность через ЗначениеЗаполнено(), заменяйте NULL в запросах через ЕСТЬNULL и преобразовывайте типы явно — это устраняет большинство типовых ошибок.