Почему в 1С 7.7 дублируются товары в накладной при правильных движениях в регистрах?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

Ситуация, когда в печатной форме или в экранной табличной части документа 1С 7.7 отображаются дублирующиеся строки (например, один и тот же товар с одинаковой или разной ценой), в то время как в регистрах накопления (движениях документа) зафиксированы совершенно другие, правильные данные, является серьезным техническим сбоем. Рассмотрим подробно, почему это происходит, как диагностировать причину и какими методами можно восстановить целостность базы данных.

Проанализируем природу проблемы: расхождение ТЧ и регистров

В системе 1С:Предприятие 7.7 данные документа хранятся в нескольких связанных таблицах формата DBF. Шапка документа находится в файле DH* (или _1SJOURN для общих реквизитов), а табличная часть — в файле DT*. Движения по регистрам хранятся в отдельных таблицах RA*. В штатном режиме работы 1С гарантирует транзакционную целостность: при проведении документа данные из табличной части считываются и записываются в регистры.

Однако, если мы сталкиваемся с ситуацией, когда в DT* (табличная часть) записан "мусор" или дубли, а в RA* (регистры) — корректные данные, это означает, что запись в эти таблицы происходила раздельно или была нарушена логика работы движка базы данных. Выясним основные причины такого поведения:

  1. Программная модификация объекта: Использование внешних обработок или систем синхронизации (например, "Моби-С", "Агент Плюс"), которые записывают данные в документ методом Записать(), но не выполняют перепроведение.
  2. Прямая запись в таблицы DBF: Некоторые низкоуровневые утилиты могут изменять содержимое файлов DT*, минуя объектную модель 1С, что приводит к рассинхронизации с итогами.
  3. Повреждение индексов: Сбой в файлах .CDX может привести к тому, что при чтении строк документа система "зацикливается" на одной и той же записи, отображая её несколько раз.
  4. Раздувание файла конфигурации (1cv7.MD): Аномально большой размер MD-файла (свыше 50-70 Мб) часто вызывает ошибки кэширования метаданных, из-за чего система начинает некорректно интерпретировать структуру таблиц.

Шаг 1: Диагностика размера метаданных и физической целостности

Прежде всего, обратим внимание на технические параметры базы. В ходе обсуждения было замечено, что файл 1cv7.MD весит 77 Мб, а в некоторых случаях достигает 150 Мб. Для типовой конфигурации "Торговля и склад" нормальный вес составляет 10–25 Мб. Проанализируем, почему это важно.

При каждом обращении к документу 1С считывает описание его структуры из MD-файла. Если файл перегружен внедренными картинками, огромными программными модулями или "мусорными" объектами от внешних интеграций, оперативной памяти может не хватать для корректного построения индексов в памяти. Это и порождает фантомные дубли.

Рекомендация: Для оптимизации MD-файла необходимо использовать утилиту GComp. Разберем этот процесс по шагам:

  1. Выгружаем структуру MD-файла в текстовые файлы с помощью GComp.
  2. Собираем MD-файл обратно. Это позволяет очистить файл от "битых" внутренних ссылок и неиспользуемых блоков данных.
  3. Проверяем библиотеку картинок — часто внешние системы (такие как "Моби-С") хранят там тяжелые бинарные данные.

Шаг 2: Проверка влияния внешних систем синхронизации

Если вы используете мобильную торговлю, выясним механизм загрузки заказов. Часто внешняя компонента работает следующим образом: она ищет существующий документ и обновляет его табличную часть. Если в коде загрузки допущена ошибка, строки могут не заменяться, а добавляться к уже существующим.

Рассмотрим ситуацию: экспедитор или агент выгрузил данные. Документ записался. Контроль дублей строк (константа Проверять дубли строк) в 1С 7.7 обычно срабатывает только в момент интерактивной записи пользователем или при проведении. Если внешняя обработка просто вызывает метод Записать(), проверка может быть проигнорирована. В итоге в табличной части (ТЧ) появляются дубли, но так как документ не перепроводился, в регистрах остаются старые (правильные) записи.

Шаг 3: Восстановление данных программным способом

Если мы обнаружили, что в регистрах данные верны, а в документе — нет, нам необходимо привести табличную часть в соответствие с движениями. Рассмотрим пример кода обработки, которая поможет решить эту задачу. Логика такова: мы выбираем движения документа по регистру "ОстаткиТМЦ" (или аналогичному), очищаем текущую табличную часть документа и заполняем её заново на основе этих движений.

Проанализируем пример кода для восстановления:


Процедура ВосстановитьТЧИзРегистров(ТекущийДок)
    // Создаем объект для чтения движений
    Рег = СоздатьОбъект("Регистр.ОстаткиТМЦ");
    Рег.ВыбратьДвиженияДокумента(ТекущийДок);
    
    // Блокируем документ от изменений другими пользователями
    ТекущийДок.УдалитьСтроки();
    
    Пока Рег.ПолучитьДвижение() = 1 Цикл
        // Нас интересуют только движения расхода (продажи)
        Если Рег.Приход = 0 Тогда 
            ТекущийДок.НоваяСтрока();
            ТекущийДок.Товар = Рег.Товар;
            ТекущийДок.Количество = Рег.Количество;
            ТекущийДок.Цена = Рег.Цена; // Если цена есть в регистре
            // Добавьте остальные реквизиты, которые хранятся в движениях
        КонецЕсли;
    КонецЦикла;
    
    // Записываем документ без перепроведения, чтобы не испортить регистры
    ТекущийДок.Записать();
    Сообщить("Документ " + ТекущийДок + " успешно восстановлен.");
КонецПроцедуры

Важно: Перед запуском подобных обработок обязательно создайте резервную копию базы данных! Данный метод применим только в том случае, если вы абсолютно уверены, что движения в регистрах являются первоисточником истины.

Шаг 4: Устранение проблемы "Нового года" и индексов

Если проблема начала массово проявляться с начала нового календарного года, это может указывать на сбой в нумерации строк или превышение лимитов идентификаторов в файлах ТЧ. В 1С 7.7 каждая строка документа имеет скрытый идентификатор LINENO. При некорректной работе внешних обработок записи данных этот индекс может двоиться.

Разберем, как это лечится физически:

  1. Завершите работу всех пользователей.
  2. Удалите все файлы с расширением .CDX в каталоге базы данных.
  3. Запустите 1С в монопольном режиме — индексы перестроятся автоматически.
  4. Выполните "Тестирование и исправление" (ТиИ) с включенными галочками "Проверка логической целостности" и "Пересчет итогов".

Итоговые рекомендации

Подведем итог нашему исследованию. Если вы столкнулись с дублями в накладных при корректных регистрах, выполните следующие действия:

Во-первых, проверьте настройки внешней системы синхронизации ("Моби-С" или аналоги). Убедитесь, что при загрузке данных происходит полная очистка старых строк документа перед добавлением новых. Проверьте, не дублируются ли позиции в самом мобильном устройстве агента.

Во-вторых, обратите внимание на размер MD-файла. Если он аномально велик, выполните процедуру "сжатия" через GComp или удалите лишние ресурсы (картинки, неиспользуемые формы). Это вернет системе стабильность при работе с метаданными.

В-третьих, используйте программные обработки для синхронизации ТЧ с регистрами только в критических случаях. Помните, что штатная работа 1С подразумевает движение "от документа к регистру", а не наоборот. Нарушение этой логики — всегда признак внешнего вмешательства или серьезного повреждения структуры БД.

← На главную