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

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

Какие типы данных используются в 1С

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

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

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

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

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

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

Тип Строка хранит текст. Для реквизитов задаётся фиксированная длина или неограниченная строка. Неограниченные строки нельзя использовать в сравнениях и группировках запросов напрямую — это частая причина ошибок при построении отчётов. Тип Дата содержит дату и время с точностью до секунды; пустая дата — это '00010101000000', а не Null.

Тип Булево принимает значения Истина или Ложь.

bsl
Сумма = 1250.50; // Число
Наименование = "Товар А"; // Строка
ДатаОтгрузки = '20260115103000'; // Дата
Активен = Истина; // Булево

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

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

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

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

Коллекции значений

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

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

Выбор коллекции влияет на скорость: поиск в массиве — перебор, поиск по ключу в соответствии выполняется быстро. Если нужно многократно проверять вхождение элемента, соответствие предпочтительнее массива.

Сравнение коллекций

Массив

Подходит для упорядоченных списков с доступом по индексу; поиск элемента — полным перебором.

Структура

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

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

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

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

Табличные данные со свёрткой, сортировкой и поиском; требует описания колонок.

Составные типы и значение Неопределено

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

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

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

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

Системные и служебные типы

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

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

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

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

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

Порядок безопасной работы со значением неизвестного типа
  1. 1
    Проверьте значение на Неопределено и Null перед любыми операциями
  2. 2
    Определите тип через ТипЗнч() и сравните с ожидаемым через Тип()
  3. 3
    Для ссылок проверьте заполненность функцией ЗначениеЗаполнено()
  4. 4
    Выполните операцию только после подтверждения типа
  5. 5
    В запросах с составными полями применяйте ВЫРАЗИТЬ для сужения типа

Типичные ошибки при работе с типами

Самая распространённая ошибка — сложение числа со строкой. В 1С операция "Итого: " + 100 сработает (неявное преобразование), а 100 + "50" вызовет ошибку, так как строка не преобразуется в число автоматически. Всегда приводите типы явно, когда данные приходят из внешних источников: файлов, форм, HTTP-запросов.

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

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

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

Типы данных в 1С делятся на примитивные, ссылочные, коллекции и системные. Реквизиты могут иметь составной тип, поэтому перед операцией проверяйте значение через ТипЗнч(). Различайте пустую ссылку, пустую дату, Неопределено и Null — это разные состояния с разными способами проверки. Явное преобразование типов надёжнее неявного.

Частые вопросы

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

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

Как узнать тип значения переменной?

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

Можно ли изменить тип реквизита в работающей базе?

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

Почему запрос возвращает ошибку при сравнении полей?

Чаще всего сравниваются значения несовместимых типов — например, строка с числом или ссылки разных видов в соединении без приведения. Проверьте типы полей в метаданных и при необходимости примените ВЫРАЗИТЬ для явного указания типа поля.

Что выбрать для хранения файла в базе: строку или ХранилищеЗначения?

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

Как проверить, заполнено ли значение любого типа?

Универсальный способ — функция ЗначениеЗаполнено(Значение). Она возвращает Ложь для Неопределено, Null, пустой ссылки, пустой даты, пустой строки и нуля. Для точечных проверок ссылок используйте метод Пустая(), а для дат — сравнение с '00010101'.