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

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

Примитивные типы данных в 1С: разбор для начинающих

Что такое примитивные типы данных в 1С: строка, число, дата, булево, Null и Неопределено. Примеры кода, преобразование типов, типичные ошибки и FAQ.

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

Каждая переменная, реквизит объекта, параметр запроса или колонка таблицы значений в 1С опирается на один из примитивных типов либо на ссылочный тип. Понимание того, как устроены примитивные типы, напрямую влияет на корректность расчётов, поведение запросов и отсутствие ошибок вида «Преобразование значения к типу Число не может быть выполнено».

К примитивным типам в 1С относят: Строка, Число, Дата, Булево, Null, Неопределено и Тип. Ниже разберём каждый из них на практических примерах, а также покажем, как проверять и преобразовывать типы без ошибок.

Что относится к примитивным типам в 1С

Платформа 1С:Предприятие выделяет ограниченный набор примитивных типов, заданных на уровне самой платформы, а не конфигурации. Это значит, что они доступны всегда — и в толстом клиенте, и в тонком, и на сервере, и в любом модуле.

В перечень входят:

  • Строка — текст произвольной или ограниченной длины;
  • Число — целые и дробные значения с заданной точностью;
  • Дата — момент времени с точностью до секунды;
  • Булево — Истина или Ложь;
  • Null — значение «отсутствует», пришедшее из базы данных;
  • Неопределено — значение переменной, которой ничего не присвоено;
  • Тип — значение, описывающее сам тип данных.

Отдельно стоит понимать, чем примитивные типы отличаются от ссылочных. СправочникСсылка или ДокументСсылка указывают на объект в базе, а примитивное значение существует само по себе. Поэтому сравнение строк, чисел и дат выполняется по значению, а сравнение ссылок — по идентичности объектов.

Строка: работа с текстом

Строка — самый часто используемый примитивный тип. Литералы строк записываются в двойных кавычках, а если внутри текста нужна кавычка, она удваивается: "Покупатель ""Вега""". Многострочные значения формируются через символ вертикальной черты | в начале каждой строки литерала.

В реквизитах объектов строка может быть ограниченной (например, 150 символов) или неограниченной. Ограниченные строки индексируются и участвуют в поиске, поэтому для наименований и кодов всегда задавайте разумную длину, а неограниченную строку оставляйте для комментариев и описаний.

Для обработки текста доступны функции СтрДлина, Лев, Прав, Сред, СокрЛП, СтрНайти, СтрЗаменить, ВРег, НРег. Помните, что сравнение строк в запросах зависит от настроек сортировки базы, а в коде оператор «=» сравнивает строки посимвольно без учёта регистра в ряде контекстов — лучше явно приводить регистр при критичных сравнениях.

Число: точность и подводные камни

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

Арифметика выполняется операторами +, -, *, /, а также функциями Окр, Цел, Мин, Макс. Деление на ноль вызывает исключение, поэтому перед делением всегда проверяйте знаменатель.

1c
Если Количество <> 0 Тогда
    Цена = Окр(Сумма / Количество, 2);
Иначе
    Цена = 0;
КонецЕсли;

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

Дата и Булево: время и логика

Тип Дата хранит дату и время с точностью до секунды. Литерал записывается в одинарных кавычках: '20260115143000' — год, месяц, день, часы, минуты, секунды без разделителей. Пустая дата — '00010101', её часто используют как признак «не заполнено».

Для работы с датами применяются функции ТекущаяДатаСеанса, НачалоДня, КонецДня, НачалоМесяца, ДобавитьМесяц, Год, Месяц, День. Для периодических задач предпочитайте ТекущаяДатаСеанса вместо устаревшего ТекущаяДата — так вы получите время сеанса на сервере без проблем с часовыми поясами клиента.

Булево имеет только два значения — Истина и Ложь. Логические операторы И, ИЛИ, НЕ используются в условиях. Учитывайте, что в 1С операции И и ИЛИ не всегда вычисляются сокращённо: в некоторых контекстах вычисляются оба операнда, поэтому проверку вида «значение заполнено» ставьте первой отдельным условием, если вторая часть выражения может вызвать ошибку при пустом значении.

Null, Неопределено и Тип: в чём разница

Эти три значения чаще всего путают начинающие разработчики, хотя у них разное происхождение и назначение.

Null приходит из базы данных: например, когда в запросе левое соединение не нашло связанной записи, поле результата содержит Null. Проверка выполняется через Если Значение = Null Тогда или в запросе через конструкцию ЕСТЬ NULL.

