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