К статье
Практический материал

Разработка и Конфигурация · 11 мин

Что такое значение в 1С и как с ним работать

Разбираем, что такое значение в 1С: типы значений, проверка заполненности, преобразование типов, работа с NULL и пустыми ссылками, примеры кода.

В языке 1С:Предприятия термин «значение» — это базовое понятие: любые данные, с которыми работает программа, являются значениями определённого типа. Число в поле документа, строка наименования товара, ссылка на элемент справочника, дата проведения — всё это значения, каждое из которых имеет строго определённый тип.

Понимание природы значений критично для разработчика и администратора: большинство ошибок вида «Преобразование значения к типу Число не может быть выполнено» или пустых отчётов связаны именно с неправильной работой со значениями — несовпадением типов, незаполненными реквизитами, значениями NULL в запросах.

В этой статье разберём, какие типы значений существуют в 1С, чем пустое значение отличается от NULL, как проверять и преобразовывать значения в коде и в запросах, а также какие ошибки встречаются чаще всего.

Что такое значение и какие типы значений есть в 1С

Значение — это конкретная порция данных, хранящаяся в переменной, реквизите объекта или поле таблицы. Каждое значение принадлежит одному типу, который определяет, какие операции с ним допустимы. Например, числа можно складывать, строки — соединять, а ссылки — сравнивать на равенство.

Типы значений в 1С условно делятся на несколько групп:

  • Примитивные типы: Число, Строка, Дата, Булево. Это базовые типы, которые встречаются в любой конфигурации.
  • Ссылочные типы: СправочникСсылка, ДокументСсылка, ПеречислениеСсылка и другие. Значение такого типа — это ссылка на объект в базе данных, а не сам объект целиком.
  • Служебные значения: Неопределено (значение не присвоено) и NULL (отсутствие данных в результате запроса).
  • Коллекции значений: Массив, Структура, Соответствие, ТаблицаЗначений, СписокЗначений — контейнеры, хранящие наборы других значений.
  • Объектные типы: СправочникОбъект, ДокументОбъект и другие — программные представления объектов базы данных, позволяющие читать и изменять их данные.

Узнать тип конкретного значения можно функцией ТипЗнч(Значение), а сравнить его с нужным типом — через Тип("ИмяТипа"). Это стандартный приём проверки перед выполнением операций, зависящих от типа.

Пустые значения: Неопределено, NULL и пустые ссылки

Одна из самых частых причин ошибок — путаница между разными видами «пустоты». В 1С существует несколько состояний, которые означают отсутствие данных, но ведут себя по-разному.

Неопределено — значение по умолчанию для переменных и реквизитов составного типа, которым ничего не присвоено. Оно означает: «значение не задано вовсе».

NULL — специальное значение, которое появляется только в результатах запросов. Оно возникает, когда левое соединение не нашло соответствия в правой таблице, или когда обращение идёт к реквизиту, отсутствующему у данного вида документа. NULL нельзя сравнивать через знак равенства — для проверки используется конструкция ЕСТЬ NULL в запросе или функция ЕСТЬNULL().

Пустая ссылка — это ссылка соответствующего типа, которая не указывает ни на один объект базы. Например, незаполненный реквизит «Контрагент» содержит пустую ссылку типа СправочникСсылка.Контрагенты. Проверить её можно методом Пустая() или сравнением с Справочники.Контрагенты.ПустаяСсылка().

Для примитивных типов пустыми считаются: число 0, пустая строка "", дата '00010101' и значение Ложь. Универсальная проверка для всех случаев — функция ЗначениеЗаполнено(), которая возвращает Ложь для любого из перечисленных пустых состояний.

Как проверить значение в коде

Проверка значений — рутинная операция, которая должна предшествовать любой логике, зависящей от заполненности данных. Ниже типовые приёмы.

Проверка заполненности реквизита перед использованием:

Если ЗначениеЗаполнено(Объект.Контрагент) Тогда

// работаем с контрагентом

Иначе

Сообщить("Не указан контрагент");

КонецЕсли;

Проверка типа значения перед операцией:

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

// обработка ссылки на номенклатуру

КонецЕсли;

Проверка пустой ссылки явным сравнением:

Если СсылкаНаСклад = Справочники.Склады.ПустаяСсылка() Тогда

// склад не выбран

КонецЕсли;

Порядок проверки значения
  1. 1
    Определите, какой вид «пустоты» возможен: Неопределено, NULL, пустая ссылка или пустое примитивное значение
  2. 2
    Для универсальной проверки вызовите ЗначениеЗаполнено(Значение)
  3. 3
    Для значений из запроса примените ЕСТЬNULL(Поле, ЗначениеПоУмолчанию)
  4. 4
    Для ссылочных типов при необходимости проверьте Пустая() или сравните с ПустаяСсылка()
  5. 5
    Проверьте результат на тестовых данных, включая заведомо незаполненные реквизиты

Преобразование значений между типами

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

Основные функции преобразования:

  • Число("123,45") — строка в число. Если строка не содержит корректного числа, возникнет ошибка.
  • Строка(Значение) — любое значение в строковое представление.
  • Дата("20260115") — строка в формате ГГГГММДД в дату.
  • Формат(Значение, "ЧГ=; ДФ=dd.MM.yyyy") — управляемое форматирование для вывода пользователю.

Безопасный приём для преобразования строки в число — предварительная проверка через СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке() из стандартных подсистем или обработка через попытку/исключение. Это защищает код от падения на некорректном вводе пользователя.

В запросах преобразование типов выполняется функцией ВЫРАЗИТЬ(Поле КАК Число(15,2)). Это особенно важно для реквизитов составного типа: явное приведение ускоряет запрос и позволяет корректно соединять таблицы.

