В конфигурации «1С:Управление торговлей» редакции 10.3 пользователи иногда сталкиваются с нетипичным behavior отчетов, таких как «Ведомость по товарам на складах» или «Ведомость по товарам и ГТД в организации». Ошибка проявляется следующим образом: если сформировать отчет с пустым периодом, конечные остатки выводятся абсолютно корректно. Однако как только мы задаем дату начала периода (даже если это 01.01.2000 года), в отчете неожиданно возникает фантомный начальный остаток (например, -4 или +4 штуки), которого на самом деле нет ни в движениях, ни в документах.
Рассмотрим подробно, почему возникают такие искажения в расчете остатков и какими способами можно восстановить правильность данных в информационной базе.
Чтобы понять механику возникновения этой ошибки, проанализируем структуру хранения данных в платформе 1С:Предприятие. Регистры накопления остатков (в данном случае ТоварыНаСкладах) физически используют две основные таблицы в базе данных:
При формировании отчета без указания начальной даты периода система считывает данные напрямую из актуальных итогов или пересчитывает их по всем движениям с самого начала ведения учета. В этом случае конечный результат получается верным.
Если же мы задаем начальную дату периода, виртуальная таблица остатков и оборотов обращается к таблице итогов за ближайший рассчитанный месяц и корректирует их движениями за выбранный интервал. Если в результате аварийного завершения работы программы, сбоя питания или нештатного сбоя при массовом перепроведении документов в таблице итогов образовалась ошибочная запись, возникает «фантомный» начальный остаток.
Наиболее простым и эффективным способом устранения рассогласования между таблицами итогов и таблицами движений является штатный механизм конфигуратора.
Разберем процесс выполнения по шагам:
После завершения процедуры пересчета итогов таблицы остатков полностью синхронизируются с физическими документами движений, и фантомные начальные остатки в отчетах исчезают.
В некоторых ситуациях (например, на очень больших базах данных, где полное тестирование и исправление занимает много часов) можно применить альтернативные методы восстановления итогов.
С помощью внешнего кода или обработки можно запустить пересчет итогов выборочно для конкретного регистра накопления, не затрагивая остальные объекты базы. Для этого используется менеджер регистра накопления и его методы:
// Выборка менеджера конкретного регистра
МенеджерРегистра = РегистрыНакопления.ТоварыНаСкладах;
// Отключение рассчитанных итогов и полный пересчет
МенеджерРегистра.УстановитьИспользованиеИтогов(Ложь);
МенеджерРегистра.УстановитьИспользованиеИтогов(Истина);
// Пересчет текущих итогов
МенеджерРегистра.ПересчитатьТекущиеИтоги();
Метод УстановитьИспользованиеИтогов() с последовательным отключением и включением очищает внутреннюю таблицу итогов регистра ТоварыНаСкладах и формирует её заново по имеющимся движениям.
Если информационная база работает в файловом режиме (файл 1Cv8.1CD), повреждение итогов часто связано с физическими сбоями структуры файла. В этом случае перед выполнением пересчета итогов рекомендуется выполнить проверку утилитой chdbfl.exe:
C:\Program Files\1cv8\8.3.XX.XXXX\bin\).chdbfl.exe.1Cv8.1CD, устанавливаем флаг «Исправлять обнаруженные ошибки» и запускаем проверку.Ошибка с появлением некорректного начального остатка при указании даты периода в УТ 10.3 — это классический symptom рассогласования итогов регистра накопления. Выполнение пересчета итогов через «Тестирование и исправление» в Конфигураторе полностью устраняет проблему и возвращает корректность расчетов в отчетах.