Когда речь заходит о модели данных в 1С, многие представляют себе классическую реляционную базу с таблицами и связями — и это частично верно. Однако 1С:Предприятие работает по собственным правилам, сочетая подходы объектно-ориентированного программирования с традиционными СУБД. В этой статье мы разберём, как именно устроена модель данных в платформе, какие объекты конфигурации формируют её основу, и почему знание этих нюансов критично для разработчиков, администраторов и даже опытных пользователей.
Сразу отметим: 1С не использует "чистую" реляционную модель, как MySQL или PostgreSQL. Вместо этого данные хранятся в виде иерархической структуры метаданных, которые преобразуются в физические таблицы СУБД (например, Microsoft SQL Server или PostgreSQL) только на уровне хранения. Это означает, что логика работы с данными в 1С отличается от прямой работы с SQL-запросами — и это нужно учитывать при проектировании решений.
Статья будет полезна тем, кто:
- 🔹 Разрабатывает или поддерживает конфигурации 1С и хочет понять, как данные хранятся "под капотом".
- 🔹 Администрирует базы 1С и оптимизирует их производительность.
- 🔹 Интегрирует 1С с внешними системами и нуждается в понимании структуры данных.
- 🔹 Готовится к экзаменам 1С:Специалист или 1С:Профессионал по платформе.
1. Основные принципы модели данных в 1С
Модель данных в 1С:Предприятие строится на трёх ключевых концепциях:
- Объектная модель — все данные представлены в виде объектов (справочники, документы, регистры и т.д.), а не плоских таблиц.
- Метаданные — описание структуры данных (типы, свойства, связи) хранится отдельно от самих данных.
- Двухуровневая архитектура — логика работы с данными реализована на уровне платформы, а физическое хранение делегируется СУБД.
Это означает, что когда вы создаёте в конфигураторе справочник "Номенклатура", платформа автоматически генерирует:
- 📌 Таблицу хранения (например,
_Reference123в SQL-базе). - 📌 Служебные таблицы для индексов, истории изменений (если включен версионирование).
- 📌 Метаданные — описание структуры справочника (реквизиты, табличные части, подчинённые объекты).
Важно понимать: в 1С нет прямого доступа к физическим таблицам СУБД через стандартные механизмы платформы. Все операции выполняются через объекты конфигурации, а платформа уже "переводит" их в SQL-запросы (или другие команды, если используется файловая база). Это обеспечивает кросс-платформенность (работа с SQL Server, PostgreSQL, IBM DB2 или файловой базой), но накладывает ограничения на оптимизацию.
2. Типы объектов конфигурации и их представление в данных
Все данные в 1С хранятся в объектах конфигурации. Их можно разделить на несколько групп по функциональному назначению:
| Тип объекта | Назначение | Пример физического хранения (SQL) | Особенности |
|---|---|---|---|
| Справочники | Хранение нормативно-справочной информации (НСИ) | _Reference{ID} (основная таблица) + _Reference{ID}_VT{ID} (табличные части) |
Поддерживают иерархию, предопределённые элементы, подчинение |
| Документы | Фиксация фактов хозяйственной деятельности | _Document{ID} (заголовок) + _Document{ID}_VT{ID} (табличные части) |
Имеют дату, номер, проводки (для бухгалтерских документов) |
| Регистры | Агрегация данных для отчётности и анализа | _AccumRg{ID} (регистры накопления), _InfoRg{ID} (регистры сведений) |
Могут быть периодическими, с поддержкой версий записей |
| Планы видов характеристик (ПВХ) | Гибкое описание свойств объектов | _InfoRg{ID} (хранение значений характеристик) |
Используются для динамического добавления свойств (например, цвет, размер) |
Каждый объект имеет уникальный идентификатор ({ID} в именах таблиц), который присваивается платформой при создании конфигурации. Например, справочник "Контрагенты" может храниться в таблице _Reference345, а его табличная часть "Адреса" — в _Reference345_VT12.
Особенность 1С в том, что физическая структура таблиц зависит от версии платформы. Например, в 1С:Предприятие 8.3.20 появилась поддержка распределённых информационных баз, что повлияло на схему хранения данных в кластерных конфигурациях. А в версии 8.3.23 были оптимизированы индексы для регистров сведений с большим объёмом данных.
Чтобы узнать физическое имя таблицы объекта в SQL-базе, используйте запрос к системной таблице v8objects (для MS SQL) или функцию Метаданные().ПолноеИмяТаблицы() в языке 1С.
3. Как 1С хранит данные: от объектов к SQL-таблицам
Когда вы сохраняете документ или элемент справочника, платформа выполняет несколько шагов:
- Валидация данных — проверка заполнения обязательных реквизитов, уникальности кодов и т.д.
- Формирование транзакции — все изменения группируются в одну транзакцию (если не отключено в настройках).
- Преобразование в SQL — платформа генерирует команды
INSERT/UPDATEдля физических таблиц. - Обновление служебных данных — корректировка индексов, истории изменений (если включено версионирование).
Пример: при проведении документа "Реализация товаров" платформа:
- 📝 Сохраняет заголовок документа в таблицу
_Document123. - 📝 Записывает строки табличной части "Товары" в
_Document123_VT45. - 📝 Формирует движения по регистрам (например, уменьшает остатки в регистре накопления "ТоварыНаСкладах").
- 📝 Обновляет итоги в регистрах (если включен режим авторегистрации).
Важно: платформа не всегда оптимизирует SQL-запросы. Например, при массовом изменении данных через объектную модель (Для Каждого ... Из Справочник.Номенклатура Цикл) могут генерироваться отдельные UPDATE-запросы для каждой записи, что тормозит систему. В таких случаях лучше использовать прямые SQL-запросы (через Запрос = Новый Запрос;) или пакетную обработку.
Что такое "грязное чтение" в 1С?
В режиме управляемого приложения 1С использует оптимистичные блокировки, что может приводить к "грязному чтению" — ситуации, когда один пользователь читает данные, которые другой пользователь уже изменил, но ещё не сохранил. Это решается настройкой уровня изоляции транзакций в СУБД или явной блокировкой объектов через метод Объект.Заблокировать().
4. Связи между объектами: как устроена реляционность в 1С
Хотя 1С не является классической реляционной СУБД, связи между объектами реализованы по принципам реляционной модели. Основные типы связей:
- 🔗 Ссылка на объект — поле типа "СправочникСсылка.Контрагенты" хранит идентификатор (
Ref) элемента справочника. В SQL это представляется как внешний ключ (FOREIGN KEY). - 🔗 Подчинение — например, справочник "Номенклатура" может быть подчинён справочнику "Группы номенклатуры". В базе это реализуется через поле
Parent. - 🔗 Табличные части — связь "один-ко-многим" внутри одного объекта (например, строки документа). Хранятся в отдельных таблицах с привязкой по
OwnerID. - 🔗 Регистры — связь "многие-ко-многим" через промежуточные таблицы (например, регистр сведений "Цены номенклатуры").
Пример связи "документ → справочник": в документе "Поступление товаров" поле "Контрагент" ссылается на элемент справочника "Контрагенты". В SQL это выглядит так:
-- Таблица документа (упрощённо)
CREATE TABLE _Document123 (
Ref BINARY(16) PRIMARY KEY, -- Уникальный идентификатор
Контрагент BINARY(16) REFERENCES _Reference456(Ref) -- Ссылка на справочник
);
-- Таблица справочника
CREATE TABLE _Reference456 (
Ref BINARY(16) PRIMARY KEY,
Наименование NVARCHAR(255),
...
);
Особенность 1С в том, что ссылки хранятся в бинарном формате (BINARY(16)), а не как числовые идентификаторы. Это усложняет прямую работу с базой через SQL, но обеспечивает уникальность ссылок в распределённых системах.
Ссылки в 1С — это не просто идентификаторы, а комплексные объекты, включающие тип (справочник, документ) и уникальный код. Поэтому сравнение ссылок через "=" работает корректно, даже если физические таблицы имеют разные структуры.
5. Особенности хранения данных в разных режимах работы
Модель данных в 1С зависит от режима работы информационной базы:
| Режим работы | Хранение данных | Особенности |
|---|---|---|
| Файловая база | Данные хранятся в одном файле .1CD |
Нет SQL, все операции выполняются через внутренние механизмы платформы. Подходит для небольших баз (до 10 ГБ). |
| Клиент-сервер (SQL) | Данные в СУБД (MS SQL, PostgreSQL), метаданные — в файлах конфигурации | Поддерживает кластеризацию, репликацию, высокую нагрузку. Требует настройки СУБД. |
| Управляемое приложение | Данные в СУБД или файловой базе, логика — на сервере 1С | Использует оптимистичные блокировки, поддерживает веб-клиент и мобильные устройства. |
| Распределённая база | Данные разбиты между узлами, синхронизация через механизмы платформы | Сложная настройка, но позволяет работать с большими объёмами данных в географически распределённых системах. |
Например, в файловой базе все данные хранятся в бинарном виде в одном файле, и платформа сама управляет блокировками и транзакциями. Это упрощает администрирование, но ограничивает производительность. В клиент-серверном режиме данные распределены по таблицам СУБД, что позволяет использовать инструменты самой СУБД для резервного копирования, репликации и оптимизации.
Важно: в распределённых базах модель данных усложняется за счёт механизмов синхронизации. Например, при изменении элемента справочника на одном узле платформа формирует пакет изменений, который затем передаётся на другие узлы. Это может приводить к конфликтам, если два пользователя одновременно редактируют один и тот же объект.
Убедиться, что версия СУБД поддерживается платформой 1С|Проверить объём базы (файловая база до 10 ГБ мигрирует быстрее)|Создать резервную копию перед миграцией|Настроить права доступа к СУБД для пользователя 1С|Проверить наличие свободного места на диске (SQL-база может занять больше места)|-->
6. Оптимизация работы с данными: советы разработчикам
Знание модели данных позволяет оптимизировать производительность 1С. Вот ключевые рекомендации:
- 🚀 Избегайте массовых операций через объектную модель. Например, вместо цикла по всем элементам справочника используйте
Запрос:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ПометкаУдаления = ЛОЖЬ";
Результат = Запрос.Выполнить();
- 🚀 Используйте индексы. В SQL-базах добавьте индексы на часто используемые поля (например,
Код,Артикулв справочнике "Номенклатура"). - 🚀 Ограничивайте выборки. Всегда добавляйте условия в запросы (например, по дате для документов).
- 🚀 Настройте кэширование. В клиент-серверном режиме используйте кэш метаданных и данных на сервере 1С.
Для сложных отчётов рекомендуется:
- 📊 Использовать виртуальные таблицы регистров (например,
РегистрНакопления.ТоварыНаСкладах.Остатки()). - 📊 Переносить тяжелые расчёты в фоновые задания.
- 📊 Для больших баз настраивать разделение данных по периодам (например, архивировать документы старше 3 лет).
Чтобы ускорить работу с большими справочниками, настройте предопределённые элементы для часто используемых значений (например, "Розничный покупатель" в справочнике "Контрагенты"). Это уменьшит количество чтений из базы.
7. Типичные ошибки при работе с моделью данных
Непонимание модели данных часто приводит к ошибкам. Рассмотрим самые распространённые:
⚠️ Внимание: При прямом изменении данных в SQL-таблицах (например, через Management Studio) платформа 1С может "не заметить" эти изменения. Это приведёт к рассинхронизации объектной модели и физических данных, что вызовет ошибки при сохранении объектов.
- ❌ Игнорирование транзакций. Если не использовать
НачатьТранзакцию()иЗафиксироватьТранзакцию()при массовых изменениях, можно получить "грязные" данные. - ❌ Чрезмерное использование реквизитов. Хранение больших текстовых данных (например, описаний товаров) в реквизитах справочника замедляет работу. Лучше вынести их в отдельный регистр сведений.
- ❌ Неправильная работа с ссылками. Сравнение ссылок через
=корректно, но если нужно сравнить только идентификаторы, используйтеСсылка.УникальныйИдентификатор(). - ❌ Отсутствие индексов. Без индексов на часто используемых полях (например,
Датав документах) запросы будут тормозить.
Пример ошибки с транзакциями:
// Некорректно: изменения не атомарны
Для Каждого Товар Из Справочник.Номенклатура Цикл
Товар.Цена = Товар.Цена * 1.1;
Товар.Записать(); // Каждая запись - отдельная транзакция!
КонецЦикла;
// Корректно: все изменения в одной транзакции
НачатьТранзакцию();
Для Каждого Товар Из Справочник.Номенклатура Цикл
Товар.Цена = Товар.Цена * 1.1;
Товар.Записать();
КонецЦикла;
ЗафиксироватьТранзакцию();
Ещё одна типичная проблема — блокировки. В клиент-серверном режиме длительные транзакции могут блокировать таблицы, что приводит к зависанию других пользователей. Решение: разбивайте большие операции на пакеты и фиксируйте транзакции чаще.
8. Как исследовать модель данных самостоятельно
Если вам нужно разобраться в структуре данных конкретной конфигурации, используйте эти инструменты:
- 🔍 Конфигуратор 1С:
- Откройте дерево метаданных (
Файл → Открыть конфигурацию). - Изучите структуру объектов (реквизиты, табличные части, регистры).
- Используйте
Все функции(Ctrl+Shift+F) для поиска ссылок на объекты.
- Откройте дерево метаданных (
- 🔍 SQL-профайлер:
- Включите журналирование SQL-запросов в настройках платформы.
- Используйте SQL Server Profiler или pgAdmin для анализа генерируемых запросов.
- 🔍 Внешние утилиты:
- 1C:Enterprise Development Tools (EDT) — для анализа кода и метаданных.
- SQL-скрипты для извлечения структуры таблиц (например, запрос к
INFORMATION_SCHEMAв SQL Server).
Пример SQL-запроса для изучения структуры таблицы справочника:
-- Для MS SQL Server
SELECT
c.name AS 'ColumnName',
t.name AS 'DataType',
c.max_length AS 'MaxLength',
c.is_nullable AS 'IsNullable'
FROM
sys.columns c
INNER JOIN
sys.types t ON c.user_type_id = t.user_type_id
WHERE
c.object_id = OBJECT_ID('_Reference456') -- Замените на актуальное имя таблицы
ORDER BY
c.column_id;
Для файловой базы можно использовать утилиту chdbfl.exe (входит в комплект поставки 1С), чтобы проанализировать структуру файла .1CD:
chdbfl.exe /F "C:\Bases\MyBase.1CD" /DumpMetaData "meta.txt"
Изучение физической структуры базы полезно для оптимизации, но изменять данные напрямую (без использования объектной модели 1С) крайне не рекомендуется. Это может привести к повреждению базы!
FAQ: Частые вопросы о модели данных в 1С
🔹 Можно ли в 1С использовать внешние ключи (FOREIGN KEY) в SQL-базе?
Платформа 1С не создаёт явные внешние ключи в SQL-таблицах, но логически поддерживает связи между объектами. Физически ссылки хранятся как бинарные поля, и их целостность контролируется на уровне платформы, а не СУБД. Если вам нужны внешние ключи для оптимизации запросов, их можно добавить вручную, но это может привести к конфликтам при обновлении конфигурации.
🔹 Как узнать, какие таблицы в SQL соответствуют справочнику "Номенклатура"?
Имя таблицы формируется по шаблону _Reference{ID}, где {ID} — уникальный идентификатор объекта. Узнать его можно:
- Через конфигуратор: откройте свойства справочника и посмотрите
Идентификаторв XML-представлении метаданных. - Через запрос к системной таблице
v8objects(для MS SQL):
SELECT * FROM v8objects WHERE name LIKE '%Номенклатура%';
🔹 Почему при массовом изменении данных 1С тормозит?
Это происходит потому, что платформа по умолчанию выполняет отдельные операции записи для каждого объекта. Решения:
- Используйте пакетную обработку с транзакциями.
- Заменяйте циклы по объектам на SQL-запросы (через
Запрос.Выполнить()). - Настройте индексы на часто изменяемых полях.
- Для больших баз используйте фоновые задания.
🔹 Можно ли перенести данные из 1С в другую систему без потерь?
Да, но нужно учитывать:
- 📌 Ссылки в 1С — это комплексные объекты, их нельзя просто скопировать как числовые ID.
- 📌 Метаданные (структура справочников, документов) должны совпадать в исходной и целевой системах.
- 📌 Для переноса используйте универсальные форматы (XML, JSON) или специализированные инструменты (1C:EnterpriseData, Конвертация данных).
Пример выгрузки справочника в JSON:
Данные = Новый Структура();
Данные.Вставить("Справочник", Новый Массив());
Для Каждого Элемент Из Справочник.Номенклатура Цикл
ЭлементДанных = Новый Структура();
ЭлементДанных.Вставить("Наименование", Элемент.Наименование);
ЭлементДанных.Вставить("Код", Элемент.Код);
Данные.Справочник.Добавить(ЭлементДанных);
КонецЦикла;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписьJSON.ЗаписатьJSON(Данные);
Результат = ЗаписьJSON.Закрыть();
🔹 Как работает версия 8.3.23 с точки зрения модели данных?
В версии 8.3.23 были внесены следующие изменения:
- 🔹 Оптимизирована работа с регистрами сведений — ускорено чтение данных за счёт нового алгоритма кэширования.
- 🔹 Добавлена поддержка распределённых транзакций для кластерных конфигураций.
- 🔹 Улучшена работа с большими двоичными данными (BLOB) — теперь они хранятся более эффективно в SQL-базах.
Однако логическая модель данных (объекты, связи, метаданные) осталась прежней. Изменения коснулись в основном физического уровня хранения.