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