В системе 1С:Предприятие понятие типа значения — это основа, на которой строится вся логика работы с данными. Без понимания типов невозможно корректно писать запросы, создавать отчеты или разрабатывать конфигурации. Но что скрывается за этим термином? Почему в одних случаях Число ведет себя как целое, а в других — как дробное? И почему попытка сложить строку с датой приводит к ошибке?

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

1. Что такое тип значения в 1С и зачем он нужен

В 1С:Предприятие 8 тип значения определяет:

  • 📦 Формат хранения данных — как значение физически записывается в базу или в память.
  • 🔄 Допустимые операции — можно ли сложить, сравнить или преобразовать значение.
  • 🔍 Поведение в выражениях — как система интерпретирует значение в разных контекстах (например, в запросах или при выводе на форму).

Например, значение 10 может быть:

  • 🔢 Числом — тогда его можно умножать на другие числа.
  • 📅 Датой — если это 10-е число месяца (но такой код приведет к ошибке без явного приведения).
  • 🔤 Строкой — если это часть артикула товара.

Система строго типизирована, но поддерживает неявное приведение в некоторых случаях. Это удобно, но может стать источником трудноуловимых ошибок. Например, сравнение Дата(2026, 1, 10) = "10.01.2026" вернет Истина, а вот Дата(2026, 1, 10) + 1 — уже ошибку.

📊 Как часто вы сталкиваетесь с ошибками типов в 1С?
Постоянно
Иногда
Рядом
Никогда

2. Базовые (примитивные) типы значений

Это простейшие типы, которые не имеют внутренней структуры. Их можно разделить на три группы:

Тип Пример значения Особенности
Число 42, 3.14 Поддерживает арифметические операции. Точность дробной части зависит от настроек платформы.
Строка "Привет", "123" Неизменяемый тип. Операции конкатенации (+) создают новую строку.
Дата Дата(2026, 5, 15) Хранит дату и время. Поддерживает арифметику (прибавление дней, месяцев).
Булево Истина, Ложь Используется в логических выражениях. В запросах преобразуется в 1/0.

Особое внимание стоит уделить числу. В нет отдельных типов для целых и дробных чисел — это определяется контекстом. Например:

Число1 = 10;      // Целое

Число2 = 10.0; // Дробное (но физически хранится как 10)

Результат = 10 / 3; // 3.333..., а не 3!

Это приводит к распространенной ошибке при работе с денежными суммами, где важна точность. Например, 1.1 + 2.2 в может дать 3.3000000000000003 из-за особенностей представления чисел с плавающей точкой.

💡

Для финансовых расчетов используйте функцию Окр() с указанием точности, например: Окр(1.1 + 2.2, 2) → вернет 3.30.

3. Сложные типы: объекты, коллекции и специальные значения

Кроме примитивов, в есть типы, которые содержат другие значения или имеют сложную структуру:

  • 📊 Массив — упорядоченная коллекция значений. Может содержать элементы разных типов (в отличие от типизированных массивов в других языках).
  • 🔑 Структура — набор пар "ключ-значение". Ключи всегда строки, значения — любые типы.
  • 📄 ТаблицаЗначений — двумерная структура с колонками и строками. Аналог таблицы в базе данных.
  • 🔗 Ссылка — указатель на объект метаданных (справочник, документ и т.д.). Физически хранит УникальныйИдентификатор.
  • 🖼️ ХранилищеЗначения — контейнер для сериализации сложных данных (например, для сохранения в реквизитах).

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

СсылкаНаДокумент = Документы.ПоступлениеТоваров.СоздатьСсылку();

Сообщить(СсылкаНаДокумент.Пустая()); // Истина — ссылка не указывает на реальный документ

Частая ошибка — попытка получить реквизиты по "пустой" ссылке. Это приведет к исключению. Всегда проверяйте ссылки на заполненность с помощью метода Пустая() или оператора ?:

Если НЕ СсылкаНаДокумент.Пустая() Тогда

ДатаДокумента = СсылкаНаДокумент.Дата;

КонецЕсли;

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

Ссылка — это "адрес" объекта в базе (легковесный), а Объект — это загруженные данные с реквизитами, табличными частями и методами. Работать с объектом можно только после вызова ПолучитьОбъект() или СоздатьОбъект().

4. Неявное и явное приведение типов

1С:Предприятие в некоторых случаях автоматически преобразует типы (неявное приведение), но это работает не всегда логично. Например:

Выражение Результат Пояснение
"10" + 5 15 Строка "10" преобразуется в число.
Дата(2026,1,1) + 1 Ошибка Нельзя складывать дату с числом без явного приведения.
Истина + 1 2 Истина преобразуется в 1.

