Ситуация, когда в оборотно-сальдовой ведомости (ОСВ) внезапно появляется «краснота» по счетам (например, по 10 или 60 счету), а стандартные средства исправления итогов не помогают, является критической для любой организации. В рамках данной статьи мы подробно разберем, почему возникают такие расхождения, проанализируем внутреннюю структуру хранения данных в 1С и изучим пошаговые алгоритмы восстановления целостности базы данных.
Рассмотрим ситуацию, описанную пользователем: база клиент-серверная, пересчет итогов в конфигураторе и пользовательском режиме не дает результата, а выгрузка в dt и последующая загрузка сохраняют проблему. Мы видим странный симптом: в самом документе (в форме) проводки выглядят корректно, все аналитики (контрагент, договор) заполнены. Однако при попытке построить отчет или выполнить запрос к виртуальным таблицам Хозрасчетный.Обороты или Хозрасчетный.Остатки, вместо значений субконто возвращается NULL. На этом этапе для первичной диагностики можно дополнительно убедиться в отсутствии суммовых расхождений, используя отчет для сравнения проводок по хозрасчетному регистру с суммой документа.
Проанализируем причину такого поведения. В системе 1С:Предприятие 8 данные регистра бухгалтерии распределены по нескольким физическим таблицам на уровне СУБД (SQL Server, PostgreSQL и др.):
_AccRg...) — содержит общие данные проводки (период, регистратор, счет, сумма)._AccRgAT...) — хранят предварительно рассчитанные остатки и обороты для ускорения построения отчетов.Выясним главную деталь: если проблема вызвана прерванным переходом на версию 1С:Бухгалтерия КОРП или некорректным программным заполнением измерения Подразделение, возникает «рассинхронизация». Платформа ожидает, что у каждой записи регистра теперь есть поле «Подразделение», но в физической таблице на диске для старых записей эти поля не проинициализированы. В итоге запрос к виртуальной таблице «разваливается», возвращая NULL, а механизм пересчета итогов просто копирует этот «мусор» в таблицы итогов.
Если стандартное Тестирование и исправление (ТиИ) не помогает, нам необходимо заставить платформу полностью пересоздать структуру таблиц регистра бухгалтерии. Рассмотрим, как это сделать без написания кода.
Проанализируем следующий алгоритм:
План счетов в режиме «Конфигуратор» или в пользовательском режиме (если редактирование разрешено).Виды субконто новое, произвольное субконто (например, «Статьи затрат» или любое другое, которого там не было).Этот «трюк» позволяет платформе автоматически исправить несоответствия между основной таблицей регистра и таблицей значений субконто, заменяя физические NULL на корректные пустые ссылки или значения по умолчанию.
Иногда ручная корректировка невозможна из-за огромного объема данных. В этом случае мы воспользуемся программным методом. Разберем, как обновить записи регистра, не затрагивая логику проведения документов и не меняя даты запрета редактирования. Для тех, кто предпочитает готовые инструменты, существуют обработки для анализа и редактирования записей документов по любым регистрам, которые позволяют выполнить подобные операции через пользовательский интерфейс.
Посмотрим на пример кода, который можно использовать во внешней обработке:
Процедура ПерезаписатьПроводкиПоСчету(ПроблемныйСчет)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Хозрасчетный.Регистратор КАК Регистратор
|ИЗ
| РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Счет = &Счет";
Запрос.УстановитьПараметр("Счет", ПроблемныйСчет);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Создаем набор записей по конкретному документу
Набор = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Выборка.Регистратор);
// Читаем существующие записи из базы
Набор.Прочитать();
// Устанавливаем режим загрузки, чтобы не срабатывали обработчики событий
// и не проверялись итоги/периоды при записи
Набор.ОбменДанными.Загрузка = Истина;
Попытка
Набор.Записать();
Сообщить("Обновлен регистратор: " + Выборка.Регистратор);
Исключение
Сообщить("Ошибка при записи " + Выборка.Регистратор + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Почему этот метод эффективен? При вызове метода Записать() платформа анализирует текущие метаданные (структуру счета и субконто) и приводит физические записи в соответствие с ними. Если в базе на уровне SQL были «битые» поля, они будут перезаписаны корректными значениями, хранящимися в объекте НаборЗаписей. В более сложных ситуациях, когда нужно не просто перезаписать весь набор, а точечно убрать неверные движения, может помочь обработка для выборочного удаления проводок документов.
Если вы работаете с клиент-серверной версией и обычный пересчет итогов через Управление итогами не помогает, можно прибегнуть к радикальному методу — полной очистке таблиц итогов через SQL-запрос. Внимание: перед выполнением данных действий обязательно создайте резервную копию базы данных средствами СУБД!
Проанализируем ситуацию: иногда таблицы итогов (например, _AccRgAT0493) настолько повреждены индексами или некорректными записями, что 1С не может их очистить штатно. В этом случае мы можем использовать команду TRUNCATE TABLE.
Выясним последовательность действий:
ПолучитьСтруктуруХраненияБазыДанных().Пример команды для SQL Server:
-- Очистка таблиц итогов (имена таблиц приведены для примера)
TRUNCATE TABLE _AccRgAT0493;
TRUNCATE TABLE _AccRgAT1512;
TRUNCATE TABLE _AccRgCT515;
После очистки необходимо запустить сервер 1С, зайти в Параметры системы и выполнить Полный пересчет итогов. Для более контролируемого запуска этой операции можно использовать и внешние инструменты, например, обработку для пересчета итогов с расширенным логированием. Поскольку таблицы теперь пусты, система будет обязана пересчитать их с «чистого листа», опираясь на основную таблицу движений.
Как отметил автор темы, проблема часто проявляется в том, что запрос по виртуальной таблице не видит данные, а запрос к физической таблице (с отбором по регистратору) — видит. Это происходит из-за того, что механизм виртуальных таблиц 1С использует INNER JOIN между таблицей проводок и таблицей субконто. Если запись в таблице субконто отсутствует, вся строка пропадает из результатов запроса к оборотам или остаткам.
Проанализируем способ диагностики через консоль запросов УФ. Попробуйте выполнить следующий запрос, чтобы найти «проблемные» записи:
ВЫБРАТЬ
Хозрасчетный.Регистратор,
Хозрасчетный.НомерСтроки,
Хозрасчетный.Субконто1,
Хозрасчетный.Субконто2
ИЗ
РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
ГДЕ
Хозрасчетный.Счет = &Счет
И Хозрасчетный.Субконто1 ЕСТЬ NULL
Если этот запрос возвращает строки, значит, у вас действительно произошло разрушение ссылочной целостности на физическом уровне. Найденные проблемные документы можно детально изучить с помощью инструментов для анализа записей документов по любым регистрам. Для исправления же поможет либо Метод 1 (реструктуризация), либо Метод 2 (перезапись программно).
Мы рассмотрели сложную техническую проблему «слетевших» итогов в 1С:Бухгалтерия 3.0. Основной вывод: краснота в ОСВ — это лишь симптом. Истинная причина часто кроется в нарушении структуры таблиц после обновления до версии КОРП или сбоев при программной записи данных в регистр. Иногда похожие симптомы вызывают «зависшие» движения, поэтому нелишним будет проверить базу на наличие и удаление проводок, оставшихся после удаления документов.
Помните ключевые правила:
dt не всегда лечит базу, так как в новых версиях платформы 8.3 ошибки структуры могут мигрировать вместе с файлом выгрузки.ОбменДанными.Загрузка = Истина — это самый безопасный способ массово «обновить» записи регистра без риска изменить бухгалтерские показатели или логику документов.Надеемся, что предложенные нами методы помогут вам восстановить работоспособность вашей системы и избежать подобных проблем в будущем.