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

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

Какой тип данных не относится к базовым в 1С

Какие типы данных в 1С относятся к примитивным (базовым), а какие — нет. Разбираем строку, число, дату, булево и ссылочные типы с примерами кода и типичными ошибками.

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

К базовым (примитивным) типам во встроенном языке 1С относятся только: Число, Строка, Дата и Булево. Иногда к этому списку добавляют особые значения Неопределено и NULL — они не являются полноценными типами данных, но фигурируют в документации рядом с примитивными. Всё остальное — СправочникСсылка, ДокументОбъект, Массив, Структура, СписокЗначений, ТаблицаЗначений и десятки других — базовыми типами не является.

Поэтому правильный ответ на типовой вопрос теста звучит так: не относится к базовым типам тот вариант, который не входит в четвёрку «Число, Строка, Дата, Булево». Например, если в вариантах ответа есть «СправочникСсылка.Номенклатура», «Массив» или «ХранилищеЗначения» — именно они и будут небазовыми типами.

Что такое базовые (примитивные) типы в 1С

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

Платформа 1С:Предприятие определяет четыре примитивных типа:

  • Число — целые и дробные числа, точность и разрядность настраиваются в свойствах реквизита (например, длина 15, точность 2);
  • Строка — текст произвольной или ограниченной длины, фиксированной или переменной;
  • Дата — дата и время с точностью до секунды (в реквизитах можно ограничить состав только датой или только временем);
  • Булево — логическое значение Истина или Ложь.

Отдельно упомянем значения Неопределено и NULL. Первое означает отсутствие значения во встроенном языке, второе приходит из запросов, когда поле не заполнено или соединение таблиц не дало результата. Они не считаются типами данных в полном смысле, но в проверках типа значения встречаются постоянно.

Какие типы точно не относятся к базовым

Список небазовых типов велик, потому что к нему относится практически всё многообразие объектов платформы. Удобно разбить их на группы, чтобы легче ориентироваться в тестах и в реальном коде.

Первая группа — ссылочные типы объектов конфигурации: СправочникСсылка, ДокументСсылка, ПеречислениеСсылка, ПланВидовХарактеристикСсылка, ПланСчетовСсылка, ПланВидовРасчетаСсылка, БизнесПроцессСсылка, ЗадачаСсылка, ПланОбменаСсылка, а также соответствующие объекты (ДокументОбъект, СправочникОбъект и т.д.). Несмотря на то что реквизит документа может иметь тип «СправочникСсылка.Номенклатура», примитивным он от этого не становится.

Вторая группа — коллекции значений: Массив, Структура, Соответствие, СписокЗначений, ТаблицаЗначений, ДеревоЗначений, ФиксированныйМассив и их вариации. Третья группа — системные и специализированные типы: ХранилищеЗначения, УникальныйИдентификатор, РезультатЗапроса, ВыборкаИзРезультатаЗапроса, Тип, ОписаниеТипов, Картинка, ДвоичныеДанные и многие другие.

ГруппаПримеры типовБазовый?
ПримитивныеЧисло, Строка, Дата, БулевоДа
СсылочныеСправочникСсылка, ДокументСсылка, ПеречислениеСсылкаНет
ОбъектныеСправочникОбъект, ДокументОбъектНет
КоллекцииМассив, Структура, СписокЗначений, ТаблицаЗначенийНет
СистемныеХранилищеЗначения, УникальныйИдентификатор, ОписаниеТиповНет

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

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

Значение = 100;

Если ТипЗнч(Значение) = Тип("Число") Тогда

Сообщить("Это примитивный тип Число");

КонецЕсли;

Ссылка = Справочники.Номенклатура.НайтиПоКоду("00001");

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

Сообщить("Это ссылочный, а не базовый тип");

КонецЕсли;

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

bsl
Функция ЭтоБазовыйТип(Значение)
	ТипЗначения = ТипЗнч(Значение);
	Возврат ТипЗначения = Тип("Число")
		Или ТипЗначения = Тип("Строка")
		Или ТипЗначения = Тип("Дата")
		Или ТипЗначения = Тип("Булево");
КонецФункции

Составные типы и их связь с базовыми