Для явного приведения используются функции:

  • 🔢 Число() — преобразует строку или дату в число (например, Число("10.5")).
  • 📅 Дата() — создает дату из строки или числа (например, Дата(20260515)).
  • 🔤 Строка() — преобразует любое значение в строку (например, Строка(Дата(2026,5,15)) → "15.05.2026").
  • 🔍 ТипЗнч() — возвращает тип значения (например, ТипЗнч(10) → "Число").

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

Результат = Число("abc"); // Вернет 0, а не ошибку!
💡

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

5. Типы значений в запросах 1С

В языке запросов типы значений ведут себя иначе, чем в встроенном языке. Основные различия:

  • 📊 NULL в запросах — соответствует Неопределено во встроенном языке, но ведет себя как отдельное значение.
  • 🔢 Арифметика — в запросах 10 / 3 вернет 3 (целочисленное деление), а во встроенном языке — 3.333....
  • 📅 Даты — в запросах даты сравниваются без времени, если не указано иное.

Пример проблемы с типами в запросе:

ВЫБРАТЬ

СуммаКОличество КАК Количество

ИЗ

Документ.ПоступлениеТоваров.Товары

ГДЕ

Количество > 5.5

Если поле Количество в базе имеет тип "Число(10,3)", а в условии указано 5.5 (которое воспринимается как Число(10,1)), то сравнение может работать некорректно из-за разной точности. Решение — явно приводить типы:

ГДЕ Количество > Число(5.5, 10, 3)

Еще одна ловушка — работа с NULL. В запросах проверка ЗНАЧЕНИЕ = NULL всегда возвращает ЛОЖЬ, даже если значение действительно NULL. Правильный синтаксис:

ВЫБРАТЬ

Наименование

ИЗ

Справочник.Номенклатура

ГДЕ

Наименование ЕСТЬ NULL

