Когда речь заходит о модели данных в 1С, многие представляют себе классическую реляционную базу с таблицами и связями — и это частично верно. Однако 1С:Предприятие работает по собственным правилам, сочетая подходы объектно-ориентированного программирования с традиционными СУБД. В этой статье мы разберём, как именно устроена модель данных в платформе, какие объекты конфигурации формируют её основу, и почему знание этих нюансов критично для разработчиков, администраторов и даже опытных пользователей.

Сразу отметим: не использует "чистую" реляционную модель, как MySQL или PostgreSQL. Вместо этого данные хранятся в виде иерархической структуры метаданных, которые преобразуются в физические таблицы СУБД (например, Microsoft SQL Server или PostgreSQL) только на уровне хранения. Это означает, что логика работы с данными в отличается от прямой работы с SQL-запросами — и это нужно учитывать при проектировании решений.

Статья будет полезна тем, кто:

  • 🔹 Разрабатывает или поддерживает конфигурации и хочет понять, как данные хранятся "под капотом".
  • 🔹 Администрирует базы и оптимизирует их производительность.
  • 🔹 Интегрирует с внешними системами и нуждается в понимании структуры данных.
  • 🔹 Готовится к экзаменам 1С:Специалист или 1С:Профессионал по платформе.

1. Основные принципы модели данных в 1С

Модель данных в 1С:Предприятие строится на трёх ключевых концепциях:

  1. Объектная модель — все данные представлены в виде объектов (справочники, документы, регистры и т.д.), а не плоских таблиц.
  2. Метаданные — описание структуры данных (типы, свойства, связи) хранится отдельно от самих данных.
  3. Двухуровневая архитектура — логика работы с данными реализована на уровне платформы, а физическое хранение делегируется СУБД.

Это означает, что когда вы создаёте в конфигураторе справочник "Номенклатура", платформа автоматически генерирует:

  • 📌 Таблицу хранения (например, _Reference123 в SQL-базе).
  • 📌 Служебные таблицы для индексов, истории изменений (если включен версионирование).
  • 📌 Метаданные — описание структуры справочника (реквизиты, табличные части, подчинённые объекты).

Важно понимать: в 1С нет прямого доступа к физическим таблицам СУБД через стандартные механизмы платформы. Все операции выполняются через объекты конфигурации, а платформа уже "переводит" их в SQL-запросы (или другие команды, если используется файловая база). Это обеспечивает кросс-платформенность (работа с SQL Server, PostgreSQL, IBM DB2 или файловой базой), но накладывает ограничения на оптимизацию.

📊 С какой СУБД вы работаете в 1С?
Microsoft SQL Server
PostgreSQL
Файловая база
IBM DB2
Другая

2. Типы объектов конфигурации и их представление в данных

Все данные в хранятся в объектах конфигурации. Их можно разделить на несколько групп по функциональному назначению:

Тип объекта Назначение Пример физического хранения (SQL) Особенности
Справочники Хранение нормативно-справочной информации (НСИ) _Reference{ID} (основная таблица) + _Reference{ID}_VT{ID} (табличные части) Поддерживают иерархию, предопределённые элементы, подчинение
Документы Фиксация фактов хозяйственной деятельности _Document{ID} (заголовок) + _Document{ID}_VT{ID} (табличные части) Имеют дату, номер, проводки (для бухгалтерских документов)
Регистры Агрегация данных для отчётности и анализа _AccumRg{ID} (регистры накопления), _InfoRg{ID} (регистры сведений) Могут быть периодическими, с поддержкой версий записей
Планы видов характеристик (ПВХ) Гибкое описание свойств объектов _InfoRg{ID} (хранение значений характеристик) Используются для динамического добавления свойств (например, цвет, размер)

Каждый объект имеет уникальный идентификатор ({ID} в именах таблиц), который присваивается платформой при создании конфигурации. Например, справочник "Контрагенты" может храниться в таблице _Reference345, а его табличная часть "Адреса" — в _Reference345_VT12.

Особенность в том, что физическая структура таблиц зависит от версии платформы. Например, в 1С:Предприятие 8.3.20 появилась поддержка распределённых информационных баз, что повлияло на схему хранения данных в кластерных конфигурациях. А в версии 8.3.23 были оптимизированы индексы для регистров сведений с большим объёмом данных.

