В практике сопровождения баз 1С:Предприятие 7.7 (в частности конфигурации «Торговля и Склад 9.2») периодически возникает ситуация, когда в отчетах (например, в «Ведомости по остаткам ТМЦ») движения по конкретной накладной или реализации удваиваются. При этом снятие проведения или удаление документа из пользовательского интерфейса удаляет лишь одну строку движений, а вторая остается зафиксированной в регистрах. Повторное проведение документа снова приводит к появлению двух строк движений.
Разберем детально, почему возникает подобный сбой, как правильно локализовать ошибку на уровне таблиц базы данных DBF и восстановить корректный учет движений и итогов.
Для понимания природы ошибки проанализируем внутреннюю архитектуру хранения данных в платформе 1С 7.7 формата DBF:
1SJOURN.DBF, где ему присваивается уникальный буквенно-цифровой идентификатор IDDOC (в 36-ричной системе счисления). Шапка документа хранится в таблице DH<ID>.DBF, а табличная часть — в DT<ID>.DBF.RA<ID>.DBF, где поле IDDOC жестко связывает каждую строчку движения с конкретной записью в 1SJOURN.DBF. Ежемесячные остатки и остатки на Точку Актуальности (ТА) аккумулируются в таблице итогов RG<ID>.DBF.1SSYSTEM.DBF (полями CURRID и MAXID).Основная причина возникновения фантомных дублей заключается в рассинхронизации системных таблиц. Если в распределенной информационной базе (РБД / УРИБ) выполняется ручное копирование файлов таблиц документов (1SJOURN.DBF, DH*.DBF, DT*.DBF, RA*.DBF) из центрального узла в периферийный без переноса системного файла 1SSYSTEM.DBF, генератор идентификаторов периферийной базы оказывается «позади» реального пула существующих записей. В результате программа создает новый документ с тем же номером и ссылочным кодом, что порождает дублирующие записи в 1SJOURN.DBF с разными IDDOC.
Дополнительными факторами могут являться сбои индексных файлов *.CDX при параллельной работе или отключенный контроль уникальности номеров документов в конфигураторе, позволяющий записать два разных документа с одинаковым печатным номером на одну дату.
Перед внесением любых изменений обязательно создадим резервную копию каталога информационной базы. Последовательно проверим состояние журнала и таблиц базы данных:
1SJOURN.DBF с помощью специализированного редактора таблиц (например, DBF Viewer, Sdbf или Advantage Data Architect). Выполним поиск по номеру проблемного документа в поле DOCNO.DOCNO, но разными значениями IDDOC, мы имеем дело с физическим дублированием записей в журнале. При этом в интерфейсе программы один из документов мог быть скрыт или визуально воспринимался как единственный.Рассмотрим варианты исправления ситуации в зависимости от сложности случая.
Если в общем журнале отображаются оба документа-дубля, выполним следующие действия:
Если в базе образовались «зависшие» движения (записи в таблице RA*.DBF, для которых в 1SJOURN.DBF уже нет соответствующего документа), штатное перепроведение не поможет. В этом случае применим следующий порядок действий:
1SBLOB.DBF или структуре метаданных. Таблица движений будет иметь вид RA<ID>.DBF, а итогов — RG<ID>.DBF.RA<ID>.DBF и найдем записи с IDDOC, принадлежащим удаленному или дублирующему документу, после чего физически удалим эти строки (с выполнением операции Pack / сжатия таблицы).RG<ID>.DBF для проблемного регистра.RG*.DBF платформа пересчитает итоги только по данному регистру на основе чистых движений из RA*.DBF.Чтобы исключить повторное возникновение дубликатов при создании новых документов в будущем, скорректируем системный счетчик базы:
1SJOURN.DBF, отсортируем записи по полю IDDOC по убыванию и зафиксируем максимальное существующее значение идентификатора.1SSYSTEM.DBF.CURRID. Если его текущее значение меньше максимального IDDOC из журнала документов, вручную установим в CURRID значение максимального IDDOC с небольшим запасом вперед (в 36-ричном формате представления).Для предотвращения подобных сбоев в распределенных информационных базах 1С 7.7 рекомендуется соблюдать следующие правила:
1SJOURN.DBF, RA*.DBF и соответствующих *.CDX, своевременно выполняя свертку базы или переход на формат SQL.