При оптимизации производительности запросов, чтении планов выполнения в MS SQL Server или PostgreSQL, а также при детальном анализе структуры базы данных разработчики часто сталкиваются с системными именами таблиц платформы 1С:Предприятие. В случае с регистрами бухгалтерии имена таблиц имеют характерные сокращения, которые вызывают вопросы. Разберем по шагам, как устроена физическая схема хранения данных бухгалтерского учета и что именно означают системные префиксы.
В первую очередь выясним разницу между регистрами накопления и регистрами бухгалтерии на уровне физических таблиц СУБД. В регистрах накопления используется префикс _AccumRg (от английского Accumulation Register). Для регистров бухгалтерии платформа формирует совершенно другое семейство таблиц с префиксом _AccRg (от Accounting Register).
Для одного логического регистра бухгалтерии в базе данных создается не одна, а целый комплекс физических таблиц. Рассмотрим значение их суффиксов:
i обозначает порядковый номер уровня (от 1 до максимального количества субконто, заданного в плане счетов). Например, при трех видах субконто платформа создаст таблицы _AccRgAT1, _AccRgAT2 и _AccRgAT3.Посмотрим на связанную архитектуру плана счетов. Для хранения перечня видов субконто, назначенных конкретному счету, платформа формирует отдельную служебную таблицу вида _Acc<n>_ExtDim<k>. Проанализируем состав её основных полей:
_Acc<n>_ID), к которому привязана строка настройки аналитики._KeyField, _LineNo)._DimKind)._DimIsMetadata)._TurnoverOnly), если по данному субконто не требуется вести остаточный учет.Понимание внутреннего устройства физических таблиц позволяет правильно проектировать метаданные и писать оптимальные запросы к регистру бухгалтерии:
_AccRgAT<i> создается и поддерживается платформой. При проведении документа СУБД вынуждена обновлять данные и индексы одновременно в таблице движений _AccRg, в таблице субконто _AccRgED и во всех задействованных таблицах итогов. Это прямо влияет на длительность транзакции и увеличивает риск блокировок._AccRgAT0. Как только в выборку или условия добавляются субконто, платформа подключает соответствующие таблицы _AccRgAT<i>._AccRg.Для сопоставления объектов метаданных и физических таблиц в конкретной базе данных не следует угадывать номера вручную. Платформа предоставляет штатную функцию встроенного языка ПолучитьСтруктуруХраненияБазыДанных(). Разберем пример получения списка таблиц регистра бухгалтерии:
ПараметрыИмен = Новый Массив;
ПараметрыИмен.Добавить("РегистрБухгалтерии.Хозрасчетный");
ТаблицаСтруктуры = ПолучитьСтруктуруХраненияБазыДанных(ПараметрыИмен, Истина);
Для Каждого СтрокаТаблицы Из ТаблицаСтруктуры Цикл
Сообщить(СтрокаТаблицы.ИмяТаблицы + " -> " + СтрокаТаблицы.ИмяТаблицыХранения + " (" + СтрокаТаблицы.Назначение + ")");
КонецЦикла;
Важное ограничение: Прямая модификация таблиц _AccRg, _AccRgED и _AccRgAT средствами SQL-запросов (командами INSERT, UPDATE, DELETE) категорически запрещена. Платформа 1С использует сложные алгоритмы целостности между проводками и многоуровневыми таблицами итогов, нарушение которых приведет к логическому разрушению базы данных.