В практике администрирования баз 1С на платформе MS SQL нередко встречаются ситуации, когда после аварийного завершения динамического обновления или ручного восстановления системных таблиц в базе начинают некорректно строиться отчеты. Типичное проявление проблемы: документы, проведенные на конец дня (с временем 23:59:59), не попадают в выборку отчета за выбранный месяц, однако сразу отображаются, если сдвинуть границу периода на одни сутки вперед. При этом если документ перенести на секунду назад (на 23:59:58), он отображается без проблем.
Разберем детально, почему возникает такая ошибка, как устроены срезы итогов в регистрах накопления и какими способами можно вернуть базу данных в полностью рабочее состояние без необходимости полного переноса данных в чистую базу.
Проанализируем механику работы виртуальных таблиц регистров накопления (Остатки, Обороты, ОстаткиИОбороты). Когда отчет формируется через запрос или СКД, значение параметра конца периода может передаваться либо в виде даты, либо в виде объекта Граница.
Если параметр конца периода задан простой датой без использования границы с видом ВидГраницы.Включая, запрос к виртуальной таблице может отсекать записи, у которых время совпадает с точным значением границы 23:59:59. Однако если в чистой базе при аналогичной конфигурации отчет отрабатывает штатно, корень проблемы кроется в рассинхронизации физических таблиц итогов регистра и таблицы движений в СУБД после сбоя.
Стандартная процедура «Тестирование и исправление» при наличии флага «Пересчет итогов» не всегда очищает физическую таблицу итогов в SQL полностью, а лишь обновляет существующие срезы. Чтобы гарантированно пересоздать таблицу итогов с нуля на основе фактических движений документов, выполним программный сброс и повторное включение итогов.
Для этого воспользуемся внешней обработкой и выполним следующий код для проблемных регистров (например, регистров взаиморасчетов РасчетыСКлиентами, РасчетыСПоставщиками):
ИмяРегистра = "РасчетыСКлиентами";
РегистрыНакопления[ИмяРегистра].УстановитьИспользованиеИтогов(Ложь);
РегистрыНакопления[ИмяРегистра].УстановитьИспользованиеИтогов(Истина);
Отключение и повторное включение итогов полностью очищает физическую таблицу _AccumRgT* в MS SQL Server и заново заполняет ее данными на основе реальной таблицы записей _AccumRg*.
Если требуется прицельно пересчитать конкретный расчетный период без глобального отключения итогов, применим методы менеджера регистра:
ИмяРегистра = "РасчетыСКлиентами";
НачалоПериода = НачалоМесяца(ТекущаяДата());
КонецПериода = КонецМесяца(ТекущаяДата());
РегистрыНакопления[ИмяРегистра].ПересчитатьИтогиЗаПериод(НачалоПериода, КонецПериода);
РегистрыНакопления[ИмяРегистра].ПересчитатьТекущиеИтоги();
Разберем второй вариант решения без использования программного кода:
Если прямое редактирование таблиц на уровне SQL нарушило внутреннюю структуру индексов или служебных полей _Period, простого пересчета итогов может быть недостаточно. В этом случае выполним полную пересборку таблиц средствами платформы:
Именно режим Реструктуризация таблиц информационной базы заново создает таблицы на уровне SQL, копирует в них данные и полностью перестраивает кластерные и некластерные индексы.
В конфигурациях линейки «1С:Управление торговлей 11» движения по взаиморасчетам разделены на оперативные и аналитические (распределение по накладным, договорам и расчетным документам). Если регламентное задание распределения зависает или аварийно завершается, записи по регистрам взаиморасчетов могут фиксироваться некорректно.
Проверим состояние очереди заданий:
Если в базу вносились ручные правки на стороне СУБД, обязательно проверим физическую целостность всех страниц и индексов базы данных. Для этого в SQL Server Management Studio выполним диагностический скрипт:
DBCC CHECKDB ('ИмяБазы1С') WITH NO_INFOMSGS, ALL_ERRORMSGS;
Если команда DBCC CHECKDB не выявила ошибок выделения памяти и согласованности данных, сбросим процедурный кэш СУБД, чтобы исключить использование неоптимальных или поврежденных планов запросов:
DBCC FREEPROCCACHE;
Комплексное применение программного отключения/включения итогов и реструктуризации таблиц позволяет полностью восстановить корректное поведение отчетов без ручного перезачета документов и миграции базы данных.