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

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

Значение в 1С: что это и как с ним работать

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

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

Понимание того, что такое значение, какие бывают типы значений и как платформа обрабатывает их при сравнении, присваивании и преобразовании, необходимо и разработчику, и продвинутому пользователю. Ошибки типа «Несоответствие типов» или «Преобразование значения к типу Число не может быть выполнено» возникают именно из-за непонимания этой базовой механики.

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

Что такое значение и чем оно отличается от переменной

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

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

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

Основные типы значений в платформе

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

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

Ссылочные типы — ссылки на объекты базы данных: справочники, документы, перечисления, планы счетов и т.д. Ссылка — это не сам объект, а указатель на него. Чтобы прочитать реквизиты, платформа обращается к базе, поэтому массовое обращение к реквизитам через точку в цикле — известный источник медленной работы.

Специальные значения — Неопределено, NULL и пустые ссылки. Неопределено означает «значение не задано» (например, функция не вернула результат). NULL приходит из запросов, когда соединение таблиц не нашло соответствия. Пустая ссылка — корректная ссылка определённого типа, не указывающая ни на один объект. Все три часто путают, хотя проверяются они по-разному.

НеопределеноЗначение не задано вовсе

Проверка: Значение = Неопределено

NULLНет данных из запроса

Проверка: значение ЕСТЬ NULL в запросе или функция ЕстьNULL()

Пустая ссылкаСсылка есть, объекта нет

Проверка: Ссылка.Пустая() или сравнение с пустой ссылкой типа

Пустая строкаСтрока нулевой длины

Проверка: ПустаяСтрока(Значение) или НЕ ЗначениеЗаполнено()

Универсальные коллекции значений

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

Это приводит к типичной ошибке: разработчик «копирует» таблицу значений присваиванием, меняет копию — и неожиданно меняется оригинал. Для реального копирования используются методы вроде Скопировать() у таблицы значений или конструктор с передачей массива.

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

Как проверить тип и заполненность значения

Платформа предоставляет встроенные функции для анализа значений. Базовый набор, который стоит знать наизусть: ТипЗнч() возвращает тип значения, Тип() создаёт тип по имени для сравнения, ЗначениеЗаполнено() проверяет, содержит ли значение что-то осмысленное.

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

bsl
Если ТипЗнч(Параметр) = Тип("СправочникСсылка.Номенклатура") Тогда
    // работаем как со ссылкой на номенклатуру
ИначеЕсли НЕ ЗначениеЗаполнено(Параметр) Тогда
    ВызватьИсключение "Параметр не заполнен";
КонецЕсли;

Для проверки типа в запросах используется другой механизм — оператор ССЫЛКА и функция ТИПЗНАЧЕНИЯ() языка запросов, а также ВЫРАЗИТЬ() для приведения составного типа к конкретному. Смешивать проверки встроенного языка и языка запросов нельзя: они работают на разных этапах обработки данных.

Преобразование значений и связанные риски

