Что делать, если в 1С:Бухгалтерия 3.0 слетели итоги и появились пустые субконто после перехода на КОРП?

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

Ситуация, когда в оборотно-сальдовой ведомости (ОСВ) внезапно появляется «краснота» по счетам (например, по 10 или 60 счету), а стандартные средства исправления итогов не помогают, является критической для любой организации. В рамках данной статьи мы подробно разберем, почему возникают такие расхождения, проанализируем внутреннюю структуру хранения данных в 1С и изучим пошаговые алгоритмы восстановления целостности базы данных.

Выясняем причину: почему стандартный пересчет итогов бессилен?

Рассмотрим ситуацию, описанную пользователем: база клиент-серверная, пересчет итогов в конфигураторе и пользовательском режиме не дает результата, а выгрузка в dt и последующая загрузка сохраняют проблему. Мы видим странный симптом: в самом документе (в форме) проводки выглядят корректно, все аналитики (контрагент, договор) заполнены. Однако при попытке построить отчет или выполнить запрос к виртуальным таблицам Хозрасчетный.Обороты или Хозрасчетный.Остатки, вместо значений субконто возвращается NULL. На этом этапе для первичной диагностики можно дополнительно убедиться в отсутствии суммовых расхождений, используя отчет для сравнения проводок по хозрасчетному регистру с суммой документа.

Проанализируем причину такого поведения. В системе 1С:Предприятие 8 данные регистра бухгалтерии распределены по нескольким физическим таблицам на уровне СУБД (SQL Server, PostgreSQL и др.):

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

Выясним главную деталь: если проблема вызвана прерванным переходом на версию 1С:Бухгалтерия КОРП или некорректным программным заполнением измерения Подразделение, возникает «рассинхронизация». Платформа ожидает, что у каждой записи регистра теперь есть поле «Подразделение», но в физической таблице на диске для старых записей эти поля не проинициализированы. В итоге запрос к виртуальной таблице «разваливается», возвращая NULL, а механизм пересчета итогов просто копирует этот «мусор» в таблицы итогов.

Метод 1: Принудительная реструктуризация через изменение Плана счетов

Если стандартное Тестирование и исправление (ТиИ) не помогает, нам необходимо заставить платформу полностью пересоздать структуру таблиц регистра бухгалтерии. Рассмотрим, как это сделать без написания кода.

Проанализируем следующий алгоритм:

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

Этот «трюк» позволяет платформе автоматически исправить несоответствия между основной таблицей регистра и таблицей значений субконто, заменяя физические NULL на корректные пустые ссылки или значения по умолчанию.

Метод 2: Программная перезапись наборов записей (DataExchange.Load)

Иногда ручная корректировка невозможна из-за огромного объема данных. В этом случае мы воспользуемся программным методом. Разберем, как обновить записи регистра, не затрагивая логику проведения документов и не меняя даты запрета редактирования. Для тех, кто предпочитает готовые инструменты, существуют обработки для анализа и редактирования записей документов по любым регистрам, которые позволяют выполнить подобные операции через пользовательский интерфейс.

Посмотрим на пример кода, который можно использовать во внешней обработке:


Процедура ПерезаписатьПроводкиПоСчету(ПроблемныйСчет)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |   Хозрасчетный.Регистратор КАК Регистратор
        |ИЗ
        |   РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
        |ГДЕ
        |   Хозрасчетный.Счет = &Счет";
    
    Запрос.УстановитьПараметр("Счет", ПроблемныйСчет);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        // Создаем набор записей по конкретному документу
        Набор = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
        Набор.Отбор.Регистратор.Установить(Выборка.Регистратор);
        
        // Читаем существующие записи из базы
        Набор.Прочитать();
        
        // Устанавливаем режим загрузки, чтобы не срабатывали обработчики событий
        // и не проверялись итоги/периоды при записи
        Набор.ОбменДанными.Загрузка = Истина;
        
        Попытка
            Набор.Записать();
            Сообщить("Обновлен регистратор: " + Выборка.Регистратор);
        Исключение
            Сообщить("Ошибка при записи " + Выборка.Регистратор + ": " + ОписаниеОшибки());
        КонецПопытки;
    КонецЦикла;
КонецПроцедуры

Почему этот метод эффективен? При вызове метода Записать() платформа анализирует текущие метаданные (структуру счета и субконто) и приводит физические записи в соответствие с ними. Если в базе на уровне SQL были «битые» поля, они будут перезаписаны корректными значениями, хранящимися в объекте НаборЗаписей. В более сложных ситуациях, когда нужно не просто перезаписать весь набор, а точечно убрать неверные движения, может помочь обработка для выборочного удаления проводок документов.

Метод 3: Очистка таблиц итогов на уровне SQL (для опытных администраторов)

Если вы работаете с клиент-серверной версией и обычный пересчет итогов через Управление итогами не помогает, можно прибегнуть к радикальному методу — полной очистке таблиц итогов через SQL-запрос. Внимание: перед выполнением данных действий обязательно создайте резервную копию базы данных средствами СУБД!

Проанализируем ситуацию: иногда таблицы итогов (например, _AccRgAT0493) настолько повреждены индексами или некорректными записями, что 1С не может их очистить штатно. В этом случае мы можем использовать команду TRUNCATE TABLE.

Выясним последовательность действий:

  1. Остановите службу сервера 1С:Предприятие.
  2. В консоли SQL выполните очистку таблиц текущих итогов и таблиц итогов по периодам для вашего регистра бухгалтерии. Имена таблиц можно узнать через функцию ПолучитьСтруктуруХраненияБазыДанных().

Пример команды для SQL Server:


-- Очистка таблиц итогов (имена таблиц приведены для примера)
TRUNCATE TABLE _AccRgAT0493;
TRUNCATE TABLE _AccRgAT1512;
TRUNCATE TABLE _AccRgCT515;

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

Метод 4: Исправление «невидимых» NULL в запросах

Как отметил автор темы, проблема часто проявляется в том, что запрос по виртуальной таблице не видит данные, а запрос к физической таблице (с отбором по регистратору) — видит. Это происходит из-за того, что механизм виртуальных таблиц 1С использует INNER JOIN между таблицей проводок и таблицей субконто. Если запись в таблице субконто отсутствует, вся строка пропадает из результатов запроса к оборотам или остаткам.

Проанализируем способ диагностики через консоль запросов УФ. Попробуйте выполнить следующий запрос, чтобы найти «проблемные» записи:


ВЫБРАТЬ
    Хозрасчетный.Регистратор,
    Хозрасчетный.НомерСтроки,
    Хозрасчетный.Субконто1,
    Хозрасчетный.Субконто2
ИЗ
    РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
ГДЕ
    Хозрасчетный.Счет = &Счет
    И Хозрасчетный.Субконто1 ЕСТЬ NULL

Если этот запрос возвращает строки, значит, у вас действительно произошло разрушение ссылочной целостности на физическом уровне. Найденные проблемные документы можно детально изучить с помощью инструментов для анализа записей документов по любым регистрам. Для исправления же поможет либо Метод 1 (реструктуризация), либо Метод 2 (перезапись программно).

Подведем итоги

Мы рассмотрели сложную техническую проблему «слетевших» итогов в 1С:Бухгалтерия 3.0. Основной вывод: краснота в ОСВ — это лишь симптом. Истинная причина часто кроется в нарушении структуры таблиц после обновления до версии КОРП или сбоев при программной записи данных в регистр. Иногда похожие симптомы вызывают «зависшие» движения, поэтому нелишним будет проверить базу на наличие и удаление проводок, оставшихся после удаления документов.

Помните ключевые правила:

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

← На главную