Разработка и Конфигурация · 11 мин
Примитивные типы данных в 1С: разбор для начинающих
Что такое примитивные типы данных в 1С: строка, число, дата, булево, Null и Неопределено. Примеры кода, преобразование типов, типичные ошибки и FAQ.
Примитивные типы данных — это базовые «кирпичики», из которых строятся все значения во встроенном языке 1С. В отличие от объектов конфигурации (документов, справочников, регистров), примитивные типы не хранятся в базе данных как самостоятельные сущности — они описывают простые значения: текст, числа, даты, логические признаки.
Каждая переменная, реквизит объекта, параметр запроса или колонка таблицы значений в 1С опирается на один из примитивных типов либо на ссылочный тип. Понимание того, как устроены примитивные типы, напрямую влияет на корректность расчётов, поведение запросов и отсутствие ошибок вида «Преобразование значения к типу Число не может быть выполнено».
К примитивным типам в 1С относят: Строка, Число, Дата, Булево, Null, Неопределено и Тип. Ниже разберём каждый из них на практических примерах, а также покажем, как проверять и преобразовывать типы без ошибок.
Что относится к примитивным типам в 1С
Платформа 1С:Предприятие выделяет ограниченный набор примитивных типов, заданных на уровне самой платформы, а не конфигурации. Это значит, что они доступны всегда — и в толстом клиенте, и в тонком, и на сервере, и в любом модуле.
В перечень входят:
- Строка — текст произвольной или ограниченной длины;
- Число — целые и дробные значения с заданной точностью;
- Дата — момент времени с точностью до секунды;
- Булево — Истина или Ложь;
- Null — значение «отсутствует», пришедшее из базы данных;
- Неопределено — значение переменной, которой ничего не присвоено;
- Тип — значение, описывающее сам тип данных.
Отдельно стоит понимать, чем примитивные типы отличаются от ссылочных. СправочникСсылка или ДокументСсылка указывают на объект в базе, а примитивное значение существует само по себе. Поэтому сравнение строк, чисел и дат выполняется по значению, а сравнение ссылок — по идентичности объектов.
Строка: работа с текстом
Строка — самый часто используемый примитивный тип. Литералы строк записываются в двойных кавычках, а если внутри текста нужна кавычка, она удваивается: "Покупатель ""Вега""". Многострочные значения формируются через символ вертикальной черты | в начале каждой строки литерала.
В реквизитах объектов строка может быть ограниченной (например, 150 символов) или неограниченной. Ограниченные строки индексируются и участвуют в поиске, поэтому для наименований и кодов всегда задавайте разумную длину, а неограниченную строку оставляйте для комментариев и описаний.
Для обработки текста доступны функции СтрДлина, Лев, Прав, Сред, СокрЛП, СтрНайти, СтрЗаменить, ВРег, НРег. Помните, что сравнение строк в запросах зависит от настроек сортировки базы, а в коде оператор «=» сравнивает строки посимвольно без учёта регистра в ряде контекстов — лучше явно приводить регистр при критичных сравнениях.
Число: точность и подводные камни
Числовой тип в 1С хранит значения с фиксированной точностью: для реквизита задаются общая длина и число знаков после запятой, например 15.2 для сумм и 15.3 для количеств. Если при записи в реквизит значение выходит за пределы разрядности, происходит округление или ошибка переполнения — это частая причина расхождений в отчётах.
Арифметика выполняется операторами +, -, *, /, а также функциями Окр, Цел, Мин, Макс. Деление на ноль вызывает исключение, поэтому перед делением всегда проверяйте знаменатель.
Если Количество <> 0 Тогда
Цена = Окр(Сумма / Количество, 2);
Иначе
Цена = 0;
КонецЕсли;Отдельная ловушка — сравнение дробных чисел после вычислений. Из-за округлений промежуточных результатов два «одинаковых» значения могут различаться. В таких случаях сравнивайте разность с малым порогом или предварительно округляйте оба значения до нужной точности.
Дата и Булево: время и логика
Тип Дата хранит дату и время с точностью до секунды. Литерал записывается в одинарных кавычках: '20260115143000' — год, месяц, день, часы, минуты, секунды без разделителей. Пустая дата — '00010101', её часто используют как признак «не заполнено».
Для работы с датами применяются функции ТекущаяДатаСеанса, НачалоДня, КонецДня, НачалоМесяца, ДобавитьМесяц, Год, Месяц, День. Для периодических задач предпочитайте ТекущаяДатаСеанса вместо устаревшего ТекущаяДата — так вы получите время сеанса на сервере без проблем с часовыми поясами клиента.
Булево имеет только два значения — Истина и Ложь. Логические операторы И, ИЛИ, НЕ используются в условиях. Учитывайте, что в 1С операции И и ИЛИ не всегда вычисляются сокращённо: в некоторых контекстах вычисляются оба операнда, поэтому проверку вида «значение заполнено» ставьте первой отдельным условием, если вторая часть выражения может вызвать ошибку при пустом значении.
Null, Неопределено и Тип: в чём разница
Эти три значения чаще всего путают начинающие разработчики, хотя у них разное происхождение и назначение.
Null приходит из базы данных: например, когда в запросе левое соединение не нашло связанной записи, поле результата содержит Null. Проверка выполняется через Если Значение = Null Тогда или в запросе через конструкцию ЕСТЬ NULL.
Неопределено — состояние переменной или параметра, которым ничего не присвоили. Необязательный параметр процедуры без значения по умолчанию равен Неопределено. Проверка: Если Параметр = Неопределено Тогда.
Тип — значение, описывающее тип данных. Его получают функцией ТипЗнч(Значение) и сравнивают с литералом Тип("Строка") или Тип("СправочникСсылка.Номенклатура"). Это основной способ ветвления логики по типу переданного значения.
Сравнение пустых значений
Приходит из СУБД в результатах запросов при отсутствии связанной записи. Сравнение Null = Null даёт не Истину в логике СУБД — используйте ЕСТЬ NULL в запросах.
Состояние переменной или параметра в коде, которому не присвоено значение. В базе данных не хранится.
Пустая строка "", число 0, дата '00010101', Ложь — значения по умолчанию для реквизитов соответствующего типа.
Проверка и преобразование типов
Тип значения определяется функцией ТипЗнч(), а для описания допустимых типов реквизитов и колонок используется объект ОписаниеТипов. Он позволяет задать составной тип, например «Строка или СправочникСсылка.Контрагенты», и привести значение к нужному виду методом ПривестиЗначение().
Явное преобразование выполняется функциями Строка(), Число(), Дата(), Булево(), а также XMLСтрока и XMLЗначение для обмена данными. Если преобразование невозможно (например, Число("двенадцать")), платформа выбрасывает исключение — оборачивайте такие вызовы в Попытка/Исключение или предварительно проверяйте входные данные.
- 1Удалите лишние пробелы и неразрывные пробелы: СокрЛП и СтрЗаменить(Значение, Символ(160), "")
- 2Проверьте замену разделителя дробной части: приведите запятую к точке при необходимости
- 3Выполните преобразование внутри блока Попытка ... Исключение
- 4В ветке Исключение задайте значение по умолчанию и запишите событие в журнал регистрации
Где примитивные типы встречаются на практике
В реквизитах объектов конфигурации тип задаётся через палитру свойств: строка с длиной, число с точностью, дата с составом «Дата» или «Дата и время», булево для флажков. Составной тип разумно использовать, только когда значение действительно может быть разнородным — каждый лишний тип в составе усложняет индексы и запросы.
В запросах примитивные типы участвуют в параметрах, функциях и конструкции ВЫРАЗИТЬ, которая приводит значение к нужному типу, например ВЫРАЗИТЬ(Поле КАК Строка(100)). Это полезно при соединении с таблицами, где поле имеет составной тип.
В коллекциях — таблицах значений, массивах, структурах — колонки и элементы также опираются на примитивные типы. При создании колонки таблицы значений через Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число")) вы фиксируете тип заранее и избегаете неоднозначности при выгрузке и сортировке.
Что важно запомнить
Примитивные типы 1С — Строка, Число, Дата, Булево, Null, Неопределено и Тип. Они описывают простые значения, отличаются от ссылочных типов отсутствием связи с объектами базы. Ключ к корректной работе — явные проверки Null и Неопределено, контроль точности чисел и безопасное преобразование типов через Попытка/Исключение.
Частые вопросы
Чем Null отличается от Неопределено?
Null — значение из базы данных, означающее отсутствие данных в поле результата запроса (например, при левом соединении без совпадения). Неопределено — состояние переменной или параметра в коде, которому не присвоено значение. В базе данных Неопределено не хранится, а Null в коде появляется только из запросов и обращений к данным.
Как проверить, заполнено ли значение любого типа?
Используйте функцию ЗначениеЗаполнено(Значение). Она возвращает Ложь для пустой строки, нуля, пустой даты, Null, Неопределено и пустых ссылок. Это универсальная проверка, которая избавляет от необходимости писать отдельные условия под каждый тип.
Что произойдёт при попытке преобразовать текст в число?
Если текст не является корректным числовым представлением, функция Число() выбросит исключение «Преобразование значения к типу Число не может быть выполнено». Перед преобразованием очищайте строку от пробелов и неразрывных пробелов, а сам вызов размещайте в блоке Попытка/Исключение с обработкой ошибки.
Как задать реквизит, который может быть и строкой, и числом?
В свойствах реквизита выберите составной тип данных, отметив нужные примитивные типы. В коде такой реквизит описывается через ОписаниеТипов с перечислением типов. Учитывайте, что составные типы усложняют индексирование и сортировку, поэтому используйте их только при реальной необходимости.
Почему сравнение двух одинаковых дробных чисел даёт Ложь?
Промежуточные вычисления могут давать значения с разным количеством знаков после запятой, и внутреннее представление различается. Надёжный способ — округлить оба значения функцией Окр до нужной точности перед сравнением либо сравнивать модуль разности с заранее выбранным малым порогом.
Как узнать тип значения переменной в отладке?
Вызовите ТипЗнч(Значение) — функция вернёт значение типа Тип, которое можно сравнить с Тип("Строка"), Тип("Число") и т.д. В конфигураторе при отладке тип отображается в табло или в окне вычисления выражений рядом со значением переменной.