Ситуация, когда в печатной форме или в экранной табличной части документа 1С 7.7 отображаются дублирующиеся строки (например, один и тот же товар с одинаковой или разной ценой), в то время как в регистрах накопления (движениях документа) зафиксированы совершенно другие, правильные данные, является серьезным техническим сбоем. Рассмотрим подробно, почему это происходит, как диагностировать причину и какими методами можно восстановить целостность базы данных.
В системе 1С:Предприятие 7.7 данные документа хранятся в нескольких связанных таблицах формата DBF. Шапка документа находится в файле DH* (или _1SJOURN для общих реквизитов), а табличная часть — в файле DT*. Движения по регистрам хранятся в отдельных таблицах RA*. В штатном режиме работы 1С гарантирует транзакционную целостность: при проведении документа данные из табличной части считываются и записываются в регистры.
Однако, если мы сталкиваемся с ситуацией, когда в DT* (табличная часть) записан "мусор" или дубли, а в RA* (регистры) — корректные данные, это означает, что запись в эти таблицы происходила раздельно или была нарушена логика работы движка базы данных. Выясним основные причины такого поведения:
Записать(), но не выполняют перепроведение.DT*, минуя объектную модель 1С, что приводит к рассинхронизации с итогами..CDX может привести к тому, что при чтении строк документа система "зацикливается" на одной и той же записи, отображая её несколько раз.Прежде всего, обратим внимание на технические параметры базы. В ходе обсуждения было замечено, что файл 1cv7.MD весит 77 Мб, а в некоторых случаях достигает 150 Мб. Для типовой конфигурации "Торговля и склад" нормальный вес составляет 10–25 Мб. Проанализируем, почему это важно.
При каждом обращении к документу 1С считывает описание его структуры из MD-файла. Если файл перегружен внедренными картинками, огромными программными модулями или "мусорными" объектами от внешних интеграций, оперативной памяти может не хватать для корректного построения индексов в памяти. Это и порождает фантомные дубли.
Рекомендация: Для оптимизации MD-файла необходимо использовать утилиту GComp. Разберем этот процесс по шагам:
Если вы используете мобильную торговлю, выясним механизм загрузки заказов. Часто внешняя компонента работает следующим образом: она ищет существующий документ и обновляет его табличную часть. Если в коде загрузки допущена ошибка, строки могут не заменяться, а добавляться к уже существующим.
Рассмотрим ситуацию: экспедитор или агент выгрузил данные. Документ записался. Контроль дублей строк (константа Проверять дубли строк) в 1С 7.7 обычно срабатывает только в момент интерактивной записи пользователем или при проведении. Если внешняя обработка просто вызывает метод Записать(), проверка может быть проигнорирована. В итоге в табличной части (ТЧ) появляются дубли, но так как документ не перепроводился, в регистрах остаются старые (правильные) записи.
Если мы обнаружили, что в регистрах данные верны, а в документе — нет, нам необходимо привести табличную часть в соответствие с движениями. Рассмотрим пример кода обработки, которая поможет решить эту задачу. Логика такова: мы выбираем движения документа по регистру "ОстаткиТМЦ" (или аналогичному), очищаем текущую табличную часть документа и заполняем её заново на основе этих движений.
Проанализируем пример кода для восстановления:
Процедура ВосстановитьТЧИзРегистров(ТекущийДок)
// Создаем объект для чтения движений
Рег = СоздатьОбъект("Регистр.ОстаткиТМЦ");
Рег.ВыбратьДвиженияДокумента(ТекущийДок);
// Блокируем документ от изменений другими пользователями
ТекущийДок.УдалитьСтроки();
Пока Рег.ПолучитьДвижение() = 1 Цикл
// Нас интересуют только движения расхода (продажи)
Если Рег.Приход = 0 Тогда
ТекущийДок.НоваяСтрока();
ТекущийДок.Товар = Рег.Товар;
ТекущийДок.Количество = Рег.Количество;
ТекущийДок.Цена = Рег.Цена; // Если цена есть в регистре
// Добавьте остальные реквизиты, которые хранятся в движениях
КонецЕсли;
КонецЦикла;
// Записываем документ без перепроведения, чтобы не испортить регистры
ТекущийДок.Записать();
Сообщить("Документ " + ТекущийДок + " успешно восстановлен.");
КонецПроцедуры
Важно: Перед запуском подобных обработок обязательно создайте резервную копию базы данных! Данный метод применим только в том случае, если вы абсолютно уверены, что движения в регистрах являются первоисточником истины.
Если проблема начала массово проявляться с начала нового календарного года, это может указывать на сбой в нумерации строк или превышение лимитов идентификаторов в файлах ТЧ. В 1С 7.7 каждая строка документа имеет скрытый идентификатор LINENO. При некорректной работе внешних обработок записи данных этот индекс может двоиться.
Разберем, как это лечится физически:
.CDX в каталоге базы данных.Подведем итог нашему исследованию. Если вы столкнулись с дублями в накладных при корректных регистрах, выполните следующие действия:
Во-первых, проверьте настройки внешней системы синхронизации ("Моби-С" или аналоги). Убедитесь, что при загрузке данных происходит полная очистка старых строк документа перед добавлением новых. Проверьте, не дублируются ли позиции в самом мобильном устройстве агента.
Во-вторых, обратите внимание на размер MD-файла. Если он аномально велик, выполните процедуру "сжатия" через GComp или удалите лишние ресурсы (картинки, неиспользуемые формы). Это вернет системе стабильность при работе с метаданными.
В-третьих, используйте программные обработки для синхронизации ТЧ с регистрами только в критических случаях. Помните, что штатная работа 1С подразумевает движение "от документа к регистру", а не наоборот. Нарушение этой логики — всегда признак внешнего вмешательства или серьезного повреждения структуры БД.