Как исправить расхождение итогов в виртуальной таблице ОстаткиИОбороты регистра бухгалтерии

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет Промышленность, строительство и АПК
← На главную

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

Разбор симптомов проблемы

Рассмотрим ситуацию на примере запроса к виртуальной таблице РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты. Проблема проявляется следующим образом: если мы делаем запрос без указания периодичности, система выдает строки с суммами. Но стоит нам добавить в параметры виртуальной таблицы периодичность Регистратор, как эти строки пропадают из результата. Посмотрим на пример исходного запроса, который может выдавать ошибочные данные:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ОстаткиИОбороты.Счет КАК Счет,
    ОстаткиИОбороты.СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,
    ОстаткиИОбороты.СуммаОборотДт КАК СуммаОборотДт,
    ОстаткиИОбороты.СуммаОборотКт КАК СуммаОборотКт,
    ОстаткиИОбороты.СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокДт,
    ОстаткиИОбороты.Субконто1 КАК Субконто1,
    ОстаткиИОбороты.Субконто2 КАК Субконто2
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&ДатаНач, &ДатаКон, , , Счет В ИЕРАРХИИ (&Счет), , Организация = &Организация) КАК ОстаткиИОбороты
ИТОГИ
    СУММА(СуммаНачальныйОстатокДт),
    СУММА(СуммаОборотДт),
    СУММА(СуммаОборотКт),
    СУММА(СуммаКонечныйОстатокДт)
ПО
    ОБЩИЕ,
    Счет ИЕРАРХИЯ,
    Субконто1,
    Субконто2

Когда мы видим обороты в ОСВ, но не видим их в Карточке счета, это верный признак того, что таблицы итогов разошлись с таблицами движений. Выясним причину этого явления.

Почему виртуальная таблица выдает неверные данные?

Для понимания сути проблемы разберем механизм работы платформы 1С с регистрами бухгалтерии. Данные хранятся в нескольких физических таблицах СУБД:

  1. Таблица движений (основная): Здесь хранятся записи в разрезе каждого регистратора (документа). Именно к ней обращается запрос, когда вы указываете периодичность Регистратор.
  2. Таблицы итогов: Это предварительно рассчитанные агрегаты (обычно по месяцам). Платформа использует их для ускорения работы отчетов. Когда в запросе нет детализации до регистратора, 1С берет данные именно отсюда.

Если произошел программный сбой, некорректное завершение транзакции или в базу вносились изменения напрямую через SQL (в обход объектной модели 1С), записи в таблицах итогов могут стать «битыми». В итоге в таблице итогов сумма есть, а подтверждающего её документа в основной таблице нет. Именно поэтому при добавлении регистратора запрос возвращает «пусто».

Способ 1. Программный пересчет итогов за период

Если база данных слишком большая и стандартное «Тестирование и исправление» (ТиИ) через Конфигуратор затянется на сутки, мы можем воспользоваться программным методом пересчета. Рассмотрим наиболее быстрый и эффективный способ исправления конкретного периода. Выполним следующий код (например, во внешней обработке):


// Укажите границы периода, в котором наблюдаются ошибки
ДатаНачала = НачалоМесяца(ДатаОшибки);
ДатаОкончания = КонецМесяца(ДатаОшибки);

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

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

Способ 2. Использование инструментов разработчика (ИР)

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

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

Способ 3. Проверка субконто и типов данных

Иногда причина кроется в «битых» ссылках в разрезе субконто. Выясним, нет ли записей с незаполненными или некорректными типами значений. Для этого можно дополнить проверочный запрос функциями ТИПЗНАЧЕНИЯ:


ВЫБРАТЬ
    ОстаткиИОбороты.Счет,
    ОстаткиИОбороты.Субконто1,
    ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто1) КАК ТипСубконто1,
    ОстаткиИОбороты.СуммаОборотДт
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&ДатаНач, &ДатаКон, , , , , ) КАК ОстаткиИОбороты
ГДЕ
    ОстаткиИОбороты.СуммаОборотДт <> 0

Если вы обнаружите строки, где тип значения субконто не соответствует настройкам счета (или является NULL там, где должна быть ссылка), значит, проблема в логической целостности. В этом случае после пересчета итогов рекомендуется также выполнить поиск и удаление объектов с «Объект не найден».

Рекомендации по профилактике

Чтобы избежать подобных проблем в будущем, особенно в УПП, разберем несколько правил эксплуатации:

  1. Регламентные задания: Настройте еженедельный пересчет итогов в нерабочее время для наиболее нагруженных регистров.
  2. Контроль записи: При программном создании движений старайтесь не использовать режим ОбменДанными.Загрузка = Истина без крайней необходимости, так как при этом режиме итоги могут не обновляться автоматически.
  3. Разделение итогов: Проверьте настройку «Разделение итогов» в свойствах регистра бухгалтерии. В некоторых случаях (при очень высокой частоте транзакций) этот механизм может способствовать временным расхождениям, требующим пересчета.

Подведем итог: если вы столкнулись с «невидимыми» документами в ОСВ, не паникуйте и не спешите перезаписывать документы вручную. Использование метода ПересчитатьИтогиЗаПериод — это самый быстрый и безопасный способ вернуть учет в актуальное состояние.

← На главную