В практике работы с конфигурациями на платформе 1С (особенно в крупных базах, таких как Управление производственным предприятием) программисты часто сталкиваются с ситуацией, когда стандартные отчеты, например, Оборотно-сальдовая ведомость, показывают странные цифры. Бухгалтер видит остатки или обороты по счету, но при попытке расшифровать их до документа (через Карточку счета или добавление регистратора в запрос) данные исчезают. Проанализируем, почему возникают такие «фантомные» записи и как их корректно удалить, не прибегая к длительному тестированию и исправлению всей базы.
Рассмотрим ситуацию на примере запроса к виртуальной таблице РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты. Проблема проявляется следующим образом: если мы делаем запрос без указания периодичности, система выдает строки с суммами. Но стоит нам добавить в параметры виртуальной таблицы периодичность Регистратор, как эти строки пропадают из результата. Посмотрим на пример исходного запроса, который может выдавать ошибочные данные:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ОстаткиИОбороты.Счет КАК Счет,
ОстаткиИОбороты.СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,
ОстаткиИОбороты.СуммаОборотДт КАК СуммаОборотДт,
ОстаткиИОбороты.СуммаОборотКт КАК СуммаОборотКт,
ОстаткиИОбороты.СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокДт,
ОстаткиИОбороты.Субконто1 КАК Субконто1,
ОстаткиИОбороты.Субконто2 КАК Субконто2
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&ДатаНач, &ДатаКон, , , Счет В ИЕРАРХИИ (&Счет), , Организация = &Организация) КАК ОстаткиИОбороты
ИТОГИ
СУММА(СуммаНачальныйОстатокДт),
СУММА(СуммаОборотДт),
СУММА(СуммаОборотКт),
СУММА(СуммаКонечныйОстатокДт)
ПО
ОБЩИЕ,
Счет ИЕРАРХИЯ,
Субконто1,
Субконто2
Когда мы видим обороты в ОСВ, но не видим их в Карточке счета, это верный признак того, что таблицы итогов разошлись с таблицами движений. Выясним причину этого явления.
Для понимания сути проблемы разберем механизм работы платформы 1С с регистрами бухгалтерии. Данные хранятся в нескольких физических таблицах СУБД:
Регистратор.Если произошел программный сбой, некорректное завершение транзакции или в базу вносились изменения напрямую через SQL (в обход объектной модели 1С), записи в таблицах итогов могут стать «битыми». В итоге в таблице итогов сумма есть, а подтверждающего её документа в основной таблице нет. Именно поэтому при добавлении регистратора запрос возвращает «пусто».
Если база данных слишком большая и стандартное «Тестирование и исправление» (ТиИ) через Конфигуратор затянется на сутки, мы можем воспользоваться программным методом пересчета. Рассмотрим наиболее быстрый и эффективный способ исправления конкретного периода. Выполним следующий код (например, во внешней обработке):
// Укажите границы периода, в котором наблюдаются ошибки
ДатаНачала = НачалоМесяца(ДатаОшибки);
ДатаОкончания = КонецМесяца(ДатаОшибки);
// Вызываем метод пересчета итогов для конкретного регистра
РегистрыБухгалтерии.Хозрасчетный.ПересчитатьИтогиЗаПериод(ДатаНачала, ДатаОкончания);
Важный момент: данный метод полностью очищает записи в таблицах итогов за указанный интервал и заново заполняет их, сканируя таблицу движений. Это гарантирует, что «фантомные» записи исчезнут, так как для них нет оснований в основной таблице регистра.
Проанализируем ситуацию, когда ручной код писать неудобно. В сообществе 1С популярны «Инструменты разработчика». С их помощью можно выполнить более тонкую очистку. Посмотрим, как это работает:
Такой подход позволяет избежать накопления «мусора» в таблицах итогов, который иногда остается даже после обычного пересчета.
Иногда причина кроется в «битых» ссылках в разрезе субконто. Выясним, нет ли записей с незаполненными или некорректными типами значений. Для этого можно дополнить проверочный запрос функциями ТИПЗНАЧЕНИЯ:
ВЫБРАТЬ
ОстаткиИОбороты.Счет,
ОстаткиИОбороты.Субконто1,
ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто1) КАК ТипСубконто1,
ОстаткиИОбороты.СуммаОборотДт
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&ДатаНач, &ДатаКон, , , , , ) КАК ОстаткиИОбороты
ГДЕ
ОстаткиИОбороты.СуммаОборотДт <> 0
Если вы обнаружите строки, где тип значения субконто не соответствует настройкам счета (или является NULL там, где должна быть ссылка), значит, проблема в логической целостности. В этом случае после пересчета итогов рекомендуется также выполнить поиск и удаление объектов с «Объект не найден».
Чтобы избежать подобных проблем в будущем, особенно в УПП, разберем несколько правил эксплуатации:
ОбменДанными.Загрузка = Истина без крайней необходимости, так как при этом режиме итоги могут не обновляться автоматически.Подведем итог: если вы столкнулись с «невидимыми» документами в ОСВ, не паникуйте и не спешите перезаписывать документы вручную. Использование метода ПересчитатьИтогиЗаПериод — это самый быстрый и безопасный способ вернуть учет в актуальное состояние.