В системе 1С:Предприятие понятие типа значения — это основа, на которой строится вся логика работы с данными. Без понимания типов невозможно корректно писать запросы, создавать отчеты или разрабатывать конфигурации. Но что скрывается за этим термином? Почему в одних случаях Число ведет себя как целое, а в других — как дробное? И почему попытка сложить строку с датой приводит к ошибке?
Эта статья не просто перечислит все типы значений из справки. Мы разберем их практическое применение, покажем, как неявное приведение типов может сломать ваш код, и дадим рекомендации по оптимизации кода с учетом особенностей типов. Материал будет полезен как начинающим разработчикам, так и опытным специалистам, которые хотят систематизировать знания.
1. Что такое тип значения в 1С и зачем он нужен
В 1С:Предприятие 8 тип значения определяет:
- 📦 Формат хранения данных — как значение физически записывается в базу или в память.
- 🔄 Допустимые операции — можно ли сложить, сравнить или преобразовать значение.
- 🔍 Поведение в выражениях — как система интерпретирует значение в разных контекстах (например, в запросах или при выводе на форму).
Например, значение 10 может быть:
- 🔢 Числом — тогда его можно умножать на другие числа.
- 📅 Датой — если это 10-е число месяца (но такой код приведет к ошибке без явного приведения).
- 🔤 Строкой — если это часть артикула товара.
Система 1С строго типизирована, но поддерживает неявное приведение в некоторых случаях. Это удобно, но может стать источником трудноуловимых ошибок. Например, сравнение Дата(2026, 1, 10) = "10.01.2026" вернет Истина, а вот Дата(2026, 1, 10) + 1 — уже ошибку.
2. Базовые (примитивные) типы значений
Это простейшие типы, которые не имеют внутренней структуры. Их можно разделить на три группы:
| Тип | Пример значения | Особенности |
|---|---|---|
| Число | 42, 3.14 |
Поддерживает арифметические операции. Точность дробной части зависит от настроек платформы. |
| Строка | "Привет", "123" |
Неизменяемый тип. Операции конкатенации (+) создают новую строку. |
| Дата | Дата(2026, 5, 15) |
Хранит дату и время. Поддерживает арифметику (прибавление дней, месяцев). |
| Булево | Истина, Ложь |
Используется в логических выражениях. В запросах преобразуется в 1/0. |
Особое внимание стоит уделить числу. В 1С нет отдельных типов для целых и дробных чисел — это определяется контекстом. Например:
Число1 = 10; // Целое
Число2 = 10.0; // Дробное (но физически хранится как 10)
Результат = 10 / 3; // 3.333..., а не 3!
Это приводит к распространенной ошибке при работе с денежными суммами, где важна точность. Например, 1.1 + 2.2 в 1С может дать 3.3000000000000003 из-за особенностей представления чисел с плавающей точкой.
Для финансовых расчетов используйте функцию Окр() с указанием точности, например: Окр(1.1 + 2.2, 2) → вернет 3.30.
3. Сложные типы: объекты, коллекции и специальные значения
Кроме примитивов, в 1С есть типы, которые содержат другие значения или имеют сложную структуру:
- 📊 Массив — упорядоченная коллекция значений. Может содержать элементы разных типов (в отличие от типизированных массивов в других языках).
- 🔑 Структура — набор пар "ключ-значение". Ключи всегда строки, значения — любые типы.
- 📄 ТаблицаЗначений — двумерная структура с колонками и строками. Аналог таблицы в базе данных.
- 🔗 Ссылка — указатель на объект метаданных (справочник, документ и т.д.). Физически хранит
УникальныйИдентификатор. - 🖼️ ХранилищеЗначения — контейнер для сериализации сложных данных (например, для сохранения в реквизитах).
Работа со ссылками — одна из самых сложных тем для новичков. Ссылка сама по себе не содержит данных объекта, а только указывает на него. Например:
СсылкаНаДокумент = Документы.ПоступлениеТоваров.СоздатьСсылку();
Сообщить(СсылкаНаДокумент.Пустая()); // Истина — ссылка не указывает на реальный документ
Частая ошибка — попытка получить реквизиты по "пустой" ссылке. Это приведет к исключению. Всегда проверяйте ссылки на заполненность с помощью метода Пустая() или оператора ?:
Если НЕ СсылкаНаДокумент.Пустая() Тогда
ДатаДокумента = СсылкаНаДокумент.Дата;
КонецЕсли;
Чем отличается Ссылка от Объекта?
Ссылка — это "адрес" объекта в базе (легковесный), а Объект — это загруженные данные с реквизитами, табличными частями и методами. Работать с объектом можно только после вызова ПолучитьОбъект() или СоздатьОбъект().
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С
В языке запросов 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С:
- 🔴 Несовместимые операции — попытка сложить строку с датой или число с булевым значением.
- 🔴 Неявное приведение — когда система молча преобразовывает типы, но не так, как вы ожидаете.
- 🔴 Пустые ссылки — обращение к реквизитам по неинициализированной ссылке.
- 🔴 Потеря точности — например, при преобразовании
Число(10,5)вЧисло(10,2).
Для отладки используйте:
- 🐞
ТипЗнч()— проверяет фактический тип значения. - 🐞
Сообщить()с выводом промежуточных результатов. - 🐞 Отладчик 1С — ставьте точки останова и смотрите значения переменных.
Пример типичной ошибки и ее исправления:
// Ошибка: попытка сравнить строку с числом
Если "100" > 50 Тогда
// Этот код выполнится, но логика может быть неочевидной
КонецЕсли;
// Правильно:
Если Число("100") > 50 Тогда
// Явное преобразование делает код предсказуемым
КонецЕсли;
Еще один опасный случай — работа с Неопределено. Это значение не равно NULL в запросах и не равно пустой строке. Например:
Переменная = Неопределено;
Если Переменная = "" Тогда
Сообщить("Пустая строка"); // Не выполнится!
КонецЕсли;
Для проверки на Неопределено используйте функцию ЗначениеЗаполнено():
Если НЕ ЗначениеЗаполнено(Переменная) Тогда
Сообщить("Значение не определено");
КонецЕсли;
Переменная = Ложь; или Переменная = 0; в зависимости от контекста.-->
7. Оптимизация работы с типами значений
Правильное использование типов может значительно ускорить работу кода. Несколько рекомендаций:
- ⚡ Избегайте лишних преобразований — если значение уже правильного типа, не приводите его заново.
- ⚡ Используйте типизированные коллекции — например,
МассивЧисел = Новый Массив(10, Тип("Число")). - ⚡ Кэшируйте часто используемые типы — например, храните ссылки на справочники в переменных, а не получайте их каждый раз по имени.
- ⚡ Минимизируйте работу с ХранилищеЗначения — сериализация/десериализация занимает много ресурсов.
Пример оптимизации кода с учетом типов:
// Неоптимально: постоянные преобразования
Для Каждого Строка Из Таблица Цикл
Если Число(Строка.Количество) > 0 Тогда
Итог = Итог + Число(Строка.Количество);
КонецЕсли;
КонецЦикла;
// Оптимально: одно преобразование и типизированная переменная
Итог = 0;
Для Каждого Строка Из Таблица Цикл
Количество = Число(Строка.Количество); // Преобразуем один раз
Если Количество > 0 Тогда
Итог = Итог + Количество;
КонецЕсли;
КонецЦикла;
Еще один важный момент — работа с большими ТаблицаЗначений. Если вам нужно часто обращаться к данным по индексу, лучше преобразовать таблицу в массив:
МассивДанных = Таблица.ВыгрузитьКолонку("Наименование");
Это ускорит доступ к элементам, так как работа с массивами в 1С оптимизирована лучше, чем с таблицами.
8. Типы значений в обмене данными
При интеграции 1С с другими системами (например, через HTTP-Сервис, REST API или JSON) типы значений требуют особого внимания. Основные проблемы:
- 🌍 Форматы дат — в 1С дата хранится как число дней с 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 в 1С есть встроенные функции Прочитать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", Данные);
Возврат Результат;
КонецФункции;
При десериализации восстанавливайте типы по метаданным.