Явное преобразование выполняется функциями Число(), Строка(), Дата(), Булево(). Здесь кроется главный риск потери данных: функция Число(\"abc\") не вернёт ошибку аккуратно — она вызовет исключение, которое прервёт выполнение, если его не обработать. А Число(\"10,5\") и Число(\"10.5\") ведут себя по-разному в зависимости от региональных настроек сеанса.

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

Отдельная тема — преобразование значений в строку для запросов и СКД. Конкатенация значений в текст запроса вместо параметров — не только риск ошибок с датами и числами, но и уязвимость: всегда передавайте значения через параметры запроса.

Значения в настройках пользователя: отборы и параметры

Не только разработчики сталкиваются со значениями. В отборах динамических списков, настройках отчётов на СКД и параметрах обработок пользователь видит поле «Значение», куда нужно ввести или выбрать данные. Тип этого поля определяется сравниваемым полем: для отбора по контрагенту будет предложен выбор из справочника, для суммы — ввод числа.

Частая пользовательская ошибка — отбор «не срабатывает», потому что выбрано значение другого типа или задано условие «в списке» с одним элементом вместо «равно». Ещё одна ситуация: отбор по строковому полу с условием «содержит» не находит данные из-за лишних пробелов в базе. Проверить это можно, сделав отбор по точному равенству с скопированным из карточки объекта значением.

Маршрут решения

Как выбрать действие

Ошибка «Несоответствие типов» при сравненииПроверьте типы обеих сторон через ТипЗнч() в отладчике и приведите к одному типу
Функция вернула НеопределеноПроверьте все ветки кода — где-то нет Возврат, либо значение не присвоено
Отбор в отчёте ничего не находитСверьте тип и точное написание значения отбора с данными в базе
Число из файла не преобразуетсяОчистите строку от пробелов и проверьте разделитель дробной части

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

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

Типичные ошибки
01
Сравнение ссылки с Неопределено вместо проверки Пустая() — условие никогда не сработает, и объекты без заполненного реквизита пропускаются
02
Копирование таблицы значений присваиванием — изменения «копии» портят оригинал, итоги расходятся
03
Сложение числа и строки без явного преобразования — падение в момент выполнения на реальных данных
04
Игнорирование NULL в результате запроса — обращение к реквизиту через NULL даёт ошибку или пустые итоги
05
Проверка заполненности числа функцией ЗначениеЗаполнено() — ноль считается незаполненным, и корректные нулевые значения отбрасываются

Ещё одна группа ошибок связана с датами: сравнение даты со строкой, забытой границей периода и пустой датой '00010101'. Даты в 1С хранятся с точностью до секунды, поэтому сравнение «равно концу дня» почти всегда неверно — используйте границы периода или функции начала и конца дня.

Как проверить, что код работает со значениями корректно

Главный инструмент — конфигуратор с отладчиком. Поставьте точку останова перед проблемной операцией и посмотрите значение и его тип в табло: там видно и содержимое, и тип, и для ссылок — представление объекта. Это быстрее, чем гадать по тексту ошибки.

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

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

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

Тип значения в отладчике
Норма

Тип совпадает с ожидаемым операцией

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

Неопределено, NULL или тип другой сущности

Результат преобразования
Норма

Значение преобразовано без исключения и не обрезано

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

Исключение, обрезанная строка, округлённое число

Отбор в отчёте
Норма

Найдены ожидаемые записи

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

Пустой результат при заведомо существующих данных

Заполненность перед записью
Норма

Обязательные реквизиты содержат осмысленные значения

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

Пустые ссылки и нулевые даты в обязательных полях

При разборе чужого кода сначала смотрите, откуда приходит значение: из реквизита объекта, из запроса или из параметра. Источник сразу подсказывает возможные типы и «пустые» состояния — это сокращает поиск ошибки в разы по сравнению с чтением логики обработки.
ПЗ
Практическое замечание
Итог

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

Значение в 1С — это данные конкретного типа, а тип хранится в самом значении, а не в переменной. Различайте Неопределено, NULL и пустую ссылку, проверяйте типы перед операциями, преобразовывайте значения явно и осторожно — и большинство загадочных ошибок платформы перестанет быть загадочными.

Частые вопросы о значениях в 1С

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

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

Почему сравнение «Если Ссылка = Неопределено» не работает для пустых ссылок?

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

Как безопасно преобразовать строку из файла в число?

Сначала удалите пробелы, неразрывные пробелы и символы валют функцией СтрЗаменить(), затем оберните вызов Число() в конструкцию Попытка/Исключение. В ветке Исключение задайте значение по умолчанию или зафиксируйте ошибку загрузки с указанием строки файла.

Почему при присваивании таблицы значений меняется оригинал?

Таблица значений передаётся по ссылке: присваивание создаёт второй указатель на те же данные, а не копию. Для независимой копии используйте метод Скопировать(), при необходимости с отбором строк и списком колонок.

Что означает «составной тип» реквизита?

Реквизит может хранить значения нескольких типов, например ссылку на разные справочники или одновременно строку и число. При работе с таким реквизитом всегда проверяйте фактический тип через ТипЗнч(), а в запросах приводите значение функцией ВЫРАЗИТЬ() — иначе возможны ошибки сравнения и лишние соединения таблиц.

Можно ли в отборе отчёта задать несколько значений одного поля?

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