Неопределено — состояние переменной или параметра, которым ничего не присвоили. Необязательный параметр процедуры без значения по умолчанию равен Неопределено. Проверка: Если Параметр = Неопределено Тогда.

Тип — значение, описывающее тип данных. Его получают функцией ТипЗнч(Значение) и сравнивают с литералом Тип("Строка") или Тип("СправочникСсылка.Номенклатура"). Это основной способ ветвления логики по типу переданного значения.

Сравнение пустых значений

Null

Приходит из СУБД в результатах запросов при отсутствии связанной записи. Сравнение Null = Null даёт не Истину в логике СУБД — используйте ЕСТЬ NULL в запросах.

Неопределено

Состояние переменной или параметра в коде, которому не присвоено значение. В базе данных не хранится.

Пустое значение типа

Пустая строка "", число 0, дата '00010101', Ложь — значения по умолчанию для реквизитов соответствующего типа.

Проверка и преобразование типов

Тип значения определяется функцией ТипЗнч(), а для описания допустимых типов реквизитов и колонок используется объект ОписаниеТипов. Он позволяет задать составной тип, например «Строка или СправочникСсылка.Контрагенты», и привести значение к нужному виду методом ПривестиЗначение().

Явное преобразование выполняется функциями Строка(), Число(), Дата(), Булево(), а также XMLСтрока и XMLЗначение для обмена данными. Если преобразование невозможно (например, Число("двенадцать")), платформа выбрасывает исключение — оборачивайте такие вызовы в Попытка/Исключение или предварительно проверяйте входные данные.

Безопасное преобразование строки в число
  1. 1
    Удалите лишние пробелы и неразрывные пробелы: СокрЛП и СтрЗаменить(Значение, Символ(160), "")
  2. 2
    Проверьте замену разделителя дробной части: приведите запятую к точке при необходимости
  3. 3
    Выполните преобразование внутри блока Попытка ... Исключение
  4. 4
    В ветке Исключение задайте значение по умолчанию и запишите событие в журнал регистрации
Типичные ошибки
01
Сравнение Null обычным равенством в запросе: условие Поле = Null не срабатывает, нужно ЕСТЬ NULL — иначе строки просто теряются
02
Деление без проверки знаменателя на ноль — исключение и падение обработки
03
Сравнение результата запроса с Неопределено вместо Null — условие никогда не выполняется, дефект остаётся незамеченным
04
Неограниченная строка в ключевых реквизитах — невозможность индексирования и замедление поиска
05
Ожидание автоматического приведения типов при конкатенации: "Сумма: " + 100 работает, но "100" + 1 даст 101 как число или строку в зависимости от порядка операндов — лучше приводить явно

Где примитивные типы встречаются на практике

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

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

В коллекциях — таблицах значений, массивах, структурах — колонки и элементы также опираются на примитивные типы. При создании колонки таблицы значений через Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число")) вы фиксируете тип заранее и избегаете неоднозначности при выгрузке и сортировке.

Итог

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

Примитивные типы 1С — Строка, Число, Дата, Булево, Null, Неопределено и Тип. Они описывают простые значения, отличаются от ссылочных типов отсутствием связи с объектами базы. Ключ к корректной работе — явные проверки Null и Неопределено, контроль точности чисел и безопасное преобразование типов через Попытка/Исключение.

Частые вопросы

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

Null — значение из базы данных, означающее отсутствие данных в поле результата запроса (например, при левом соединении без совпадения). Неопределено — состояние переменной или параметра в коде, которому не присвоено значение. В базе данных Неопределено не хранится, а Null в коде появляется только из запросов и обращений к данным.

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

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

Что произойдёт при попытке преобразовать текст в число?

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

Как задать реквизит, который может быть и строкой, и числом?

В свойствах реквизита выберите составной тип данных, отметив нужные примитивные типы. В коде такой реквизит описывается через ОписаниеТипов с перечислением типов. Учитывайте, что составные типы усложняют индексирование и сортировку, поэтому используйте их только при реальной необходимости.

Почему сравнение двух одинаковых дробных чисел даёт Ложь?

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

Как узнать тип значения переменной в отладке?

Вызовите ТипЗнч(Значение) — функция вернёт значение типа Тип, которое можно сравнить с Тип("Строка"), Тип("Число") и т.д. В конфигураторе при отладке тип отображается в табло или в окне вычисления выражений рядом со значением переменной.