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

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

Какие типы данных есть в 1С

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

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

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

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

Примитивные типы данных

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

Тип Число хранит числовые значения с заданной точностью. При описании реквизита указываются общая разрядность и количество знаков после запятой, например Число(15,2). Числа могут быть отрицательными, если это разрешено настройкой. Важно помнить: превышение разрядности при записи в базу приведёт к ошибке или округлению в зависимости от контекста.

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

Тип Дата всегда содержит и дату, и время с точностью до секунды. Пустая дата — это значение '00010101000000'. Тип Булево принимает значения Истина или Ложь. Значение Неопределено означает отсутствие значения (например, у необязательного параметра функции), а Null приходит из запросов и означает отсутствие данных в результате соединения таблиц.

Ссылочные типы данных

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

Имена ссылочных типов строятся по шаблону: СправочникСсылка.Номенклатура, ДокументСсылка.РеализацияТоваровУслуг, ПеречислениеСсылка.СтавкиНДС. Перечисления формально тоже являются ссылочными типами, хотя их значения предопределены на этапе конфигурирования и не создаются пользователями.

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

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

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

Основные коллекции встроенного языка:

  • Массив — упорядоченный набор значений с доступом по индексу, начиная с нуля;
  • Структура — набор пар «ключ-значение», где ключ — строка, удобна для передачи именованных параметров;
  • Соответствие — аналог структуры, но ключом может быть значение любого типа;
  • СписокЗначений — коллекция с возможностью пометки, представления и сортировки, часто используется в формах выбора;
  • ТаблицаЗначений — двумерная таблица с типизированными колонками, основной инструмент обработки наборов данных;
  • ДеревоЗначений — иерархический вариант таблицы значений.

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

Сравнение основных групп типов

Выбор типа реквизита влияет на хранение, индексацию и поведение в запросах. Таблица ниже помогает сориентироваться при проектировании структуры метаданных.

Группа типовПримерыГде хранитсяТипичное применение
ПримитивныеЧисло, Строка, Дата, БулевоВ полях таблиц БДСуммы, наименования, даты, признаки
СсылочныеСправочникСсылка, ДокументСсылкаИдентификатор объекта в БДСвязи между объектами, аналитика учёта
КоллекцииМассив, Структура, ТаблицаЗначенийТолько в памятиПромежуточная обработка, передача данных
СоставныеСтрока + любая ссылкаНесколько полей в БДУниверсальные реквизиты, комментарии с объектом

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

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

Во встроенном языке тип значения проверяется функцией ТипЗнч(), которая возвращает объект типа Тип, и функцией Тип(), создающей тип по имени. Классическая проверка выглядит так:

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

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

ИначеЕсли ТипЗнч(Значение) = Тип("Строка") Тогда

// обрабатываем строку

КонецЕсли;

Для проверки заполненности ссылочных значений используется метод Пустая() у ссылки или функция ЗначениеЗаполнено(), которая корректно обрабатывает почти все типы: пустые ссылки, пустые строки, нулевые даты, Неопределено и Null.

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

bsl
Если НЕ ЗначениеЗаполнено(ВходящееЗначение) Тогда
    Возврат;
КонецЕсли;
Попытка
    ЧисловоеЗначение = Число(ВходящееЗначение);
Исключение
    Сообщить("Не удалось преобразовать в число: " + ВходящееЗначение);
КонецПопытки;

Особенности типов в запросах

В языке запросов система типов проявляется иначе, чем во встроенном языке. Здесь появляется значение Null — результат левого соединения, когда для строки основной таблицы не нашлось пары. Проверка на Null выполняется конструкцией ЕСТЬ NULL, а заменить Null на конкретное значение позволяет функция ЕСТЬNULL(Поле, ЗначениеПоУмолчанию).

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

Ещё один нюанс — сравнение строк в запросах. Строки фиксированной длины при сравнении могут давать неожиданные результаты из-за хранимых пробелов. Если запрос не находит заведомо существующее значение, проверьте квалификатор длины строки в метаданных и попробуйте сравнение через ПОДОБНО.

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

Как выбрать тип для реквизита

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

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

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

Как выбрать тип реквизита

Нужно хранить сумму или количествоИспользуйте Число с квалификаторами разрядности и точности
Нужна связь с объектом учётаВыберите конкретный ссылочный тип, избегайте лишнего составного типа
Значение — один из фиксированных вариантовСоздайте перечисление вместо строки со списком значений
Нужен набор данных только в момент расчётаИспользуйте ТаблицуЗначений или Массив, не создавая объект метаданных
Текст произвольной длины без поиска по немуИспользуйте неограниченную строку
Итог

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

Типы данных в 1С делятся на примитивные, ссылочные и коллекции. Реквизиты проектируйте с минимально достаточным типом, проверяйте значения через ТипЗнч и ЗначениеЗаполнено, в запросах учитывайте Null и приводите составные типы через ВЫРАЗИТЬ. Осторожность с преобразованиями и составными типами избавляет от большинства ошибок и проблем с производительностью.

Часто задаваемые вопросы

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

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

Можно ли изменить тип существующего реквизита без потери данных?

Частично. Увеличение длины строки или разрядности числа обычно проходит безболезненно. Смена типа на несовместимый (например, строки в ссылку) приведёт к очистке значений при реструктуризации. Перед изменением типа в рабочей базе сделайте резервную копию и протестируйте обновление на копии.

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

Чаще всего причина в строках фиксированной длины, дополненных пробелами, либо в непечатаемых символах, попавших при загрузке из файлов. Проверьте длины строк функцией СтрДлина и при необходимости используйте СокрЛП перед сравнением.

Что такое тип ОписаниеТипов и где он нужен?

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

Когда стоит использовать перечисление вместо строки?

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

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

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