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

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

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

Механизм фиксации изменений в УРБД 1С 7.7 и суть проблемы

Проанализируем, как платформа регистрирует изменения объектов:

  1. При любых изменениях справочников, документов, констант или периодических реквизитов платформа делает запись в служебную таблицу регистрации изменений 1SUPDTS (в SQL-версии — _1SUPDTS).
  2. Если для документов или журналов в метаданных установлено свойство миграции «Все информационные базы», перезапись движений регистров при восстановлении границы последовательности автоматически фиксирует каждый перепроведенный документ для передачи во все подчиненные узлы.
  3. В результате повторного проведения сотен тысяч старых документов за много лет таблица 1SUPDTS переполняется записями, а штатная выгрузка превращается в огромный пакет данных, передача и загрузка которого может заблокировать работу периферийных баз.

Почему нельзя просто удалить таблицу 1SUPDTS

Рассмотрим распространенную ошибку: администратор удаляет файл 1SUPDTS.DBF, а затем пытается перепровести документы только за текущий день или месяц, полагая, что этого достаточно для восстановления актуальной очереди обмена.

Главные риски такого подхода:

  1. Потеря новых элементов справочников: В таблице 1SUPDTS регистрируются не только документы, но и элементы справочников (номенклатура, контрагенты, договоры), созданные пользователями. При удалении файла информация об этих объектах безвозвратно стирается из очереди обмена. Перепроведение документов текущего периода не перезапишет справочники, и в периферийной базе появятся «битые» ссылки с представлением «Объект не найден».
  2. Потеря изменений констант и периодических реквизитов: Все изменения цен, курсов валют и настроек также регистрируются в 1SUPDTS и будут утрачены для подчиненных баз.
  3. Рассинхронизация регистров: Если при восстановлении последовательности в центральной базе изменилась себестоимость партий или списания, отказ от передачи движений приведет к расхождению итогов между узлами.

Способ 1. Точечное удаление записей о старых документах из 1SUPDTS

Разберем наиболее безопасный способ очистки очереди. Вместо полной очистки таблицы удалим из 1SUPDTS только те записи, которые относятся к перепроведенным документам за закрытый период (например, 2008–2012 годы), оставив нетронутыми справочники, константы и свежие документы.

Таблица 1SUPDTS связывается с журналом документов 1SJOURN по ключевому полю: колонка OBJID в таблице изменений соответствует идентификатору документа IDDOC в журнале документов. Поле DATE_TIME_IDDOC в 1SJOURN содержит дату документа.

Для SQL-версии базы данных выполним целевой запрос на удаление строк:


DELETE FROM _1SUPDTS
WHERE OBJID IN (
    SELECT IDDOC 
    FROM _1SJOURN 
    WHERE DATE_TIME_IDDOC < '20130101'
)

Для файловой версии (DBF) можно написать внешнюю обработку 1С с использованием объекта XBase:


Процедура ОчиститьОчередьОбмена()
    БД_Изм = СоздатьОбъект("XBase");
    БД_Жур = СоздатьОбъект("XBase");
    
    КаталогИБ = КаталогИБ();
    БД_Изм.ОткрытьФайл(КаталогИБ + "1SUPDTS.DBF", КаталогИБ + "1SUPDTS.CDX");
    БД_Жур.ОткрытьФайл(КаталогИБ + "1SJOURN.DBF", КаталогИБ + "1SJOURN.CDX");
    
    Если (БД_Изм.Открыта() = 0) Или (БД_Жур.Открыта() = 0) Тогда
        Сообщить("Ошибка открытия файлов базы данных!");
        Возврат;
    КонецЕсли;
    
    БД_Изм.Первая();
    Пока БД_Изм.ВКонце() = 0 Цикл
        ИдОбъекта = СокрЛП(БД_Изм.OBJID);
        
        // Проверяем наличие документа в журнале
        Если БД_Жур.НайтиПоКлючу(ИдОбъекта, 0) = 1 Тогда
            ДатаДок = Лев(БД_Жур.DATE_TIME_IDDOC, 8);
            // Если дата документа меньше 2013 года, помечаем запись на удаление
            Если ДатаДок < "20130101" Тогда
                БД_Изм.Удалить();
            КонецЕсли;
        КонецЕсли;
        
        БД_Изм.Следующая();
    КонецЦикла;
    
    БД_Изм.Сжать();
    БД_Изм.ЗакрытьФайл();
    БД_Жур.ЗакрытьФайл();
    
    Сообщить("Очистка очереди завершена успешно.");
КонецПроцедуры

Важно: Перед выполнением прямых операций с файлами DBF или базой SQL обязательно создадим резервную копию базы данных и завершим все пользовательские сеансы. После модификации DBF-файлов необходимо выполнить переиндексацию.

Способ 2. Принудительная рекурсивная регистрация данных текущего периода

Если таблица 1SUPDTS уже была полностью очищена, минимизировать риски появления «битых» ссылок можно с помощью обработки, которая рекурсивно найдет и перезапишет все объекты, на которые ссылаются документы текущего периода.

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

  1. Выбираем все документы за актуальный период (с момента последней успешной синхронизации до текущей даты) с помощью объекта Документ.
  2. Для каждого документа обходим реквизиты шапки и табличной части.
  3. Если реквизит имеет ссылочный тип (например, Справочник.Номенклатура или Справочник.Контрагенты), открываем соответствующий элемент и выполняем его принудительную запись методом Записать(). Это заново создаст запись о справочнике в 1SUPDTS.
  4. Выполняем перепроведение самого документа.

Как предотвратить проблему в будущем

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

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