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

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

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

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

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

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

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

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

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

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

Дата хранит момент времени с точностью до секунды. В свойствах реквизита можно выбрать состав даты: только дата, только время или дата и время. Для документов обычно нужен состав «Дата и время», чтобы правильно работала последовательность проведения. Булево принимает только два значения — Истина или Ложь — и применяется для признаков: «Проведён», «Активен», «Облагается налогом».

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

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

Через ссылку можно получить доступ к данным объекта: выражение Контрагент.ИНН обратится к базе и вернёт значение реквизита. Это удобно, но порождает скрытые обращения к базе данных: обход табличной части с обращением к реквизитам ссылки в цикле заметно замедляет код. В таких случаях правильнее выбирать нужные поля запросом.

Отдельный подвид — перечисления. Значение перечисления выбирается из жёстко заданного списка, определённого в конфигураторе, и его нельзя расширить в пользовательском режиме. Если набор значений должен пополняться пользователями, вместо перечисления заводят справочник.

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

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

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

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

Коллекции значений и специальные типы

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

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

Чем заменить перечисление

Перечисление

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

Справочник

Подходит, когда набор значений должен пополняться пользователями. Ограничение: требует контроля дублей и заполненности.

Определяемый тип

Подходит для централизованного описания составных типов в типовых механизмах. Ограничение: доступен в конфигурациях на БСП.

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

Для проверки типа значения используется функция ТипЗнч(Значение), которая возвращает объект типа «Тип», и сравнение с результатом функции Тип("ИмяТипа"). Типичная проверка выглядит так: Если ТипЗнч(Субконто) = Тип("СправочникСсылка.Контрагенты") Тогда .... Для проверки примитивных типов имена указываются как «Число», «Строка», «Дата», «Булево».

Преобразование выполняют функции Число(), Строка(), Дата() и Булево(), а также конструкторы через Новый для сложных объектов. Важно помнить об ограничениях: функция Число("12,5") корректно обработает строку, но Число("двенадцать") вызовет ошибку. Приведение даты из строки требует формата «ГГГГММДД» либо использования функции Дата() с числовыми параметрами.

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

Как задать тип реквизита в конфигураторе
  1. 1
    Откройте объект конфигурации (справочник, документ) и перейдите на вкладку «Данные».
  2. 2
    Добавьте реквизит и в палитре свойств откройте поле «Тип».
  3. 3
    Отметьте нужные типы; для числа задайте длину и точность, для строки — длину или неограниченность.
  4. 4
    Для ссылочных типов проверьте связи параметров выбора и быстрый выбор.
  5. 5
    Обновите конфигурацию базы данных и проверьте заполнение реквизита на тестовой копии.

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

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

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

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

Типичные ошибки
01
Хранение сумм и количеств в строковых реквизитах — ломаются итоги, сортировка и сравнения.
02
Недостаточная точность числа — округление сумм и расхождения в отчётах на копейки.
03
Уменьшение длины строки без анализа данных — значения обрезаются при обновлении без возможности восстановления.
04
Сравнение с Null через знак равенства в запросе — условие никогда не выполняется, нужен оператор ЕСТЬ NULL.
05
Обращение к реквизитам ссылки через точку в цикле — сотни лишних запросов к базе и падение производительности.

Как проверить, что тип выбран правильно

После настройки реквизита проверьте три вещи: ввод данных в форме, поведение в отчётах и обмен данными. В форме убедитесь, что поле принимает реальные значения без обрезки и что работает быстрый выбор для ссылочных типов. В отчётах проверьте, что числовые поля суммируются, а даты корректно группируются по периодам.

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

Контрольные точки

Как проверить результат

Ввод значения в форму
Норма

Значение сохраняется полностью, без обрезки и ошибок преобразования

Тревожный признак

Часть текста пропадает, появляется сообщение о несоответствии типа

Суммирование в отчёте
Норма

Итоги считаются корректно, копейки сходятся

Тревожный признак

Поле не суммируется или итоги расходятся на округления

Обмен данными
Норма

Значения передаются и загружаются без ошибок формата

Тревожный признак

Ошибки преобразования даты, числа или пустые ссылки после загрузки

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

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

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

Как проверить тип переменной в коде 1С?

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

Можно ли изменить тип реквизита без потери данных?

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

Почему код или артикул лучше хранить строкой, а не числом?

Коды и артикулы могут содержать ведущие нули, буквы и разделители, которые число потеряет: артикул «001234-А» в числовом поле превратится в 1234. Кроме того, над кодами не выполняют арифметических операций, поэтому числовой тип им не нужен, а строковый поиск и сравнение работают корректно.

Что такое определяемый тип и когда его использовать?

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

Итог

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

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