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

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

Типы данных в 1С: какие бывают и как с ними работать

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

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

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

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

Примитивные типы: строка, число, дата, булево

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

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

Тип Дата имеет состав: только дата, только время или дата и время. Для документов почти всегда используется «Дата и время», иначе документы внутри одного дня теряют упорядоченность. Булево хранит Истина или Ложь и применяется для флагов вроде «Актуально» или «Проведён вручную».

Специальные примитивные значения: Неопределено и Null

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

Критично различать эти два значения: сравнение Если Значение = Null Тогда в обычном коде модуля работает не так, как ожидается, потому что Null корректно проверяется только в запросах или через специальную обработку. Для проверки заполненности реквизита используйте функцию ЗначениеЗаполнено() — она единообразно обрабатывает пустые строки, нулевые даты, пустые ссылки и Неопределено.

bsl
Если ЗначениеЗаполнено(Объект.Контрагент) Тогда
    // реквизит заполнен, можно работать со ссылкой
Иначе
    Сообщить("Контрагент не указан");
КонецЕсли;

Ссылочные типы: ссылки на объекты базы данных

Ссылочные типы — это ссылки на объекты, хранящиеся в базе: справочники, документы, планы видов характеристик, планы счетов, перечисления и другие. Примеры: СправочникСсылка.Номенклатура, ДокументСсылка.РеализацияТоваровУслуг. Ссылка — это уникальный идентификатор объекта, а не сам объект: через неё можно читать реквизиты, но для изменения данных нужно получить объект методом ПолучитьОбъект().

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

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

Типичные ошибки
01
Сравнение ссылки с Неопределено вместо пустой ссылки — условие никогда не сработает для незаполненного реквизита ссылочного типа
02
Вызов ПолучитьОбъект() внутри цикла по тысячам ссылок — резкое падение производительности, читайте реквизиты через точку от ссылки или запросом
03
Использование перечисления там, где список значений будет пополняться пользователем, — потребуется доработка конфигурации вместо простого ввода элемента

Универсальные и составные типы

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

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

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

bsl
Если ТипЗнч(Владелец) = Тип("СправочникСсылка.Контрагенты") Тогда
    ИНН = Владелец.ИНН;
ИначеЕсли ТипЗнч(Владелец) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
    // отдельная логика для физлица
КонецЕсли;

Коллекции значений: массив, структура, таблица значений

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

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

Что выбрать для набора данных

Массив

Простой упорядоченный список однотипных значений; не подходит для поиска по ключу

Структура

Передача именованных параметров; ключи — только строки, нет методов поиска

Соответствие

Быстрый поиск по ключу любого типа; порядок элементов не гарантирован

ТаблицаЗначений

Набор строк с типизированными колонками, сортировка и поиск; тяжелее для простых задач

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

Для определения типа значения используется функция ТипЗнч(Значение), возвращающая объект типа ОписаниеТипов-совместимый Тип. Само описание допустимых типов реквизита можно получить через метаданные: Метаданные.Документы.РеализацияТоваровУслуг.Реквизиты.Контрагент.Тип — это полезно при универсальных обработках.

Преобразование выполняют функции Строка(), Число(), Дата(), Булево() и XML-функции сериализации. Учтите: преобразование не всегда безопасно — Число("abc") вызовет исключение, поэтому внешние данные (из файлов, обменов, веб-сервисов) стоит оборачивать в попытку/исключение или предварительно валидировать.

Как безопасно обработать значение неизвестного типа
  1. 1
    Проверьте заполненность через ЗначениеЗаполнено()
  2. 2
    Определите фактический тип через ТипЗнч()
  3. 3
    Сравните с ожидаемым типом через Тип()
  4. 4
    При несовпадении — выполните преобразование внутри Попытка...Исключение
  5. 5
    Зафиксируйте некорректные значения в журнале регистрации или протоколе обработки

Ограничения и практические рекомендации

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

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

Итог

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

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

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

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

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

Можно ли хранить в одном реквизите и строку, и число?

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

Как узнать тип реквизита программно?

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

Почему запрос с составным полем работает медленно?

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

Что такое уникальный идентификатор и где он применяется?

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

Чем перечисление отличается от справочника?

Значения перечисления фиксированы в конфигурации и меняются только разработчиком; значения справочника пользователь добавляет сам в режиме предприятия. Если набор вариантов может расширяться без доработки, выбирайте справочник или план видов характеристик.