При активной работе в платформе 1С:Предприятие 7.7 пользователи иногда сталкиваются с неприятной ситуацией: документ распроведен, в его форме и в карточке счета проводок больше нет, однако в Оборотно-сальдовой ведомости (ОСВ) или журнале операций обороты продолжают отображаться. Проанализируем физические и программные причины такого поведения файловых баз и разберем по шагам действенные методы исправления проблемы.
Для понимания причин сбоя рассмотрим архитектуру хранения бухгалтерских проводок и итогов в файловой базе DBF:
1SENTRY.DBF, связанных с операциями документов из 1SOPER.DBF. В то же время Оборотно-сальдовая ведомость за рассчитанные периоды обращается к предрассчитанным таблицам периодических итогов: 1SBKTTL.DBF (остатки и обороты по счетам) и 1SBKTTLC.DBF (итоги по субконто). При сетевом сбое или аварийном завершении работы транзакция отмены проведения может стереть запись из 1SENTRY.DBF, но оставить остаток в таблицах итогов.ОбработкаУдаленияПроведения(), проводки останутся в базе.СоздатьОбъект("Операция") без привязки к конкретному документу через Контекст.Операция, связь между документом и проводкой в поле DOCID нарушается. Штатный механизм платформы при отмене проведения просто «не видит» чужие проводки.*.CDX, что приводит к некорректной выборке и зависанию остатков.Если штатный пересчет итогов в режиме «Предприятие» не помогает, необходимо пересоздать поврежденные файлы остатков с нуля. Разберем этот процесс по шагам:
1SBKTTL.DBF — таблица остатков и оборотов по счетам;1SBKTTLC.DBF — таблица итогов по объектам аналитики (субконто);*.CDX.Важно: Сами таблицы проводок 1SENTRY.DBF и операций 1SOPER.DBF удалять нельзя, так как именно в них хранятся первичные бухгалтерские записи.
Механизм полной выгрузки данных платформы позволяет очистить базу от помеченных на удаление записей внутри DBF (сделать физическую упаковку таблиц) и устранить логические расхождения:
1Cv7.MD (и файлы словарей 1Cv7.DD, если они есть).Если в самописной конфигурации движения создавались нестандартным кодом, в базе могут остаться операции, не привязанные ни к одному проведенному документу. Рассмотрим пример обработки, которая находит такие операции и удаляет их:
Процедура ОчиститьЗависшиеПроводки()
Перем Опер, Док;
Опер = СоздатьОбъект("Операция");
Док = СоздатьОбъект("Документ");
Опер.ВыбратьОперации();
Пока Опер.ПолучитьОперацию() = 1 Цикл
// Проверяем наличие привязанного документа
Если ПустоеЗначение(Опер.Документ) = 0 Тогда
Если Док.НайтиДокумент(Опер.Документ) = 1 Тогда
// Если документ найден, но снят с проведения, а проводки активны
Если (Док.Проведен() = 0) И (Опер.КоличествоПроводок() > 0) Тогда
Сообщить("Удаление зависшей операции непроведенного документа: " + Строка(Док.ТекущийДокумент()));
Опер.Удалить();
КонецЕсли;
Иначе
// Документ физически удален, а операция осталась
Сообщить("Удаление операции несуществующего документа: " + Строка(Опер.Документ));
Опер.Удалить();
КонецЕсли;
КонецЕсли;
КонецЦикла;
Сообщить("Обработка завершена. Требуется полный пересчет итогов!");
КонецПроцедуры
Для стабильной работы базы объемом более 1 Гб рекомендуется принять системные меры:
*, но продолжают занимать место в файлах. Периодически выполняйте удаление помеченных объектов и выгрузку/загрузку данных для сжатия таблиц.