💡

Чтобы узнать физическое имя таблицы объекта в SQL-базе, используйте запрос к системной таблице v8objects (для MS SQL) или функцию Метаданные().ПолноеИмяТаблицы() в языке 1С.

3. Как 1С хранит данные: от объектов к SQL-таблицам

Когда вы сохраняете документ или элемент справочника, платформа выполняет несколько шагов:

  1. Валидация данных — проверка заполнения обязательных реквизитов, уникальности кодов и т.д.
  2. Формирование транзакции — все изменения группируются в одну транзакцию (если не отключено в настройках).
  3. Преобразование в SQL — платформа генерирует команды INSERT/UPDATE для физических таблиц.
  4. Обновление служебных данных — корректировка индексов, истории изменений (если включено версионирование).

Пример: при проведении документа "Реализация товаров" платформа:

  • 📝 Сохраняет заголовок документа в таблицу _Document123.
  • 📝 Записывает строки табличной части "Товары" в _Document123_VT45.
  • 📝 Формирует движения по регистрам (например, уменьшает остатки в регистре накопления "ТоварыНаСкладах").
  • 📝 Обновляет итоги в регистрах (если включен режим авторегистрации).

Важно: платформа не всегда оптимизирует SQL-запросы. Например, при массовом изменении данных через объектную модель (Для Каждого ... Из Справочник.Номенклатура Цикл) могут генерироваться отдельные UPDATE-запросы для каждой записи, что тормозит систему. В таких случаях лучше использовать прямые SQL-запросы (через Запрос = Новый Запрос;) или пакетную обработку.

Что такое "грязное чтение" в 1С?

В режиме управляемого приложения 1С использует оптимистичные блокировки, что может приводить к "грязному чтению" — ситуации, когда один пользователь читает данные, которые другой пользователь уже изменил, но ещё не сохранил. Это решается настройкой уровня изоляции транзакций в СУБД или явной блокировкой объектов через метод Объект.Заблокировать().

4. Связи между объектами: как устроена реляционность в 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),

...

);

Особенность в том, что ссылки хранятся в бинарном формате (BINARY(16)), а не как числовые идентификаторы. Это усложняет прямую работу с базой через SQL, но обеспечивает уникальность ссылок в распределённых системах.

💡

Ссылки в 1С — это не просто идентификаторы, а комплексные объекты, включающие тип (справочник, документ) и уникальный код. Поэтому сравнение ссылок через "=" работает корректно, даже если физические таблицы имеют разные структуры.

5. Особенности хранения данных в разных режимах работы

Модель данных в зависит от режима работы информационной базы:

Режим работы Хранение данных Особенности
Файловая база Данные хранятся в одном файле .1CD Нет SQL, все операции выполняются через внутренние механизмы платформы. Подходит для небольших баз (до 10 ГБ).
Клиент-сервер (SQL) Данные в СУБД (MS SQL, PostgreSQL), метаданные — в файлах конфигурации Поддерживает кластеризацию, репликацию, высокую нагрузку. Требует настройки СУБД.
Управляемое приложение Данные в СУБД или файловой базе, логика — на сервере 1С Использует оптимистичные блокировки, поддерживает веб-клиент и мобильные устройства.
Распределённая база Данные разбиты между узлами, синхронизация через механизмы платформы Сложная настройка, но позволяет работать с большими объёмами данных в географически распределённых системах.

Например, в файловой базе все данные хранятся в бинарном виде в одном файле, и платформа сама управляет блокировками и транзакциями. Это упрощает администрирование, но ограничивает производительность. В клиент-серверном режиме данные распределены по таблицам СУБД, что позволяет использовать инструменты самой СУБД для резервного копирования, репликации и оптимизации.

Важно: в распределённых базах модель данных усложняется за счёт механизмов синхронизации. Например, при изменении элемента справочника на одном узле платформа формирует пакет изменений, который затем передаётся на другие узлы. Это может приводить к конфликтам, если два пользователя одновременно редактируют один и тот же объект.

