Почему отключаются итоги регистра бухгалтерии при закрытии месяца в 1С:ERP и как решить эту проблему?

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

В практической работе с крупными базами 1С:ERP Управление предприятием бухгалтеры и системные администраторы часто сталкиваются со странным и пугающим поведением программы: после запуска процедуры закрытия месяца оборотно-сальдовая ведомость (ОСВ) по регистру бухгалтерии становится абсолютно пустой или начинает "краснеть" (показывать некорректные, необоснованно отрицательные остатки). При этом сами документы проведены, проводки существуют, но стандартные отчеты их упорно не видят.

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

Физический смысл итогов в 1С

Прежде чем переходить к решению, разберем теорию вопроса. В платформе 1С:Предприятие 8 для регистров (как накопления, так и бухгалтерии) используется двухтабличная архитектура хранения данных. Это классическая попытка объединить OLTP (транзакционную систему) и OLAP (аналитическую систему):

  1. Таблица движений: хранит первичные записи (проводки) со всеми деталями (регистратор, период, счета, субконто, количества, суммы).
  2. Таблица остатков (итогов): хранит предварительно рассчитанные итоги (остатки и обороты) на начало каждого месяца.

Когда мы строим оборотно-сальдовую ведомость, платформа не сканирует всю таблицу движений с начала времен. Вместо этого она берет остатки на ближайшую контрольную точку из таблицы итогов и быстро прибавляет к ним движения за текущий период. Это обеспечивает высокую скорость работы отчетов. Если итоги отключены, отчеты либо не могут получить остатки вообще (ОСВ становится пустой), либо начинают рассчитывать их "на лету" с колоссальными задержками и ошибками.

Почему итоги отключаются при закрытии месяца?

Рассмотрим механизм расчета себестоимости и распределения затрат в 1С:ERP. Это чрезвычайно ресурсоемкая операция, которая решает сложнейшую систему линейных алгебраических уравнений (СЛАУ) и формирует сотни тысяч новых проводок по регистру бухгалтерии. При возникновении ошибок на этом этапе пригодится материал по устранению ошибки переполнения стека при расчете себестоимости.

Чтобы ускорить запись этих проводок в базу данных, разработчики 1С применили стандартный оптимизационный маневр. В настройках регламентной операции "Распределение затрат и расчет себестоимости" по умолчанию включен параметр оптимизации итогов. Проанализируем алгоритм работы этой оптимизации:

  1. Перед началом массовой записи движений система запоминает текущее состояние использования итогов по рассчитываемым регистрам.
  2. При записи движений по каждому регистру временно отключается расчет итогов с помощью платформенного метода УстановитьИспользованиеИтогов(Ложь).
  3. За счет того, что СУБД не тратит ресурсы на обновление индексов и таблиц итогов при каждой новой записи проводки, общая скорость проведения документов увеличивается на 15–70%.
  4. После окончания всех расчетов и завершения записи всех движений состояние использования итогов должно вернуться к первоначальному — платформа автоматически запускает пересчет итогов с помощью метода ПересчитатьИтоги().

В чем же кроется проблема? Если в процессе выполнения этого ресурсоемкого этапа происходит аварийное завершение сеанса (например, принудительное завершение фонового процесса пользователем, перезагрузка сервера СУБД, нехватка оперативной памяти или аппаратная ошибка), транзакция прерывается на полпути. Программа просто не успевает выполнить обратное включение и пересчет. В результате итоги в регистре бухгалтерии (Хозрасчетный) остаются выключенными, а таблицы остатков — неактуальными. Для диагностики и устранения причин зависания процессов можно воспользоваться руководством по устранению зависаний при закрытии месяца.

Диагностика проблемы

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

  1. Анализ отчетов: сформируем ОСВ за закрытый период. Если данные отображаются корректно, а за текущий или последующий период отчет пуст или содержит некорректные остатки — это верный признак проблемы с итогами.
  2. Проверка Журнала регистрации: найдем события, связанные с выполнением регламентных заданий по расчету себестоимости или отражению документов в регламентированном учете. Часто там фиксируются ошибки вида: Ошибка при вызове метода контекста (УстановитьМинимальныйИМаксимальныйПериодыРассчитанныхИтогов) или нарушения уникальности индексов в таблицах СУБД.
  3. Просмотр системного состояния: воспользуемся стандартными инструментами 1С для проверки активности итогов по регистрам.

