Почему появляется фантомный остаток на 41 счете в 1С и как его убрать?

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

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

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

Физическая суть проблемы: рассинхронизация таблиц базы данных

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

  1. Таблица движений (основная таблица регистра) — в SQL она обычно имеет префикс _AccRg. В ней хранятся физические записи проводок, каждая из которых жестко привязана к своему документу-источнику (свойство Регистратор). Именно на основании этой таблицы строятся детальные отчеты: «Карточка счета», «Анализ субконто» и «Отчет по проводкам».
  2. Таблицы итогов (агрегированные данные) — в SQL они имеют префикс _AccRgT. Для ускорения работы система не рассчитывает остатки с самого начала ведения учета при каждом формировании ОСВ. Вместо этого платформа хранит уже рассчитанные остатки и обороты в разрезе месяцев и субконто в специальных суммовых таблицах. Оборотно-сальдовая ведомость берет готовые цифры именно отсюда.

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

Почему стандартное «Тестирование и исправление» не всегда помогает?

Многие специалисты сразу запускают процедуру «Тестирование и исправление» (ТиИ) с флагом «Пересчет итогов». Однако на SQL-базах этот шаг часто завершается безрезультатно. Платформа оптимизирует запросы и может проигнорировать пересчет тех периодов, которые она считает «чистыми». Более того, если в регистре бухгалтерии Хозрасчетный задействован механизм разделения итогов, сбойная запись может находиться в одной из параллельных точек хранения (так называемых сплитах), блокируя стандартные алгоритмы пересчета.

Ниже мы рассмотрим пошаговые сценарии и методы исправления этой ситуации — от простых интерактивных действий до низкоуровневой работы с базой данных.

Способ 1. Полный жесткий сброс итогов через интерфейс системы

Самый простой и безопасный способ заставить систему принудительно пересчитать все итоги с нуля — это их полное временное отключение. При отключении итогов платформа физически очищает таблицы _AccRgT в SQL-базе. При последующем включении таблицы заполняются заново на основе реальных проводок из таблицы движений.

Выполним следующие шаги:

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

После выполнения этих действий сформируем ОСВ по счету 41 за проблемный период и проверим результат.

Способ 2. Временное отключение разделения итогов

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

  1. Откроем обработку «Управление итогами».
  2. Выберем наш журнал проводок и откроем настройки разделения итогов.
  3. Снимем флаг «Разделение итогов».
  4. Запустим процедуру полного пересчета итогов.
  5. Убедившись, что фантомный остаток пропал, вернем флаг «Разделение итогов» в исходное состояние для сохранения высокой производительности системы при параллельной работе пользователей.

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

Довольно часто «фантомы» возникают из-за человеческого фактора или ошибок алгоритмов сериализации XML при обмене. Например, документ от 02.10.2018 из-за опечатки записывается в регистр с датой 02.10.0218 или 02.10.2118. ОСВ за стандартные периоды эту запись не видит, но при определенных манипуляциях с границами дат в отчете сумма начинает «вылезать».

Для поиска таких аномалий воспользуемся «Консолью запросов». Напишем и выполним следующий запрос:


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

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

Способ 4. Анализ регистра на наличие битых ссылок (объектов без регистратора)

Еще одна классическая техническая проблема — наличие «осиротевших» движений в регистре бухгалтерии. Это происходит, когда документ-регистратор удаляется непосредственно из базы данных (например, обработкой удаления без контроля ссылочной целостности или при сбое транзакции обмена), а записи в регистре проводок остаются жить своей жизнью. При построении карточки счета платформа делает внутреннее соединение с таблицей документов и, не найдя ссылку, отбрасывает эту строку. ОСВ же работает напрямую с итогами и продолжает выводить сумму.

Давайте напишем запрос в консоли для выявления записей с отсутствующим или битым регистратором:


ВЫБРАТЬ
    Хозрасчетный.Период КАК Период,
    Хозрасчетный.Регистратор КАК Регистратор,
    Хозрасчетный.Сумма КАК Сумма
ИЗ
    РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
ГДЕ
    Хозрасчетный.Счет = &Счет41
    И (Хозрасчетный.Регистратор.Ссылка ЕСТЬ NULL
        И НЕ Хозрасчетный.Регистратор = НЕОПРЕДЕЛЕНО)

Если запрос выявил подобные строки (в поле Регистратор будет значение вида <Объект не найден...>), нам необходимо программно очистить эти движения. Для этого мы можем написать простую обработку. В качестве примера приведем программный код для удаления движений по конкретной битой ссылке:


// Предположим, мы получили битую ссылку из запроса
БитаяСсылка = НайтиБитуюСсылкуОпределеннымОбразом(); 

НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(БитаяСсылка);
// Записываем пустой набор записей, тем самым удаляя битые движения из базы данных
НаборЗаписей.Записать();

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

Способ 5. Прямая очистка таблиц итогов на уровне СУБД (для администраторов)

Если вы являетесь системным администратором и база данных работает под управлением MS SQL Server, при этом стандартные средства 1С зависают или работают некорректно, можно прибегнуть к прямому удалению итогов на уровне СУБД.

Важно: Перед выполнением любых операций на уровне SQL обязательно сделайте резервную копию (бэкап) базы данных!

  1. Переведите базу данных в монопольный режим работы.
  2. Откройте SQL Server Management Studio (SSMS).
  3. Определите имя таблицы итогов для вашего регистра бухгалтерии. Обычно таблицы итогов по счету оканчиваются на _AccRgT и её вариации (например, таблицы остатков и оборотов).
  4. Выполните команду полной очистки этих таблиц (строго таблицы итогов, таблицы движений с префиксом _AccRg трогать нельзя!): TRUNCATE TABLE _AccRgT12345; -- Имя таблицы в вашей базе может отличаться
  5. Запустите конфигуратор 1С и выполните процедуру «Тестирование и исправление» с включенным флагом «Пересчет итогов». Платформа обнаружит абсолютно пустые таблицы итогов и сгенерирует их заново на основе «чистых» проводок из таблицы движений.

Способ 6. Очистка кэша сервера 1С

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

  1. Остановите службу сервера 1С:Предприятия (1C:Enterprise 8.3 Server Agent).
  2. Перейдите в каталог службы (по умолчанию это C:\Program Files\1cv8\srvinfo\ на Windows-сервере).
  3. Найдите папки с длинными буквенно-цифровыми именами (идентификаторы баз данных) и внутри них удалите папки с кэшем (snccntry, reg_1541 и т.д.).
  4. Запустите службу сервера заново.

Применяя данные методы последовательно, вы гарантированно избавитесь от любых расхождений между Оборотно-сальдовой ведомостью и детальными отчетами по счету 41, обеспечив абсолютную чистоту и корректность бухгалтерского учета.

← На главную