Явно указывайте точность чисел (Число(значение, разрядность, количество знаков)|

Используйте ЕСТЬ NULL / NULL ЕСТЬ для проверки на неопределенность|

Сравнивайте даты с учетом времени, если это критично (например, ДатаВремя(1,1,1 0:0:0))|

Тестируйте запросы на пустых и пограничных данных-->

6. Ошибки типов: как их находить и исправлять

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

  1. 🔴 Несовместимые операции — попытка сложить строку с датой или число с булевым значением.
  2. 🔴 Неявное приведение — когда система молча преобразовывает типы, но не так, как вы ожидаете.
  3. 🔴 Пустые ссылки — обращение к реквизитам по неинициализированной ссылке.
  4. 🔴 Потеря точности — например, при преобразовании Число(10,5) в Число(10,2).

Для отладки используйте:

  • 🐞 ТипЗнч() — проверяет фактический тип значения.
  • 🐞 Сообщить() с выводом промежуточных результатов.
  • 🐞 Отладчик — ставьте точки останова и смотрите значения переменных.

Пример типичной ошибки и ее исправления:

// Ошибка: попытка сравнить строку с числом

Если "100" > 50 Тогда

// Этот код выполнится, но логика может быть неочевидной

КонецЕсли;

// Правильно:

Если Число("100") > 50 Тогда

// Явное преобразование делает код предсказуемым

КонецЕсли;

Еще один опасный случай — работа с Неопределено. Это значение не равно NULL в запросах и не равно пустой строке. Например:

Переменная = Неопределено;

Если Переменная = "" Тогда

Сообщить("Пустая строка"); // Не выполнится!

КонецЕсли;

Для проверки на Неопределено используйте функцию ЗначениеЗаполнено():

Если НЕ ЗначениеЗаполнено(Переменная) Тогда

Сообщить("Значение не определено");

КонецЕсли;

Переменная = Ложь; или Переменная = 0; в зависимости от контекста.-->

7. Оптимизация работы с типами значений

Правильное использование типов может значительно ускорить работу кода. Несколько рекомендаций:

  • Избегайте лишних преобразований — если значение уже правильного типа, не приводите его заново.
  • Используйте типизированные коллекции — например, МассивЧисел = Новый Массив(10, Тип("Число")).
  • Кэшируйте часто используемые типы — например, храните ссылки на справочники в переменных, а не получайте их каждый раз по имени.
  • Минимизируйте работу с ХранилищеЗначения — сериализация/десериализация занимает много ресурсов.

Пример оптимизации кода с учетом типов:

// Неоптимально: постоянные преобразования

Для Каждого Строка Из Таблица Цикл

Если Число(Строка.Количество) > 0 Тогда

Итог = Итог + Число(Строка.Количество);

КонецЕсли;

КонецЦикла;

// Оптимально: одно преобразование и типизированная переменная

Итог = 0;

Для Каждого Строка Из Таблица Цикл

Количество = Число(Строка.Количество); // Преобразуем один раз

Если Количество > 0 Тогда

Итог = Итог + Количество;

КонецЕсли;

КонецЦикла;

Еще один важный момент — работа с большими ТаблицаЗначений. Если вам нужно часто обращаться к данным по индексу, лучше преобразовать таблицу в массив:

МассивДанных = Таблица.ВыгрузитьКолонку("Наименование");

Это ускорит доступ к элементам, так как работа с массивами в оптимизирована лучше, чем с таблицами.

8. Типы значений в обмене данными

При интеграции с другими системами (например, через HTTP-Сервис, REST API или JSON) типы значений требуют особого внимания. Основные проблемы:

  • 🌍 Форматы дат — в дата хранится как число дней с 1.01.0001, а в JSON это обычно строка в формате ISO.
  • 🌍 Кодировки строк — при обмене может произойти потеря символов, если не указать UTF-8.
  • 🌍 Ссылки на объекты — в внешних системах нет понятия "ссылка", поэтому их обычно передают как строки (GUID или код+наименование).

Пример преобразования даты для JSON:

Дата1С = Дата(2026, 5, 15);

ДатаДляJSON = Формат(Дата1С, "ДФ=yyyy-MM-dd"); // "2026-05-15"

Обратное преобразование:

ДатаИзJSON = Дата(2026, 5, 15, 0, 0, 0); // Если пришла строка "2026-05-15"

Для работы с JSON в есть встроенные функции ПрочитатьJSON() и ЗаписатьJSON(), но они не всегда корректно обрабатывают типы. Например, число 10000000000 может быть прочитано как строка из-за ограничений JavaScript. В таких случаях используйте ручное преобразование:

Данные = ПрочитатьJSON(СтрокаJSON);

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

Данные.Сумма = Число(Данные.Сумма);

КонецЕсли;

💡

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

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

Как узнать тип значения в 1С?

Используйте функцию ТипЗнч(). Она вернет строку с названием типа, например:

Тип = ТипЗнч(10); // "Число"

Тип = ТипЗнч(Дата(2026,1,1)); // "Дата"

Для проверки конкретного типа можно использовать конструкцию:

Если ТипЗнч(Значение) = Тип("Строка") Тогда

// Обработка строки

КонецЕсли;

Почему в 1С нельзя сложить дату и число напрямую?

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

НоваяДата = ТекущаяДата.Добавить(День: 5); // Прибавляет 5 дней

Исключение — если число представляет собой количество секунд (для типа ДатаВремя), но это редко используется.

Как преобразовать строку в число, если строка может содержать мусор?

Используйте комбинацию Число() и проверку на Неопределено:

Функция БезопасноеЧисло(Значение)

Попытка

Возврат Число(Значение);

Исключение

Возврат Неопределено;

КонецПопытки;

КонецФункции;

Или проверяйте строку на соответствие числовому формату с помощью регулярных выражений.

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

ТипЗнч() возвращает тип конкретного значения (например, "Число" для 10), а Тип() — это конструктор типа для создания новых объектов или проверки совместимости. Примеры:

// ТипЗнч()

ТипПеременной = ТипЗнч(Истина); // "Булево"

// Тип()

Если Тип(10) = Тип("Число") Тогда

// Это условие Истина

КонецЕсли;

Тип() также используется для объявления типизированных коллекций:

МассивДаты = Новый Массив(10, Тип("Дата"));
Как передать таблицу значений в JSON без потери типов?

Встроенная функция ЗаписатьJSON() преобразует все данные в строки, числа и булевы значения. Для сохранения типов (например, дат) используйте кастомную сериализацию:

Функция СериализоватьТаблицу(Таблица)

Результат = Новый Структура();

Данные = Новый Массив();

Для Каждого Строка Из Таблица Цикл

СтрокаДанных = Новый Структура();

Для Каждого Колонка Из Таблица.Колонки Цикл

Значение = Строка[Колонка.Имя];

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

СтрокаДанных.Вставить(Колонка.Имя, Формат(Значение, "ДФ=yyyy-MM-dd"));

Иначе

СтрокаДанных.Вставить(Колонка.Имя, Значение);

КонецЕсли;

КонецЦикла;

Данные.Добавить(СтрокаДанных);

КонецЦикла;

Результат.Вставить("meta", Таблица.Метаданные());

Результат.Вставить("data", Данные);

Возврат Результат;

КонецФункции;

При десериализации восстанавливайте типы по метаданным.