Способ 1: Включение и пересчет итогов через стандартный интерфейс

Если физических повреждений таблиц СУБД нет, восстановить итоги можно штатными средствами платформы 1С. Рассмотрим этот процесс:

  1. Откроем меню «Функции для технического специалиста» (в зависимости от настроек прав и версии платформы оно также может называться «Все функции»).
  2. Развернем ветку «Стандартные» и выберем пункт «Управление итогами».
  3. В появившемся списке найдем регистр бухгалтерии «Журнал проводок (бухгалтерский учет)» (или «Хозрасчетный»).
  4. Обратим внимание на колонки «Использование итогов» и «Период рассчитанных итогов». Если флаг использования снят, выделим данный регистр и нажмем кнопку «Включить использование итогов».
  5. После включения обязательно нажмем кнопку «Пересчитать итоги». На больших базах данных полный пересчет может занять длительное время, поэтому рекомендуем выполнять эту процедуру во внерабочее время.

Способ 2: Программное решение проблемы

Выясним, как автоматизировать этот процесс или решить проблему, если стандартный интерфейс недоступен или выдает ошибки. Мы можем написать простую внешнюю обработку или выполнить код в консоли разработчика.

Рассмотрим пример программного принудительного включения и пересчета итогов по регистру бухгалтерии:


// Включаем использование текущих итогов для регистра бухгалтерии Хозрасчетный
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Истина);

// Запускаем полный пересчет итогов регистра
РегистрыБухгалтерии.Хозрасчетный.ПересчитатьИтоги();

На крупных базах полный пересчет всех итогов с момента начала ведения учета может парализовать работу пользователей на часы. Чтобы избежать этого, мы можем пересчитывать итоги порционно — только за те периоды, которые подверглись изменениям. Рассмотрим пример пересчета за конкретный месяц:


// Определяем границы периода для актуализации данных
НачалоПериода = НачалоМесяца(ТекущаяДата());
КонецПериода = КонецМесяца(ТекущаяДата());

// Пересчитываем итоги за выбранный интервал времени
РегистрыБухгалтерии.Хозрасчетный.ПересчитатьИтогиЗаПериод(НачалоПериода, КонецПериода);

Способ 3: Решение проблемы на уровне СУБД при ошибках уникальности индекса

Иногда при попытке включить или пересчитать итоги стандартными средствами 1С система выдает неустранимую ошибку СУБД. Например: Cannot insert duplicate key row in object 'dbo._AccRgAT...' with unique index.... Это происходит из-за появления логического мусора в SQL-таблицах остатков. Стандартное «Тестирование и исправление» (ТиИ) в режиме 1С:Предприятие в таких случаях часто оказывается бессильным.

Проанализируем, как решить эту задачу на уровне базы данных (на примере MS SQL Server):

  1. Обязательно создадим резервную копию базы данных перед любыми манипуляциями! Если информационных баз несколько, для регулярного автоматического создания резервных копий можно использовать программу для автоматического архивирования 1С.
  2. Остановим службу сервера 1С:Предприятия, чтобы разорвать все активные соединения и заблокировать запись новых данных.
  3. Откроем SQL Server Management Studio (SSMS) и подключимся к нашему серверу баз данных.
  4. Определим имя таблицы итогов для регистра бухгалтерии. Обычно таблицы остатков по регистру бухгалтерии имеют префикс _AccRgAT (например, _AccRgAT123). Точное имя таблицы для вашей конфигурации можно узнать с помощью функции платформы ПолучитьСтруктуруХраненияБазыДанных().
  5. Выполним полную очистку проблемной таблицы остатков. Поскольку эта таблица содержит лишь производные (рассчитанные) данные, мы можем безболезненно ее очистить — первичные проводки хранятся в таблице движений (_AccRgED) и не пострадают. Выполним SQL-запрос: TRUNCATE TABLE dbo._AccRgAT123;
  6. Запустим службу сервера 1С:Предприятия.
  7. Зайдем в базу в режиме "Предприятие", откроем обработку «Управление итогами», включим итоги по регистру бухгалтерии и запустим их полный пересчет. Платформа заново создаст все записи в SQL-таблице на основе чистых и актуальных первичных движений, и ошибка уникальности индекса исчезнет.

Как предотвратить сбои в будущем?

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

← На главную