Убедиться, что версия СУБД поддерживается платформой 1С|Проверить объём базы (файловая база до 10 ГБ мигрирует быстрее)|Создать резервную копию перед миграцией|Настроить права доступа к СУБД для пользователя 1С|Проверить наличие свободного места на диске (SQL-база может занять больше места)|-->

6. Оптимизация работы с данными: советы разработчикам

Знание модели данных позволяет оптимизировать производительность . Вот ключевые рекомендации:

  • 🚀 Избегайте массовых операций через объектную модель. Например, вместо цикла по всем элементам справочника используйте Запрос:
Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка

|ИЗ

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

|ГДЕ

| Номенклатура.ПометкаУдаления = ЛОЖЬ";

Результат = Запрос.Выполнить();

  • 🚀 Используйте индексы. В SQL-базах добавьте индексы на часто используемые поля (например, Код, Артикул в справочнике "Номенклатура").
  • 🚀 Ограничивайте выборки. Всегда добавляйте условия в запросы (например, по дате для документов).
  • 🚀 Настройте кэширование. В клиент-серверном режиме используйте кэш метаданных и данных на сервере 1С.

Для сложных отчётов рекомендуется:

  • 📊 Использовать виртуальные таблицы регистров (например, РегистрНакопления.ТоварыНаСкладах.Остатки()).
  • 📊 Переносить тяжелые расчёты в фоновые задания.
  • 📊 Для больших баз настраивать разделение данных по периодам (например, архивировать документы старше 3 лет).
💡

Чтобы ускорить работу с большими справочниками, настройте предопределённые элементы для часто используемых значений (например, "Розничный покупатель" в справочнике "Контрагенты"). Это уменьшит количество чтений из базы.

7. Типичные ошибки при работе с моделью данных

Непонимание модели данных часто приводит к ошибкам. Рассмотрим самые распространённые:

⚠️ Внимание: При прямом изменении данных в SQL-таблицах (например, через Management Studio) платформа может "не заметить" эти изменения. Это приведёт к рассинхронизации объектной модели и физических данных, что вызовет ошибки при сохранении объектов.
  • Игнорирование транзакций. Если не использовать НачатьТранзакцию() и ЗафиксироватьТранзакцию() при массовых изменениях, можно получить "грязные" данные.
  • Чрезмерное использование реквизитов. Хранение больших текстовых данных (например, описаний товаров) в реквизитах справочника замедляет работу. Лучше вынести их в отдельный регистр сведений.
  • Неправильная работа с ссылками. Сравнение ссылок через = корректно, но если нужно сравнить только идентификаторы, используйте Ссылка.УникальныйИдентификатор().
  • Отсутствие индексов. Без индексов на часто используемых полях (например, Дата в документах) запросы будут тормозить.

Пример ошибки с транзакциями:

// Некорректно: изменения не атомарны

Для Каждого Товар Из Справочник.Номенклатура Цикл

Товар.Цена = Товар.Цена * 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 (входит в комплект поставки ), чтобы проанализировать структуру файла .1CD:

chdbfl.exe /F "C:\Bases\MyBase.1CD" /DumpMetaData "meta.txt"
💡

Изучение физической структуры базы полезно для оптимизации, но изменять данные напрямую (без использования объектной модели 1С) крайне не рекомендуется. Это может привести к повреждению базы!

FAQ: Частые вопросы о модели данных в 1С

🔹 Можно ли в 1С использовать внешние ключи (FOREIGN KEY) в SQL-базе?

Платформа не создаёт явные внешние ключи в SQL-таблицах, но логически поддерживает связи между объектами. Физически ссылки хранятся как бинарные поля, и их целостность контролируется на уровне платформы, а не СУБД. Если вам нужны внешние ключи для оптимизации запросов, их можно добавить вручную, но это может привести к конфликтам при обновлении конфигурации.

🔹 Как узнать, какие таблицы в SQL соответствуют справочнику "Номенклатура"?

Имя таблицы формируется по шаблону _Reference{ID}, где {ID} — уникальный идентификатор объекта. Узнать его можно:

  1. Через конфигуратор: откройте свойства справочника и посмотрите Идентификатор в XML-представлении метаданных.
  2. Через запрос к системной таблице 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-базах.

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