Как устранить зависание обмена в 1С 7.7 УРБД после изменения длины номера документа

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

Работа с распределенными информационными базами (УРБД) в версии 1С 7.7 требует особого внимания к изменениям структуры метаданных. Типичная ситуация: программист увеличивает длину номера входящего документа (например, в «Поступлении ТМЦ»), после чего стандартная выгрузка в периферийную базу начинает «висеть» часами или даже днями. В этой статье мы подробно разберем, почему это происходит и как восстановить работоспособность системы, не дожидаясь бесконечного завершения процесса.

Почему зависает обмен при изменении метаданных?

Проанализируем причину возникновения проблемы. Когда в центральной базе (ЦБ) меняется длина реквизита, система УРБД воспринимает это как глобальное изменение конфигурации. При первой же попытке обмена 1С выполняет две тяжелые операции:

  1. Формирование файла метаданных: Система пытается упаковать обновленный файл 1cv7.md в пакет обмена. В 1С 7.7 этот процесс однопоточный и крайне медленный, особенно при использовании больших конфигураций.
  2. Массовая перерегистрация объектов: Изменение структуры поля часто приводит к тому, что система помечает абсолютно все документы данного вида (в нашем случае ПоступлениеТМЦ) как измененные для всех периферийных узлов. Если в базе накоплены сотни тысяч накладных за несколько лет, таблица регистрации изменений разрастается до колоссальных размеров.

Рассмотрим по шагам основные методы решения этой проблемы.

Метод 1. Очистка таблицы регистрации изменений (1CUPDTS)

Если вы понимаете, что данных слишком много и они не обязательны для немедленной передачи, можно «обнулить» очередь выгрузки. Для этого нам нужно поработать с таблицей 1cupdts.dbf (или _1CUPDTS, если используется SQL-версия). Эта таблица хранит список всех объектов, которые должны уйти в периферийные базы.

Рассмотрим алгоритм действий для файловой версии базы:

  1. Обеспечим монопольный доступ к базе (все пользователи должны выйти).
  2. Сделаем резервную копию всей директории базы данных.
  3. Найдем в каталоге базы файл 1cupdts.dbf.
  4. Удалим этот файл (или очистим его содержимое с помощью специализированных утилит для работы с DBF).
  5. При следующем запуске 1С в режиме конфигуратора или предприятия (в зависимости от настроек) индексные файлы будут перестроены.

Важно: После удаления этой таблицы система «забудет» обо всех объектах, которые стояли в очереди на выгрузку. Чтобы актуальные данные все же попали в периферийную базу, после успешного (и теперь уже быстрого) обмена необходимо зайти в центральную базу и перепровести (или просто перезаписать) последние документы. Это создаст новые записи в 1cupdts.dbf только для нужных нам объектов.

Для SQL-версии процедура проще и не требует удаления файлов. Достаточно выполнить SQL-запрос:

TRUNCATE TABLE _1CUPDTS;

Метод 2. Деинициализация и ручная синхронизация метаданных

Этот метод считается наиболее «чистым» и надежным, так как он исключает попытку передачи тяжелого файла конфигурации через пакеты обмена. Мы вручную приведем структуру периферийной базы (ПБ) к виду центральной базы.

Разберем последовательность действий:

  1. Деинициализация ПБ: Нам нужно превратить периферийную базу в «обычную» (автономную). Для этого в каталоге ПБ удаляем файлы:
    • 1sdbset.dbf (настройки распределенной базы);
    • 1sdwnlds.dbf (информация о загруженных пакетах);
    • 1cupdts.dbf (регистрация изменений).
  2. Обновление конфигурации ПБ: Теперь база открывается как обычная. Мы заходим в конфигуратор ПБ и вручную меняем длину номера документа ПоступлениеТМЦ точно так же, как это было сделано в ЦБ. Сохраняем изменения.
  3. Синхронизация MD-файла: Для полной уверенности копируем файл 1cv7.md из центральной базы и заменяем им файл в периферийной базе.
  4. Повторная инициализация: Возвращаем базе статус периферийной. Это можно сделать с помощью специальных обработок (например, DistManage.ert) или путем восстановления файлов настроек, если вы знаете, как правильно прописать в них идентификаторы узлов.
  5. Сброс счетчика изменений метаданных: Чтобы ЦБ не пыталась снова отправить MD-файл, нужно синхронизировать значения версии конфигурации в таблице 1SSYSTEM.

Выясним причину, по которой 1С понимает, что конфигурации различаются. Это происходит из-за несовпадения счетчиков в поле CURCONFIG таблицы 1SSYSTEM. Если в обеих базах установить одинаковое значение в этом поле, система решит, что обновления не требуются.

Метод 3. Трюк с подменой MD и обнулением регистрации

Если вы не хотите деинициализировать базу, можно попытаться «обмануть» механизм проверки конфигураций. Проанализируем этот сценарий:

  1. В центральной базе выполняем выгрузку, но в настройках обмена (если используются внешние обработки) отключаем выгрузку данных, оставляя только «Изменения конфигурации».
  2. Если база все равно зависает, принудительно завершаем процесс 1С.
  3. Копируем 1cv7.md из ЦБ в ПБ вручную.
  4. В центральной базе очищаем регистрацию изменений метаданных. В 1С 7.7 метаданные регистрируются в той же таблице 1cupdts.dbf, но имеют специфический тип объекта (обычно это запись с пустым ID или специфическим кодом типа).
  5. Самый простой способ «протолкнуть» обмен — использовать утилиту Urbeditor. Она позволяет открыть файл выгрузки (пакет .zip или .cab) и вручную удалить из него секцию с метаданными или отредактировать заголовок пакета, указав, что конфигурация уже соответствует актуальной версии.

Использование программных средств для управления регистрацией

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


// Пример логики для удаления регистрации конкретного типа документа
Процедура ОчиститьРегистрациюПоТипу(ИмяДокумента)
    // В 1С 7.7 нет встроенного метода удаления из регистрации по типу
    // Поэтому обычно используются внешние компоненты или прямой доступ к DBF
    ДБФ = СоздатьОбъект("XBase");
    ДБФ.ОткрытьФайл(КаталогИБ() + "1cupdts.dbf");
    ДБФ.ВыбратьЗаписи();
    Пока ДБФ.Следующая() = 1 Цикл
        // TYPE - это внутренний ID типа метаданных
        Если ДБФ.TYPE = НужныйТип Тогда
            ДБФ.Удалить();
        КонецЕсли;
    КонецЦикла;
    ДБФ.Сжать();
    ДБФ.ЗакрытьФайл();
КонецПроцедуры

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

Рекомендации по профилактике зависаний

Чтобы избежать подобных ситуаций в будущем, придерживайтесь следующих правил:

Подведем итог: если вы столкнулись с тем, что после изменения длины номера обмен «ушел в себя», не ждите чуда. Скорее всего, система пытается обработать сотни тысяч записей. Оптимальным решением будет либо очистка 1cupdts.dbf с последующим перепроведением только нужных документов, либо полная деинициализация периферийной базы с ручным обновлением MD-файла.

← На главную