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