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