Разработка и Конфигурация · 11 мин
Какой тип данных не относится к базовым в 1С
Какие типы данных в 1С относятся к примитивным (базовым), а какие — нет. Разбираем строку, число, дату, булево и ссылочные типы с примерами кода и типичными ошибками.
Вопрос «какой тип данных не относится к базовым» регулярно встречается в тестах на аттестацию 1С:Профессионал, на собеседованиях и в учебных курсах по встроенному языку. Ответ на него строится на чётком разделении: в платформе 1С существует небольшой фиксированный набор примитивных (базовых) типов, а всё остальное — ссылочные типы объектов конфигурации, коллекции значений и системные типы.
К базовым (примитивным) типам во встроенном языке 1С относятся только: Число, Строка, Дата и Булево. Иногда к этому списку добавляют особые значения Неопределено и NULL — они не являются полноценными типами данных, но фигурируют в документации рядом с примитивными. Всё остальное — СправочникСсылка, ДокументОбъект, Массив, Структура, СписокЗначений, ТаблицаЗначений и десятки других — базовыми типами не является.
Поэтому правильный ответ на типовой вопрос теста звучит так: не относится к базовым типам тот вариант, который не входит в четвёрку «Число, Строка, Дата, Булево». Например, если в вариантах ответа есть «СправочникСсылка.Номенклатура», «Массив» или «ХранилищеЗначения» — именно они и будут небазовыми типами.
Что такое базовые (примитивные) типы в 1С
Примитивный тип — это тип, значения которого хранятся «как есть», без ссылки на объект информационной базы. Значение примитивного типа самодостаточно: число 100 или строка «Привет» существуют сами по себе и не указывают ни на какую запись в таблицах базы данных.
Платформа 1С:Предприятие определяет четыре примитивных типа:
- Число — целые и дробные числа, точность и разрядность настраиваются в свойствах реквизита (например, длина 15, точность 2);
- Строка — текст произвольной или ограниченной длины, фиксированной или переменной;
- Дата — дата и время с точностью до секунды (в реквизитах можно ограничить состав только датой или только временем);
- Булево — логическое значение Истина или Ложь.
Отдельно упомянем значения Неопределено и NULL. Первое означает отсутствие значения во встроенном языке, второе приходит из запросов, когда поле не заполнено или соединение таблиц не дало результата. Они не считаются типами данных в полном смысле, но в проверках типа значения встречаются постоянно.
Какие типы точно не относятся к базовым
Список небазовых типов велик, потому что к нему относится практически всё многообразие объектов платформы. Удобно разбить их на группы, чтобы легче ориентироваться в тестах и в реальном коде.
Первая группа — ссылочные типы объектов конфигурации: СправочникСсылка, ДокументСсылка, ПеречислениеСсылка, ПланВидовХарактеристикСсылка, ПланСчетовСсылка, ПланВидовРасчетаСсылка, БизнесПроцессСсылка, ЗадачаСсылка, ПланОбменаСсылка, а также соответствующие объекты (ДокументОбъект, СправочникОбъект и т.д.). Несмотря на то что реквизит документа может иметь тип «СправочникСсылка.Номенклатура», примитивным он от этого не становится.
Вторая группа — коллекции значений: Массив, Структура, Соответствие, СписокЗначений, ТаблицаЗначений, ДеревоЗначений, ФиксированныйМассив и их вариации. Третья группа — системные и специализированные типы: ХранилищеЗначения, УникальныйИдентификатор, РезультатЗапроса, ВыборкаИзРезультатаЗапроса, Тип, ОписаниеТипов, Картинка, ДвоичныеДанные и многие другие.
| Группа | Примеры типов | Базовый? |
|---|---|---|
| Примитивные | Число, Строка, Дата, Булево | Да |
| Ссылочные | СправочникСсылка, ДокументСсылка, ПеречислениеСсылка | Нет |
| Объектные | СправочникОбъект, ДокументОбъект | Нет |
| Коллекции | Массив, Структура, СписокЗначений, ТаблицаЗначений | Нет |
| Системные | ХранилищеЗначения, УникальныйИдентификатор, ОписаниеТипов | Нет |
Как определить тип значения в коде
На практике разработчику часто нужно проверить, какого типа значение пришло в переменную или параметр процедуры. Для этого во встроенном языке есть функция ТипЗнч() и функция Тип(). Первая возвращает тип конкретного значения, вторая — объект типа по его имени.
Значение = 100;
Если ТипЗнч(Значение) = Тип("Число") Тогда
Сообщить("Это примитивный тип Число");
КонецЕсли;
Ссылка = Справочники.Номенклатура.НайтиПоКоду("00001");
Если ТипЗнч(Ссылка) = Тип("СправочникСсылка.Номенклатура") Тогда
Сообщить("Это ссылочный, а не базовый тип");
КонецЕсли;
Для проверки на примитивность удобно использовать конструкцию с перечислением четырёх типов. Если тип значения не совпал ни с одним из них — значение небазовое. Альтернативный подход — получить метаданные реквизита и посмотреть его Тип (объект ОписаниеТипов), где метод СодержитТип() позволяет проверить входжение конкретного типа в составной тип реквизита.
Функция ЭтоБазовыйТип(Значение)
ТипЗначения = ТипЗнч(Значение);
Возврат ТипЗначения = Тип("Число")
Или ТипЗначения = Тип("Строка")
Или ТипЗначения = Тип("Дата")
Или ТипЗначения = Тип("Булево");
КонецФункцииСоставные типы и их связь с базовыми
Реквизит объекта конфигурации может иметь составной тип — например, «Число или СправочникСсылка.Контрагенты». Это частый источник путаницы: разработчик видит в списке типов «Число» и ошибочно считает весь реквизит примитивным. На самом деле составной тип — это описание допустимого множества, а конкретное хранимое значение всегда имеет один конкретный тип.
Ограничение составного типа влияет и на хранение в базе данных: поле составного типа физически занимает больше места, потому что платформа хранит признак типа значения. Поэтому без необходимости составные типы в реквизитах лучше не использовать — это влияет и на производительность запросов при соединениях.
Ещё одна тонкость — тип «Строка» неограниченной длины. В запросах такую строку нельзя сравнивать напрямую без приведения через ВЫРАЗИТЬ(... КАК Строка(N)), а сама строка при этом остаётся примитивным типом. То есть ограничения по использованию не отменяют её базовую природу.
Где это знание применяется на практике
Различение базовых и небазовых типов важно не только для тестов. При сериализации данных, обмене через веб-сервисы и JSON примитивные типы передаются напрямую, а ссылочные требуют преобразования — обычно в строковое представление уникального идентификатора. Если попытаться отправить СправочникСсылку «как есть», внешняя система получит бессмысленный набор символов или ошибку.
В запросах примитивные типы ведут себя предсказуемо: их можно сравнивать, группировать, использовать в агрегатных функциях. Ссылочные поля перед сравнением с параметром требуют приведения типа через ВЫРАЗИТЬ или передачи параметра строго нужного типа — иначе запрос может не использовать индекс и выполняться медленно.
Ещё одна область — универсальные процедуры обработки данных. Например, процедура выгрузки произвольного реквизита в текстовый файл должна сначала проверить: если тип базовый — преобразовать значение в строку напрямую, если ссылочный — получить представление или GUID, если ХранилищеЗначения — извлечь данные методом Получить().
Базовые и небазовые типы в работе
Передаются по значению, сериализуются напрямую, сравниваются в запросах без приведения. Ограничение — нельзя хранить ссылку на объект базы.
Указывают на запись в базе, требуют преобразования при обмене. Ограничение — нельзя сравнивать с произвольным значением без приведения типа.
Существуют только в памяти сеанса (Массив, Структура) или требуют специальных методов (ХранилищеЗначения). Не хранятся в реквизитах напрямую, кроме специальных случаев.
Типичные ошибки и заблуждения
Самая распространённая ошибка — считать тип «Строка» небазовым из-за того, что строки бывают неограниченной длины. Длина строки — это квалификатор типа, а не признак отдельного типа. Строка любой длины остаётся примитивным типом.
Вторая ошибка — относить к базовым типам ПеречислениеСсылка, потому что «это же просто список значений». Значение перечисления является ссылкой на предопределённый объект метаданных и в иерархии типов стоит рядом со ссылками справочников, а не с примитивами.
Третья ошибка — путать значение Неопределено с типом данных. Это специальное значение, обозначающее отсутствие данных, и попытка вызвать у него методы или обратиться к свойствам приведёт к ошибке выполнения. Проверка Значение = Неопределено должна идти до проверки типа.
Как проверить себя при ответе на тестовый вопрос
Алгоритм ответа прост: пройдите по вариантам и отметьте те, что входят в четвёрку «Число, Строка, Дата, Булево». Всё, что осталось за её пределами, — кандидаты на правильный ответ. Если вариантов небазовых типов несколько, внимательно перечитайте формулировку: иногда спрашивают «какой из типов является базовым», и тогда логика обратная.
Полезно помнить типичные «ловушки» составителей тестов: ХранилищеЗначения, УникальныйИдентификатор, ОписаниеТипов, СписокЗначений и ПеречислениеСсылка — все они небазовые, хотя и часто встречаются в повседневной разработке. Если сомневаетесь, мысленно задайте вопрос: «Может ли это значение существовать без записи в информационной базе?» Для ссылок ответ отрицательный — значит, тип небазовый.
Что важно запомнить
Базовые типы 1С — только Число, Строка, Дата и Булево. Все ссылки, объекты, коллекции и системные типы базовыми не являются. Проверяйте тип через ТипЗнч() и учитывайте различие при обмене данными и в запросах.
Частые вопросы о типах данных в 1С
Относится ли NULL к базовым типам 1С?
Нет. NULL — это специальное значение, которое возникает в результатах запросов, когда поле не заполнено или соединение таблиц не вернуло строку. Это не тип данных, а маркер отсутствия значения, и обрабатывать его нужно через оператор ЕСТЬ NULL или функцию ЕСТЬNULL() в запросах.
Является ли УникальныйИдентификатор примитивным типом?
Нет. УникальныйИдентификатор — отдельный системный тип, хотя внешне он похож на строку. Его нельзя напрямую сравнивать со строкой без преобразования, и в список примитивных типов он не входит.
Можно ли в реквизите справочника использовать только базовые типы?
Да, реквизит может иметь тип Число, Строка, Дата или Булево, и такие реквизиты встречаются постоянно — например, «Артикул» (строка) или «Вес» (число). Но большинство реальных реквизитов всё же ссылочные: единицы измерения, контрагенты, договоры.
Чем отличается ТипЗнч() от Тип()?
ТипЗнч(Значение) возвращает тип уже существующего значения, а Тип("ИмяТипа") создаёт объект типа по его строковому имени. Обычно их используют в паре для сравнения: ТипЗнч(Параметр) = Тип("Массив").
Почему в тесте правильным ответом может быть «ХранилищеЗначения»?
Потому что ХранилищеЗначения — это контейнер для произвольных данных (картинок, файлов, сериализованных объектов), а не примитивный тип. Оно требует специальных методов Поместить() и Получить() и к четвёрке базовых типов отношения не имеет.
Влияет ли составной тип реквизита на скорость работы?
Да, может влиять. Поля составного типа хранят дополнительный признак типа значения, а соединения и сравнения по ним в запросах работают медленнее, чем по однотипным полям. Если составной тип не нужен по логике предметной области, лучше ограничить реквизит одним типом.