Разработка и Конфигурация · 12 мин
Значение в 1С: что это и как с ним работать
Разбираем, что такое значение в 1С: типы значений, встроенные функции проверки, типичные ошибки при сравнении и преобразовании данных.
Запрос «значение 1С что это» чаще всего возникает у тех, кто впервые столкнулся с встроенным языком 1С или увидел в отладчике, журнале ошибок либо настройке отчёта слово «Значение» без пояснений. В платформе 1С:Предприятие значение — это фундаментальное понятие: любые данные, с которыми работает программа, представлены в виде значений определённого типа.
Понимание того, что такое значение, какие бывают типы значений и как платформа обрабатывает их при сравнении, присваивании и преобразовании, необходимо и разработчику, и продвинутому пользователю. Ошибки типа «Несоответствие типов» или «Преобразование значения к типу Число не может быть выполнено» возникают именно из-за непонимания этой базовой механики.
Ниже разберём определение значения, основные типы данных платформы, способы проверки и преобразования, а также типичные ошибки, которые допускают при работе со значениями в коде и в настройках.
Что такое значение и чем оно отличается от переменной
Во встроенном языке 1С переменная — это просто имя-контейнер, в который можно положить любое значение. В отличие от строго типизированных языков, переменная не объявляется с типом заранее: сегодня в ней лежит строка, а после следующего присваивания — число. Тип «живёт» в самом значении, а не в переменной.
Это удобно для быстрой разработки, но создаёт классическую ловушку: код компилируется без ошибок, а падение происходит в момент выполнения, когда в переменной оказался не тот тип, который ожидала операция. Например, сложение числа со строкой «10» в одних контекстах даст ошибку, в других — неявное преобразование, результат которого отличается от ожидаемого.
Практический вывод: перед операциями, зависящими от типа (арифметика, сравнение, обращение к реквизитам), полезно проверять тип значения явно, особенно если данные приходят из внешних источников — файлов, запросов, пользовательского ввода.
Основные типы значений в платформе
Все значения в 1С делятся на несколько групп. Знание групп помогает быстро понять, какие операции допустимы и где искать ошибку.
Примитивные типы — это Число, Строка, Дата и Булево. Они хранятся «по значению»: при присваивании одной переменной другой копируется содержимое. Числа в 1С имеют фиксированную точность, определяемую при описании реквизита (длина и число знаков после запятой), поэтому при расчётах с деньгами важно контролировать округление.
Ссылочные типы — ссылки на объекты базы данных: справочники, документы, перечисления, планы счетов и т.д. Ссылка — это не сам объект, а указатель на него. Чтобы прочитать реквизиты, платформа обращается к базе, поэтому массовое обращение к реквизитам через точку в цикле — известный источник медленной работы.
Специальные значения — Неопределено, NULL и пустые ссылки. Неопределено означает «значение не задано» (например, функция не вернула результат). NULL приходит из запросов, когда соединение таблиц не нашло соответствия. Пустая ссылка — корректная ссылка определённого типа, не указывающая ни на один объект. Все три часто путают, хотя проверяются они по-разному.
Проверка: Значение = Неопределено
Проверка: значение ЕСТЬ NULL в запросе или функция ЕстьNULL()
Проверка: Ссылка.Пустая() или сравнение с пустой ссылкой типа
Проверка: ПустаяСтрока(Значение) или НЕ ЗначениеЗаполнено()
Универсальные коллекции значений
Отдельная группа типов — коллекции: Массив, Структура, Соответствие, СписокЗначений, ТаблицаЗначений. Они хранят наборы других значений и передаются по ссылке: присваивание переменной не копирует коллекцию, а создаёт второй указатель на тот же набор данных.
Это приводит к типичной ошибке: разработчик «копирует» таблицу значений присваиванием, меняет копию — и неожиданно меняется оригинал. Для реального копирования используются методы вроде Скопировать() у таблицы значений или конструктор с передачей массива.
Структура и Соответствие различаются способом обращения к элементам: в структуре ключ — это строка-идентификатор, допустимая как имя переменной, в соответствии ключом может быть значение любого типа, включая ссылки. Выбор между ними влияет и на удобство кода, и на корректность при нестандартных ключах.
Как проверить тип и заполненность значения
Платформа предоставляет встроенные функции для анализа значений. Базовый набор, который стоит знать наизусть: ТипЗнч() возвращает тип значения, Тип() создаёт тип по имени для сравнения, ЗначениеЗаполнено() проверяет, содержит ли значение что-то осмысленное.
Функция ЗначениеЗаполнено() универсальна: для строки она проверяет непустоту, для числа — отличие от нуля, для ссылки — что она не пустая, для даты — отличие от начальной даты. Это удобно в проверках перед записью документа или формированием отчёта, но важно помнить: число 0 и дата '00010101' считаются незаполненными, что не всегда соответствует бизнес-логике.
Если ТипЗнч(Параметр) = Тип("СправочникСсылка.Номенклатура") Тогда
// работаем как со ссылкой на номенклатуру
ИначеЕсли НЕ ЗначениеЗаполнено(Параметр) Тогда
ВызватьИсключение "Параметр не заполнен";
КонецЕсли;Для проверки типа в запросах используется другой механизм — оператор ССЫЛКА и функция ТИПЗНАЧЕНИЯ() языка запросов, а также ВЫРАЗИТЬ() для приведения составного типа к конкретному. Смешивать проверки встроенного языка и языка запросов нельзя: они работают на разных этапах обработки данных.
Преобразование значений и связанные риски
Явное преобразование выполняется функциями Число(), Строка(), Дата(), Булево(). Здесь кроется главный риск потери данных: функция Число(\"abc\") не вернёт ошибку аккуратно — она вызовет исключение, которое прервёт выполнение, если его не обработать. А Число(\"10,5\") и Число(\"10.5\") ведут себя по-разному в зависимости от региональных настроек сеанса.
Безопасный подход — перед преобразованием проверять входные данные или оборачивать преобразование в попытку/исключение. Для чисел из пользовательского ввода полезно предварительно очистить строку от пробелов, неразрывных пробелов и символов валют, иначе преобразование упадёт на ровном месте.
Отдельная тема — преобразование значений в строку для запросов и СКД. Конкатенация значений в текст запроса вместо параметров — не только риск ошибок с датами и числами, но и уязвимость: всегда передавайте значения через параметры запроса.
Значения в настройках пользователя: отборы и параметры
Не только разработчики сталкиваются со значениями. В отборах динамических списков, настройках отчётов на СКД и параметрах обработок пользователь видит поле «Значение», куда нужно ввести или выбрать данные. Тип этого поля определяется сравниваемым полем: для отбора по контрагенту будет предложен выбор из справочника, для суммы — ввод числа.
Частая пользовательская ошибка — отбор «не срабатывает», потому что выбрано значение другого типа или задано условие «в списке» с одним элементом вместо «равно». Ещё одна ситуация: отбор по строковому полу с условием «содержит» не находит данные из-за лишних пробелов в базе. Проверить это можно, сделав отбор по точному равенству с скопированным из карточки объекта значением.
Как выбрать действие
Типичные ошибки при работе со значениями
Большинство проблем со значениями укладывается в короткий список повторяющихся сценариев. Их знание экономит часы отладки.
Ещё одна группа ошибок связана с датами: сравнение даты со строкой, забытой границей периода и пустой датой '00010101'. Даты в 1С хранятся с точностью до секунды, поэтому сравнение «равно концу дня» почти всегда неверно — используйте границы периода или функции начала и конца дня.
Как проверить, что код работает со значениями корректно
Главный инструмент — конфигуратор с отладчиком. Поставьте точку останова перед проблемной операцией и посмотрите значение и его тип в табло: там видно и содержимое, и тип, и для ссылок — представление объекта. Это быстрее, чем гадать по тексту ошибки.
Для проверок на реальных данных полезно добавить временные сообщения с выводом типа и значения, а после исправления — убрать их. В продуктивном коде вместо сообщений используйте журнал регистрации, чтобы не останавливать работу пользователей.
Как проверить результат
Тип совпадает с ожидаемым операцией
Неопределено, NULL или тип другой сущности
Значение преобразовано без исключения и не обрезано
Исключение, обрезанная строка, округлённое число
Найдены ожидаемые записи
Пустой результат при заведомо существующих данных
Обязательные реквизиты содержат осмысленные значения
Пустые ссылки и нулевые даты в обязательных полях
При разборе чужого кода сначала смотрите, откуда приходит значение: из реквизита объекта, из запроса или из параметра. Источник сразу подсказывает возможные типы и «пустые» состояния — это сокращает поиск ошибки в разы по сравнению с чтением логики обработки.
Что важно запомнить
Значение в 1С — это данные конкретного типа, а тип хранится в самом значении, а не в переменной. Различайте Неопределено, NULL и пустую ссылку, проверяйте типы перед операциями, преобразовывайте значения явно и осторожно — и большинство загадочных ошибок платформы перестанет быть загадочными.
Частые вопросы о значениях в 1С
Чем NULL отличается от Неопределено?
NULL появляется только в результатах запросов, когда соединение таблиц не нашло соответствующую строку. Неопределено — признак незаданного значения во встроенном языке, например, когда функция не вернула результат. Они не равны друг другу, и проверять их нужно разными способами: NULL — через ЕСТЬ NULL в запросе или сравнение с NULL, Неопределено — прямым сравнением.
Почему сравнение «Если Ссылка = Неопределено» не работает для пустых ссылок?
Пустая ссылка — это вполне определённое значение конкретного ссылочного типа, она не равна Неопределено. Для проверки используйте метод Пустая() или сравнение с пустой ссылкой нужного типа, например Справочники.Номенклатура.ПустаяСсылка().
Как безопасно преобразовать строку из файла в число?
Сначала удалите пробелы, неразрывные пробелы и символы валют функцией СтрЗаменить(), затем оберните вызов Число() в конструкцию Попытка/Исключение. В ветке Исключение задайте значение по умолчанию или зафиксируйте ошибку загрузки с указанием строки файла.
Почему при присваивании таблицы значений меняется оригинал?
Таблица значений передаётся по ссылке: присваивание создаёт второй указатель на те же данные, а не копию. Для независимой копии используйте метод Скопировать(), при необходимости с отбором строк и списком колонок.
Что означает «составной тип» реквизита?
Реквизит может хранить значения нескольких типов, например ссылку на разные справочники или одновременно строку и число. При работе с таким реквизитом всегда проверяйте фактический тип через ТипЗнч(), а в запросах приводите значение функцией ВЫРАЗИТЬ() — иначе возможны ошибки сравнения и лишние соединения таблиц.
Можно ли в отборе отчёта задать несколько значений одного поля?
Да, используйте вид сравнения «В списке» и добавьте нужные значения в список. Для исключения данных подойдёт «Не в списке». Учтите, что все элементы списка должны быть одного типа, соответствующего полю отбора.