Почему постоянно меняется остаток по бухгалтерским счетам в 1С и как это исправить

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

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

Проанализируем основные причины такого поведения платформы 1С и разберем пошаговый алгоритм решения этой проблемы.

Причины возникновения «скачущих» остатков

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

  1. Длинные или незавершенные транзакции (эффект «грязного чтения»): Если фоновые процессы, внешние обработки или действия пользователей массово создают или проводят документы внутри открытой транзакции (вызов НачатьТранзакцию()), которая длится несколько секунд и затем отменяется или фиксируется, платформа 1С при формировании отчета может временно считывать еще не зафиксированные движения по регистру.
  2. Рассинхронизация таблиц итогов после системного сбоя: Регистр бухгалтерии РегистрБухгалтерии.Хозрасчетный хранит данные в нескольких физических таблицах СУБД: таблица проводок (движений) и таблицы итогов. В случае сбоя питания или аварийного завершения работы сервера таблицы итогов теряют актуальность и рассинхронизируются с реальными проводками.
  3. Механизм разделения итогов: При включенном разделении итогов записи сальдо распределяются по техническим разделителям. Если в СУБД произошел сбой, динамический расчет остатков при параллельной работе пользователей выдает нестабильные значения.

Шаг 1. Пересчет итогов регистра бухгалтерии

Простое смещение границы рассчитанных итогов с помощью метода УстановитьПериодРассчитанныхИтогов() в такой ситуации обычно не помогает, так как оно лишь смещает техническую дату, но не перестраивает физические таблицы. Нам необходим полный пересчет итогов.

Рассмотреть выполнение пересчета итогов можно через программный код или через режим Конфигуратора.

Проанализируем пример кода для принудительного пересчета итогов по хозрасчетному регистру:


// Устанавливаем период расчета итогов на заведомо прошлый период и пересчитываем
РегистрыБухгалтерии.Хозрасчетный.УстановитьПериодРассчитанныхИтогов(Дата(2000, 1, 1));
РегистрыБухгалтерии.Хозрасчетный.ПересчитатьИтоги();

Также можно выполнить процедуру в монопольном режиме через Конфигуратор: меню Администрирование — Тестирование и исправление..., выбрав пункт Пересчет итогов.

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

Шаг 2. Поиск и устранение неверных остатков после пересчета

Если остаток зафиксировался, но значение остается неверным, разберем действия по устранению расхождений:

  1. Сравнение проводок с отчетом «Карточка счета»: Сформируем отчет «Карточка счета» за весь период ведения учета и проверим математику дебетовых и кредитовых оборотов.
  2. Проверка реальных движений прямой выборкой: Для проверки целостности данных напишем запрос напрямую к таблице движений регистра, исключая использование виртуальных таблиц остатков:
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	СУММА(Хозрасчетный.Сумма) КАК Сумма
        |ИЗ
        |	РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
        |ГДЕ
        |	Хозрасчетный.Счет = &Счет
        |	И Хозрасчетный.Активность = ИСТИНА";
    Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.ПрочиеРасходы);
    Результат = Запрос.Выполнить();
    
    Сравним результат выполнения данного запроса с остатком из виртуальной таблицы РегистрБухгалтерии.Хозрасчетный.Остатки(). Если суммы различаются, проблема заключается в итоговых таблицах или разделителях.
  3. Тестирование и исправление информационной базы: Выполним процедуру проверки логической и ссылочной целостности, а также реструктуризацию таблиц в меню «Тестирование и исправление».
  4. Очистка кэша и пересоздание базы: Выполним очистку локального кэша платформы 1С, выгрузку базы в файл .dt и ее последующую загрузку в новую базу СУБД. Это позволяет пересоздать индексы СУБД и очистить фантомные записи.

Шаг 3. Защита от динамических скачков при автоматической обработке данных

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


НачатьТранзакцию();
// Формирование отчета или выборка из регистра бухгалтерии
ОтчетОбъект.СформироватьОтчет();
ОтменитьТранзакцию();

Таким образом, мы подробно разобрали причины плавающих остатков по счетам учета и методы восстановления корректных итогов в 1С.

← На главную