Почему в отчетах 1С не отображаются движения на границе периода и как восстановить таблицы итогов?

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

В практике администрирования баз 1С на платформе MS SQL нередко встречаются ситуации, когда после аварийного завершения динамического обновления или ручного восстановления системных таблиц в базе начинают некорректно строиться отчеты. Типичное проявление проблемы: документы, проведенные на конец дня (с временем 23:59:59), не попадают в выборку отчета за выбранный месяц, однако сразу отображаются, если сдвинуть границу периода на одни сутки вперед. При этом если документ перенести на секунду назад (на 23:59:58), он отображается без проблем.

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

Причина 1: Особенности задания границ периода и работа с временем 23:59:59

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

Если параметр конца периода задан простой датой без использования границы с видом ВидГраницы.Включая, запрос к виртуальной таблице может отсекать записи, у которых время совпадает с точным значением границы 23:59:59. Однако если в чистой базе при аналогичной конфигурации отчет отрабатывает штатно, корень проблемы кроется в рассинхронизации физических таблиц итогов регистра и таблицы движений в СУБД после сбоя.

Способ 1: Принудительный сброс и пересоздание итогов через встроенный язык

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

Для этого воспользуемся внешней обработкой и выполним следующий код для проблемных регистров (например, регистров взаиморасчетов РасчетыСКлиентами, РасчетыСПоставщиками):


ИмяРегистра = "РасчетыСКлиентами";
РегистрыНакопления[ИмяРегистра].УстановитьИспользованиеИтогов(Ложь);
РегистрыНакопления[ИмяРегистра].УстановитьИспользованиеИтогов(Истина);

Отключение и повторное включение итогов полностью очищает физическую таблицу _AccumRgT* в MS SQL Server и заново заполняет ее данными на основе реальной таблицы записей _AccumRg*.

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


ИмяРегистра = "РасчетыСКлиентами";
НачалоПериода = НачалоМесяца(ТекущаяДата());
КонецПериода = КонецМесяца(ТекущаяДата());

РегистрыНакопления[ИмяРегистра].ПересчитатьИтогиЗаПериод(НачалоПериода, КонецПериода);
РегистрыНакопления[ИмяРегистра].ПересчитатьТекущиеИтоги();

Способ 2: Сдвиг периода рассчитанных итогов через стандартную обработку

Разберем второй вариант решения без использования программного кода:

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

Способ 3: Полная реструктуризация таблиц информационной базы

Если прямое редактирование таблиц на уровне SQL нарушило внутреннюю структуру индексов или служебных полей _Period, простого пересчета итогов может быть недостаточно. В этом случае выполним полную пересборку таблиц средствами платформы:

  1. Создадим резервную копию базы данных средствами MS SQL Server Management Studio.
  2. Запустим Конфигуратор в монопольном режиме.
  3. Перейдем в меню Администрирование — Тестирование и исправление....
  4. Обязательно отметим флаги Реструктуризация таблиц информационной базы и Пересчет итогов.
  5. В блоке действий при наличии ссылочной целостности выберем Создавать объекты или Очищать ссылки в зависимости от регламента обслуживания.
  6. Запустим процесс и дождемся завершения служебного протокола.

Именно режим Реструктуризация таблиц информационной базы заново создает таблицы на уровне SQL, копирует в них данные и полностью перестраивает кластерные и некластерные индексы.

Способ 4: Проверка фонового распределения взаиморасчетов в УТ 11

В конфигурациях линейки «1С:Управление торговлей 11» движения по взаиморасчетам разделены на оперативные и аналитические (распределение по накладным, договорам и расчетным документам). Если регламентное задание распределения зависает или аварийно завершается, записи по регистрам взаиморасчетов могут фиксироваться некорректно.

Проверим состояние очереди заданий:

  1. Откроем НСИ и администрирование — Обслуживание — Регламентные и фоновые задания.
  2. Найдем регламентное задание Выполнение отложенных движений по расчетам с клиентами / поставщиками.
  3. Убедимся, что задание не завершается с ошибкой, и выполним его вручную.
  4. При необходимости выполним процедуру Закрытие месяца в разделе Финансовый результат и контроллинг, которая выполняет финальный пересчет и выравнивание распределений взаиморасчетов.

Способ 5: Проверка целостности и очистка кэша на стороне MS SQL Server

Если в базу вносились ручные правки на стороне СУБД, обязательно проверим физическую целостность всех страниц и индексов базы данных. Для этого в SQL Server Management Studio выполним диагностический скрипт:

DBCC CHECKDB ('ИмяБазы1С') WITH NO_INFOMSGS, ALL_ERRORMSGS;

Если команда DBCC CHECKDB не выявила ошибок выделения памяти и согласованности данных, сбросим процедурный кэш СУБД, чтобы исключить использование неоптимальных или поврежденных планов запросов:

DBCC FREEPROCCACHE;

Комплексное применение программного отключения/включения итогов и реструктуризации таблиц позволяет полностью восстановить корректное поведение отчетов без ручного перезачета документов и миграции базы данных.

← На главную