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

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

Тип значения в 1С: что это и как с ним работать

Что такое тип значения в 1С: примитивные и ссылочные типы, составные типы, проверка типа в коде, преобразование значений и типичные ошибки разработчиков.

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

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

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

Какие группы типов значений существуют в 1С

Все типы значений в платформе 1С условно делятся на несколько групп. Первая — примитивные типы: Число, Строка, Дата, Булево, а также специальное значение Неопределено и NULL (последнее встречается в основном в запросах). Эти типы хранят сами данные, а не ссылки на объекты базы.

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

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

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

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

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

Тип «Дата» может хранить только дату, только время или дату со временем — это настраивается свойством «Состав даты». Тип «Булево» принимает значения Истина или Ложь и используется для флагов и признаков. Отдельно упомянем значение Неопределено — оно означает отсутствие значения и часто становится источником ошибок, если его не проверить перед использованием.

Ссылочные типы и работа с объектами базы

Ссылочные типы образуются автоматически при создании объектов метаданных. Создали справочник «Номенклатура» — появились типы СправочникСсылка.Номенклатура и СправочникОбъект.Номенклатура. Ссылка — лёгкое значение-указатель; объект — полная копия данных в памяти с возможностью изменения и записи.

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

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

Составные типы: когда реквизит хранит разные значения

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

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

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

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

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

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

Порядок действий при ошибке преобразования типа
  1. 1
    Найдите в тексте ошибки строку модуля и имя переменной или реквизита
  2. 2
    Определите фактический тип значения: добавьте отладку с ТипЗнч() или остановитесь в точке останова
  3. 3
    Проверьте, не равно ли значение Неопределено или NULL
  4. 4
    Добавьте проверку типа перед операцией или преобразуйте значение явно
  5. 5
    Повторите сценарий и убедитесь, что ошибка не воспроизводится

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

Самая частая ошибка — обращение к реквизиту через точку от значения, которое оказалось Неопределено. Например, запрос вернул пустую выборку, переменная не заполнена, а код пытается прочитать её свойство. Решение — всегда проверять результат выборки и заполненность значений перед обращением к свойствам.

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

Типичные ошибки
01
Обращение к свойству значения Неопределено — приводит к ошибке времени выполнения; добавляйте проверку перед обращением
02
Преобразование строки к числу без проверки содержимого — вызывает исключение на данных из файлов и внешних систем
03
Игнорирование NULL в результатах соединений запросов — проверки на Неопределено не срабатывают, используйте ЕСТЬNULL()
04
Вызов ПолучитьОбъект() в цикле вместо запроса — резкое замедление обработки на больших объёмах данных

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

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

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

Маршрут решения

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

Значение выбирается из короткого фиксированного списка, заданного разработчикомИспользуйте перечисление
Список значений пополняют пользователи или он содержит дополнительные реквизитыСоздайте справочник и ссылочный тип
Реквизит должен ссылаться на объекты нескольких видовНастройте составной тип только из ссылочных типов или определяемый тип
Нужно хранить произвольный текст заметокСтрока неограниченной длины, но не используйте её в индексах и соединениях
Итог

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

Тип значения определяет допустимые данные и операции. Различайте примитивные, ссылочные типы и объекты; проверяйте типы через ТипЗнч(), заполненность — через ЗначениеЗаполнено(); осторожно работайте с составными типами, NULL и преобразованиями строк.

Частые вопросы о типах значений в 1С

Чем ссылка отличается от объекта в 1С?

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

Чем NULL отличается от Неопределено?

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

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

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

Почему нельзя хранить числа в строковом реквизите?

Строки сравниваются посимвольно, поэтому сортировка даст порядок «1, 10, 2», а условия больше/меньше в запросах и отборах будут работать неправильно. Кроме того, по строковому полю нельзя корректно посчитать сумму в отчётах и группировках.

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

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

Можно ли изменить тип существующего реквизита с данными?

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