Как получить остатки регистра бухгалтерии напрямую из базы данных MS SQL Server?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При интеграции сторонних аналитических систем или построении внешней отчетности разработчики периодически сталкиваются с задачей прямого чтения данных из таблиц СУБД MS SQL Server в обход серверного контекста 1С. В типовой конфигурации 1C:Бухгалтерия 3.0 данные бухгалтерского учета хранятся в регистре бухгалтерии. Попытка получить актуальные количественные и суммовые остатки простым запросом к одной физической таблице обычно приводит к тупику: в основной таблице движений нет готовых итогов, в таблицах субконто отсутствуют ресурсы, а номенклатура представлена в виде бинарных ссылок.

Разберем внутреннюю архитектуру хранения регистра бухгалтерии в реляционной базе данных, выясним алгоритм расчета срезов итогов и проанализируем доступные пути решения этой задачи.

Архитектура таблиц регистра бухгалтерии в MS SQL Server

Платформа 1С:Предприятие при работе с регистром бухгалтерии создает не одну общую таблицу, а целый набор связанных физических таблиц в базе данных:

  1. Таблица основных записей и движений (_AccRg...): содержит первичные строки проводок, даты, ссылки на документы-регистраторы, номера записей в наборе, счета дебета и кредита, а также общие суммовые ресурсы.
  2. Таблицы значений субконто (_AccRgED...): в них выносятся значения аналитики (субконто дебета и кредита), если они имеют составной тип или не помещаются в основную таблицу. Значения хранятся в виде типов данных и бинарных ссылок binary(16).
  3. Таблицы итогов по счету в целом (_AccRgAT...): содержат агрегированные остатки и обороты в разрезе счетов и общих измерений регистра без детализации по субконто.
  4. Таблицы итогов в разрезе субконто: количество таких таблиц зависит от максимального числа субконто, заданного для счета. В них накапливаются остатки и обороты с детализацией по конкретным видам аналитики (например, по номенклатуре и складам).
  5. Таблица настроек и актуальности итогов (_AccRgOpt): хранит служебные отметки о дате, по которую рассчитаны итоги, и флаги включения разделения итогов.

Количественный учет включается как дополнительный признак учета на счете. Если для счета количественный учет активен, платформа заполняет соответствующие колонки ресурсов количества в таблицах итогов и движений. Если учет отключен, соответствующие поля остаются пустыми или равными нулю.

Механизм расчета остатков платформой 1С

Рассмотрим, как 1С формирует виртуальную таблицу Остатки на определенную дату и время. Платформа не пересчитывает все проводки от начала ведения учета и не хранит остаток на каждую отдельную секунду:

  1. Таблицы итогов содержат дискретные точки среза (как правило, на 00:00:00 первого числа каждого месяца).
  2. При запросе остатка на произвольную дату платформа находит ближайшую рассчитанную точку итогов (до или после запрашиваемого момента).
  3. Затем система выполняет выборку дельты оборотов по таблице движений за интервал между точкой итогов и целевым моментом времени.
  4. Итоговый остаток вычисляется математическим сложением (или вычитанием) остатка из таблицы итогов и оборотов за промежуточный период.

Анализ структуры и перехват запросов с помощью SQL Server Profiler

Составить прямой SQL-запрос вручную с учетом всех соединений и группировок таблиц итогов крайне трудоемко. Чтобы воспроизвести поведение платформы, применим следующий подход:

  1. Запустим утилиту SQL Server Profiler или настроим сессию Extended Events на сервере СУБД.
  2. Установим фильтр по имени базы данных и типу событий (SQL:BatchCompleted, RPC:Completed).
  3. В режиме 1С:Предприятие выполним запрос к виртуальной таблице остатков регистра бухгалтерии (например, сформируем отчет «Оборотно-сальдовая ведомость по счету» или выполним обращение к РегистрыБухгалтерии.Хозрасчетный.Остатки()).
  4. Зафиксируем сформированный платформой T-SQL код. Мы увидим сложный запрос, объединяющий таблицы _AccRgAT... и _AccRgED... с добором дельты из таблицы движений.

Для сопоставления физических имен таблиц SQL с объектами метаданных в среде 1С выполним вызов встроенной функции:

СтруктураХранения = ПолучитьСтруктуруХраненияБазыДанных();

Эта функция вернет таблицу со списком соответствий всех объектов конфигурации и их полей именам в СУБД.

Скрытые сложности и риски прямого чтения из SQL

Прежде чем внедрять чтение остатков напрямую из MS SQL, проанализируем технические ограничения и риски:

  1. Смещение дат на 2000 лет: если база данных создавалась с флагом смещения дат, все значения периодов в SQL-таблицах сдвинуты на 2000 лет вперед (например, 2026 год хранится как 4026). При прямых запросах необходимо вручную корректировать фильтры дат.
  2. Формат ссылок и порядок байтов (GUID): колонка ссылки _IDRRef представлена в формате binary(16). Порядок байтов в SQL не совпадает со строковым представлением GUID в стандарте 1С, что требует специального алгоритма перестановки байтов при соединении со справочниками.
  3. Неактуальность итогов: если регламентное задание пересчета итогов отключено или отстает, прямое обращение к таблицам итогов без учета таблицы _AccRgOpt вернет недостоверные данные.
  4. Блокировки транзакций: прямое чтение таблиц SQL без указания WITH (NOLOCK) или без включенного версионирования строк (READ_COMMITTED_SNAPSHOT) может вызывать взаимные блокировки с работающими пользователями.
  5. Нестабильность схемы: при любом обновлении конфигурации или реструктуризации базы имена физических таблиц и их структура могут измениться, что приведет к ошибкам внешних запросов.

Альтернативные способы интеграции

Чтобы избежать описанных проблем и получать гарантированно корректные остатки, рекомендуется использовать стандартные механизмы платформы:

  1. HTTP-сервисы и Web-сервисы: разработка легковесного собственного сервиса внутри 1С, который выполняет запрос к виртуальной таблице РегистрыБухгалтерии.Хозрасчетный.Остатки на языке 1С и отдает результат внешней системе в формате JSON. Это гарантирует актуальность среза итогов и корректную работу с субконто.
  2. Стандартный интерфейс OData: включение публикации стандартного интерфейса OData позволяет получать данные метаданных через безопасный REST API без прямого вмешательства в структуру СУБД.
  3. Внешнее COM-соединение: подключение к базе данных через V83.COMConnector для программного выполнения встроенных запросов и передачи выборки во внешнее приложение.
← На главную