bsl
Попытка
    Результат = Число(ВведеннаяСтрока);
Исключение
    Сообщить("Введено нечисловое значение");
    Результат = 0;
КонецПопытки;

Значения в запросах: NULL, ЕСТЬNULL и соединения

Работа со значениями в языке запросов имеет свою специфику. Главное правило: любое левое соединение потенциально порождает NULL в полях правой таблицы, если соответствие не найдено.

Функция ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) заменяет NULL на указанное значение и делает отчёт предсказуемым:

ВЫБРАТЬ

Продажи.Номенклатура,

ЕСТЬNULL(Цены.Цена, 0) КАК Цена

ИЗ

РегистрНакопления.Продажи.Обороты КАК Продажи

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних() КАК Цены

ПО Продажи.Номенклатура = Цены.Номенклатура

Ещё один нюанс — сравнение значений разных типов в условии ГДЕ. Если параметр запроса имеет составной тип, а поле — конкретный ссылочный, сравнение может не сработать. Решение — привести поле через ВЫРАЗИТЬ или передавать параметр строго нужного типа.

Значения реквизитов составного типа

Реквизит составного типа может хранить значения нескольких типов — например, «Покупатель» может быть и физлицом, и организацией. Это удобно, но требует аккуратности.

При обращении к реквизиту составного типа в запросе через точку (например, Документ.Покупатель.ИНН) платформа неявно соединяет все таблицы возможных типов, что замедляет запрос и порождает NULL у несоответствующих видов. Поэтому для реквизитов составного типа рекомендуется сужать тип через ВЫРАЗИТЬ или отбирать только нужный вид оператором ВЫБОР КОГДА ... ТОГДА.

В коде перед обращением к свойству значения составного типа обязательно проверяйте его фактический тип через ТипЗнч() — иначе получите ошибку «Поле объекта не обнаружено».

Частые ошибки при работе со значениями

Большинство проблем у начинающих разработчиков связано с небольшим набором повторяющихся ситуаций.

Типичные ошибки
01
Сравнение с NULL через «=» — условие молча не срабатывает, данные теряются из отчёта
02
Сложение числа со строкой без преобразования — ошибка исполнения или неожиданная конкатенация
03
Обращение к реквизиту через точку в коде без проверки пустой ссылки — ошибка «Значение не является значением объектного типа»
04
Использование ЗначениеЗаполнено() для проверки NULL из запроса — функция вернёт Ложь, но лучше подставить значение по умолчанию через ЕСТЬNULL ещё в запросе
05
Хранение чисел в строковом реквизите — сортировка и сравнение работают как для текста: «10» окажется меньше «2»

Отдельно стоит упомянуть сравнение дат. Пустая дата '00010101' меньше любой реальной даты, поэтому условие «Дата >= &НачалоПериода» без проверки заполненности параметра может вернуть весь период с начала времён. Проверяйте параметры отчётов до выполнения запроса.

Контрольные точки

Как проверить результат

Отчёт с левым соединением
Норма

Строки без соответствия показывают значение по умолчанию (0 или прочерк)

Тревожный признак

Строки исчезают или в полях пусто без объяснения

Преобразование строки в число
Норма

Некорректный ввод перехватывается и выдаёт понятное сообщение

Тревожный признак

Программа падает с ошибкой преобразования

Сравнение ссылок
Норма

Сравниваются значения одного типа, пустые ссылки отфильтрованы

Тревожный признак

Условие не срабатывает из-за разных типов сравниваемых значений

FAQ

Чем отличается Неопределено от NULL в 1С?

Неопределено — значение переменной или реквизита, которому ничего не присвоено в коде. NULL — результат отсутствия данных в запросе, чаще всего из-за несработавшего левого соединения. Неопределено можно сравнивать через «=», а NULL — только через ЕСТЬ NULL.

Как проверить, заполнен ли реквизит любого типа?

Используйте универсальную функцию ЗначениеЗаполнено(Реквизит). Она возвращает Ложь для пустых ссылок, нуля, пустой строки, пустой даты, Неопределено и NULL, и Истину — для любого осмысленного значения.

Почему возникает ошибка «Преобразование значения к типу Число не может быть выполнено»?

Функция Число() получила строку, которую нельзя интерпретировать как число: с буквами, пробелами внутри, неправильным разделителем. Перед преобразованием очищайте строку от лишних символов и оборачивайте вызов в Попытка/Исключение.

Как в запросе заменить NULL на ноль или пустую строку?

Примените функцию ЕСТЬNULL(Поле, ЗначениеПоУмолчанию): например, ЕСТЬNULL(Остатки.Количество, 0). Тип подставляемого значения должен быть совместим с типом поля.

Что такое пустая ссылка и чем она опасна?

Пустая ссылка — значение ссылочного типа, не указывающее ни на один объект базы. Опасна тем, что обращение к её реквизитам через точку в коде вызывает ошибку. Проверяйте методом Пустая() или функцией ЗначениеЗаполнено() перед использованием.

Можно ли реквизиту назначить несколько типов значений?

Да, в свойствах реквизита можно отметить составной тип — например, строку и ссылку на справочник. Учтите, что составные типы усложняют запросы и замедляют соединения, поэтому используйте их только там, где это действительно нужно по логике учёта.

Итог

Что важно запомнить

Значение в 1С — это данные строго определённого типа. Различайте Неопределено, NULL и пустые ссылки, проверяйте заполненность через ЗначениеЗаполнено(), заменяйте NULL в запросах через ЕСТЬNULL и преобразовывайте типы явно — это устраняет большинство типовых ошибок.