Реквизит объекта конфигурации может иметь составной тип — например, «Число или СправочникСсылка.Контрагенты». Это частый источник путаницы: разработчик видит в списке типов «Число» и ошибочно считает весь реквизит примитивным. На самом деле составной тип — это описание допустимого множества, а конкретное хранимое значение всегда имеет один конкретный тип.

Ограничение составного типа влияет и на хранение в базе данных: поле составного типа физически занимает больше места, потому что платформа хранит признак типа значения. Поэтому без необходимости составные типы в реквизитах лучше не использовать — это влияет и на производительность запросов при соединениях.

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

Где это знание применяется на практике

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

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

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

Базовые и небазовые типы в работе

Базовые (Число, Строка, Дата, Булево)

Передаются по значению, сериализуются напрямую, сравниваются в запросах без приведения. Ограничение — нельзя хранить ссылку на объект базы.

Ссылочные и объектные

Указывают на запись в базе, требуют преобразования при обмене. Ограничение — нельзя сравнивать с произвольным значением без приведения типа.

Коллекции и системные

Существуют только в памяти сеанса (Массив, Структура) или требуют специальных методов (ХранилищеЗначения). Не хранятся в реквизитах напрямую, кроме специальных случаев.

Типичные ошибки и заблуждения

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

Вторая ошибка — относить к базовым типам ПеречислениеСсылка, потому что «это же просто список значений». Значение перечисления является ссылкой на предопределённый объект метаданных и в иерархии типов стоит рядом со ссылками справочников, а не с примитивами.

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

Типичные ошибки
01
Считать ПеречислениеСсылка базовым типом — это ссылочный тип, как и ссылки справочников
02
Путать Неопределено и NULL с типами данных — это специальные значения, а не типы
03
Передавать ссылку в JSON или веб-сервис без преобразования в строку GUID — внешняя система не сможет её интерпретировать
04
Сравнивать ссылочное поле запроса с параметром другого типа — запрос теряет индекс и работает медленно

Как проверить себя при ответе на тестовый вопрос

Алгоритм ответа прост: пройдите по вариантам и отметьте те, что входят в четвёрку «Число, Строка, Дата, Булево». Всё, что осталось за её пределами, — кандидаты на правильный ответ. Если вариантов небазовых типов несколько, внимательно перечитайте формулировку: иногда спрашивают «какой из типов является базовым», и тогда логика обратная.

Полезно помнить типичные «ловушки» составителей тестов: ХранилищеЗначения, УникальныйИдентификатор, ОписаниеТипов, СписокЗначений и ПеречислениеСсылка — все они небазовые, хотя и часто встречаются в повседневной разработке. Если сомневаетесь, мысленно задайте вопрос: «Может ли это значение существовать без записи в информационной базе?» Для ссылок ответ отрицательный — значит, тип небазовый.

Итог

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

Базовые типы 1С — только Число, Строка, Дата и Булево. Все ссылки, объекты, коллекции и системные типы базовыми не являются. Проверяйте тип через ТипЗнч() и учитывайте различие при обмене данными и в запросах.

Частые вопросы о типах данных в 1С

Относится ли NULL к базовым типам 1С?

Нет. NULL — это специальное значение, которое возникает в результатах запросов, когда поле не заполнено или соединение таблиц не вернуло строку. Это не тип данных, а маркер отсутствия значения, и обрабатывать его нужно через оператор ЕСТЬ NULL или функцию ЕСТЬNULL() в запросах.

Является ли УникальныйИдентификатор примитивным типом?

Нет. УникальныйИдентификатор — отдельный системный тип, хотя внешне он похож на строку. Его нельзя напрямую сравнивать со строкой без преобразования, и в список примитивных типов он не входит.

Можно ли в реквизите справочника использовать только базовые типы?

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

Чем отличается ТипЗнч() от Тип()?

ТипЗнч(Значение) возвращает тип уже существующего значения, а Тип("ИмяТипа") создаёт объект типа по его строковому имени. Обычно их используют в паре для сравнения: ТипЗнч(Параметр) = Тип("Массив").

Почему в тесте правильным ответом может быть «ХранилищеЗначения»?

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

Влияет ли составной тип реквизита на скорость работы?

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