Система 1С:Предприятие оперирует десятками различных типов данных — от простых чисел до сложных объектов метаданных. Понимание их классификации и особенностей критично для разработчиков, администраторов и даже опытных пользователей, которые хотят автоматизировать рутинные операции. Без знания типов данных невозможно корректно написать запрос, создать отчёт или интегрировать 1С с внешними системами.
В этой статье мы разберём все категории типов данных в 1С 8.3, покажем их иерархию, приведём примеры использования в коде и объясним, какие ловушки таят в себе неявные преобразования. Особое внимание уделим составным типам (массивы, структуры, соответствия) и специальным объектам (документы, справочники), которые часто становятся источником ошибок у новичков.
1. Примитивные (базовые) типы данных
Это фундаментальные типы, которые не требуют предварительного объявления и используются для хранения элементарных значений. Их главное преимущество — простота и высокая скорость обработки. В 1С к примитивам относятся:
- 🔢 Число — целое или дробное значение (например,
42или3.14). Поддерживает арифметические операции и функции округления. - 📝 Строка — последовательность символов в кодировке Unicode (пример:
"Привет, мир!"). Максимальная длина — 2 млрд символов. - 🗓️ Дата — дата и время (например,
'2026-12-31 23:59:59'). Хранится в внутреннем формате и автоматически адаптируется к региональным настройкам. - 🅱️ Булево — логическое значение (
ИстинаилиЛожь). Используется в условиях и циклах. - 🆔 Null — специальное значение "неопределённость". Возникает при отсутствии данных или ошибках преобразования.
Примитивные типы часто становятся источником скрытых ошибок из-за неявного приведения. Например, сложение числа со строкой (5 + "3") вернёт строку "53", а не 8. Чтобы избежать таких ситуаций, используйте явное преобразование функцией Число():
Результат = Число("123") + 456; // Вернёт 579, а не "123456"
⚠️ Внимание: При работе с датами учитывайте, что функция ТекущаяДата() возвращает дату сервера 1С, а не клиентского компьютера. Это может привести к расхождениям в распределённых системах.
2. Составные типы данных
Эти типы позволяют хранить наборы значений или пар "ключ-значение". Они незаменимы для обработки сложных данных, передачи параметров между функциями и временного хранения промежуточных результатов.
| Тип | Описание | Пример объявления | Когда использовать |
|---|---|---|---|
| Массив | Упорядоченный список элементов с доступом по индексу (начинается с 0). | МойМассив = Новый Массив(1, 2, 3); |
Хранение однотипных данных фиксированного размера. |
| Структура | Набор пар "ключ-значение", где ключ — строка. | МояСтруктура = Новый Структура("Имя, Возраст", "Иван", 30); |
Передача именованных параметров в функции. |
| Соответствие | Ассоциативный массив с произвольными ключами (не только строками). | МойСловарь = Новый Соответствие;МойСловарь.Вставить(123, "Сто двадцать три"); |
Сложные поиски по нестроковым ключам. |
| СписокЗначений | Коллекция с возможностью отображения в интерфейсе (например, в выпадающих списках). | МойСписок = Новый СписокЗначений;МойСписок.Добавить("Элемент1"); |
Интерактивные элементы форм. |
Один из самых распространённых составных типов — Структура. Она удобна для возврата нескольких значений из функции:
Функция ПолучитьДанныеОПользователе()
Результат = Новый Структура;
Результат.Вставить("Имя", "Алексей");
Результат.Вставить("Возраст", 28);
Результат.Вставить("Активен", Истина);
Возврат Результат;
КонецФункции
⚠️ Внимание: При работе сСоответствиемпомните, что ключи сравниваются по значению, а не по типу. Например, ключи123(число) и"123"(строка) будут считаться разными!
Для быстрого создания структуры из массива пар "ключ-значение" используйте конструктор: Новый Структура("Ключ1, Ключ2", Значение1, Значение2). Это сокращает код на 30-40% по сравнению с поэлементным добавлением.
3. Ссылочные типы (объекты метаданных)
Это уникальная особенность 1С, которая выделяет её среди других языков программирования. Ссылочные типы представляют собой ссылки на объекты конфигурации: справочники, документы, регистры и т.д. Они хранят не сами данные, а указатели на них в базе.
Основные виды ссылочных типов:
- 📁 СправочникСсылка — ссылка на элемент справочника (например,
Справочники.Номенклатура.НайтиПоНаименованию("Монитор")). - 📄 ДокументСсылка — ссылка на документ (пример:
Документы.ЗаказПокупателя.СоздатьДокумент()). - 📊 РегистрСведенийСсылка — ссылка на запись регистра (используется в отчётах и запросах).
- 👤 ПланВидовХарактеристикСсылка — ссылка на элемент ПВХ (для сложных аналитических разрезов).
Ключевая особенность ссылочных типов — они автоматически контролируют права доступа. Если у пользователя нет прав на чтение справочника, попытка получить данные по ссылке вызовет ошибку.
// Пример работы со ссылочным типом
СсылкаНаТовар = Справочники.Номенклатура.СоздатьЭлемент();
СсылкаНаТовар.Наименование = "Ноутбук";
СсылкаНаТовар.Записать();
// Теперь можно использовать ссылку для получения данных
НаименованиеТовара = СсылкаНаТовар.Наименование;
Как проверить, что ссылка указывает на существующий объект?
Используйте метод Ссылка.Пустая() или конструкцию ТипЗнч(Ссылка) = Тип("СправочникСсылка.Номенклатура"). Пустые ссылки часто возникают после удаления объектов или ошибок в коде.
4. Специальные типы для работы с файлами и двоичными данными
Эта категория типов предназначена для обработки внешних данных: файлов, картинок, PDF-документов и т.д. В 1С 8.3 для этих целей используются:
- 📎 ДвоичныеДанные — хранит произвольные байтовые последовательности (например, содержимое файла).
- 🖼️ Картинка — специализированный тип для изображений (поддерживает форматы JPEG, PNG, BMP).
- 📑 Файл — объект для чтения/записи файлов на диске или в временном хранилище.
- 🔗 HTTPСервисОтвет — результат вызова веб-сервиса (включает тело ответа, заголовки, статус).
Работа с двоичными данными требует осторожности из-за ограничений памяти. Например, попытка загрузить файл размером 2 ГБ в переменную типа ДвоичныеДанные приведёт к ошибке переполнения.
// Пример загрузки файла в двоичные данные
ПутьКФайлу = "C:\Temp\document.pdf";
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
// Сохранение двоичных данных обратно в файл
ДвоичныеДанныеФайла.Записать("C:\Temp\copy_document.pdf");
⚠️ Внимание: При работе сКартинкапомните, что методПолучитьДвоичныеДанные()возвращает данные в формате PNG, даже если исходное изображение было в JPEG. Это может увеличить размер файла в 2-3 раза.
5. Типы для работы с запросами и результатами
Эти типы используются при выполнении запросов к базе данных и обработке их результатов. Они оптимизированы для работы с большими объёмами данных и поддерживают отложенное чтение (lazy loading).
| Тип | Назначение | Пример использования |
|---|---|---|
| Запрос | Объект для формирования и выполнения SQL-подобных запросов. | Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 10 ИЗ Справочник.Номенклатура"); |
| РезультатЗапроса | Хранит данные, возвращённые запросом. Поддерживает итерацию. | Результат = Запрос.Выполнить(); |
| ТаблицаЗначений | Двумерная структура для хранения данных в памяти (аналог таблицы БД). | Таблица = Новый ТаблицаЗначений; |
| ДеревоЗначений | Иерархическая структура для отображения древовидных данных. | Дерево = Новый ДеревоЗначений; |
Один из самых мощных инструментов — ТаблицаЗначений. Она позволяет эмулировать работу с базой данных в памяти, что ускоряет обработку небольших наборов данных:
ТаблицаТоваров = Новый ТаблицаЗначений;
ТаблицаТоваров.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка"));
ТаблицаТоваров.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
НоваяСтрока = ТаблицаТоваров.Добавить();
НоваяСтрока.Артикул = "ABC123";
НоваяСтрока.Цена = 1999.99;
Для ускорения работы с большими таблицами значений (>10 000 строк) используйте метод Индексировать() перед поиском или сортировкой. Это сокращает время операций в 5-10 раз.
6. Типы для интеграции и веб-сервисов
С развитием облачных технологий в 1С появились специализированные типы для работы с веб-сервисами, JSON, XML и другими форматами обмена данными. Они позволяют интегрировать 1С с внешними системами: сайтами, CRM, платежными шлюзами.
- 🌐 HTTPСоединение — объект для отправки HTTP-запросов (GET, POST, PUT).
- 📜 JSON — тип для работы с данными в формате JSON (сериализация/десериализация).
- 📥 XML — поддержка XML-документов и XDTO-пакетов.
- 🔑 WSОписание — описание WSDL для работы с SOAP-сервисами.
Пример работы с JSON:
// Преобразование структуры в JSON
Данные = Новый Структура("Имя, Возраст", "Мария", 25);
JSONТекст = Новый ЗаписьJSON;
JSONТекст.УстановитьСтроку();
ЗаписатьJSON(JSONТекст, Данные);
РезультатJSON = JSONТекст.Закрыть();
// Обратное преобразование
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(РезультатJSON);
ВосстановленныеДанные = ПрочитатьJSON(ЧтениеJSON);
⚠️ Внимание: При работе сHTTPСоединениевсегда проверяйте свойствоСтатусКодаответа. Код200не гарантирует корректность данных — сервер мог вернуть ошибку в теле ответа (например,{"error": "Invalid token"}).
Проверьте доступность endpoint по HTTP|Создайте резервную копию базы|Настройте права пользователя для внешних соединений|Протестируйте обмен на тестовом сервере-->
7. Пользовательские типы и расширения
Помимо стандартных типов, в 1С можно создавать собственные типы данных через механизм расширений или внешние компоненты. Это актуально для:
- 🔧 Сложных бизнес-логик (например, тип "Адрес" с валидацией по ФИАС).
- 🔌 Интеграции со специализированным оборудованием (сканеры, весы).
- 📦 Работы с нестандартными форматами данных (например, протоколы обмена с банками).
Пример создания пользовательского типа через расширение:
// В модуле расширения
Процедура СоздатьТипАдрес() Экспорт
НовыйТип = Новый ОписаниеТипов("Структура", ,
Новый КвалификаторыСтруктуры("Улица, Дом, Квартира", Новый КвалификаторыСтруктуры("Строка, Строка, Строка")));
Возврат НовыйТип;
КонецПроцедуры
Пользовательские типы требуют тщательного документирования, так как их поведение неочевидно для других разработчиков. Всегда описывайте:
- 📌 Формат хранения данных.
- 🔄 Правила преобразования в стандартные типы.
- ⚡ Ограничения и возможные исключения.
8. Типы для отладки и диагностики
Эта категория включает типы, которые используются для анализа кода, профилирования и диагностики ошибок. Они редко встречаются в бизнес-логике, но незаменимы при разработке:
- 🐞 ОписаниеОшибки — содержит информацию об исключении (текст, модуль, строка кода).
- ⏱️ Секундомер — замер времени выполнения кода.
- 📡 ИнформацияОСистеме — данные о версии платформы, лицензиях, оборудовании.
- 📋 ЖурналРегистрации — запись событий для последующего анализа.
Пример использования Секундомер для оптимизации кода:
Секундомер = Новый Секундомер;
Секундомер.Запустить();
// Код, время выполнения которого нужно замерить
Для Сч = 1 По 10000 Цикл
// ... операции ...
КонецЦикла;
Секундомер.Остановить();
Сообщить("Время выполнения: " + Секундомер.ПолучитьЗначение() + " мс");
⚠️ Внимание: Данные изИнформацияОСистемемогут отличаться в зависимости от режима работы (тонкий клиент, веб-клиент, сервер). Например, свойствоТолькоТонкийКлиентвернётИстинатолько в тонком клиенте.
FAQ: Частые вопросы о типах данных в 1С
Как определить тип переменной в 1С?
Используйте функцию ТипЗнч(). Она возвращает строку с описанием типа, например: "Число", "СправочникСсылка.Номенклатура" или "Структура".
Пример:
Переменная = 123;
ТипПеременной = ТипЗнч(Переменная); // Вернёт "Число"
Для проверки принадлежности к группе типов (например, "это ссылка на любой справочник") используйте конструкцию:
Если ТипЗнч(Переменная) = Тип("СправочникСсылка") Тогда
// Код для любой справочной ссылки
КонецЕсли;
Чем отличаются Структура и Соответствие?
Структура:
- Ключи — всегда строки.
- Поддерживает доступ через точку:
Структура.Ключ. - Оптимизирована для передачи параметров в функции.
Соответствие:
- Ключи — любые типы (числа, даты, ссылки).
- Доступ только через методы:
Соответствие.Получить(Ключ). - Поддерживает сложные алгоритмы поиска.
Выбор зависит от задачи: для простых случаев хватит Структуры, для сложных поисков — Соответствие.
Как преобразовать Дату в строку в нужном формате?
Используйте функцию Формат() с шаблоном:
ДатаСейчас = ТекущаяДата();
СтрокаДаты = Формат(ДатаСейчас, "ДФ='dd.MM.yyyy'"); // "31.12.2026"
СтрокаВремени = Формат(ДатаСейчас, "ДЛФ='DT'"); // "31 декабря 2026 г. 23:59:59"
Полный список форматных строк смотрите в документации 1С (раздел "Форматирование данных").
Можно ли создать массив с элементами разных типов?
Да, в 1С массивы могут хранить элементы любых типов, включая смешанные:
СмешанныйМассив = Новый Массив;
СмешанныйМассив.Добавить(123); // Число
СмешанныйМассив.Добавить("Текст"); // Строка
СмешанныйМассив.Добавить(Истина); // Булево
СмешанныйМассив.Добавить(ТекущаяДата()); // Дата
Однако такое использование усложняет обработку данных. Для сложных структур лучше применять Структуру или ТаблицуЗначений.
Как передать таблицу значений в веб-сервис?
Таблицу значений нужно преобразовать в JSON или XML. Пример для JSON:
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Имя");
Таблица.Колонки.Добавить("Возраст");
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Таблица);
JSONСтрока = ЗаписьJSON.Закрыть();
// Отправка через HTTPСоединение
HTTP = Новый HTTPСоединение("api.example.com");
Ответ = HTTP.Постить("/data", JSONСтрока, , , "application/json");
Для обратного преобразования используйте ЧтениеJSON и ПрочитатьJSON().