При работе с распределенными информационными базами (УРБД) в конфигурации «Торговля и Склад» на платформе 1С 7.7 нередко возникает ситуация, когда после восстановления последовательности документов за прошлые периоды размер файла выгрузки для периферийных узлов многократно возрастает. Разберем, как устроен механизм регистрации изменений в 1С 7.7, почему полное удаление файла регистрации опасно и как грамотно очистить очередь обмена от ненужных документов, не нарушив ссылочную целостность базы данных.
Проанализируем, как платформа регистрирует изменения объектов:
1SUPDTS (в SQL-версии — _1SUPDTS).1SUPDTS переполняется записями, а штатная выгрузка превращается в огромный пакет данных, передача и загрузка которого может заблокировать работу периферийных баз.Рассмотрим распространенную ошибку: администратор удаляет файл 1SUPDTS.DBF, а затем пытается перепровести документы только за текущий день или месяц, полагая, что этого достаточно для восстановления актуальной очереди обмена.
Главные риски такого подхода:
1SUPDTS регистрируются не только документы, но и элементы справочников (номенклатура, контрагенты, договоры), созданные пользователями. При удалении файла информация об этих объектах безвозвратно стирается из очереди обмена. Перепроведение документов текущего периода не перезапишет справочники, и в периферийной базе появятся «битые» ссылки с представлением «Объект не найден».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-файлов необходимо выполнить переиндексацию.
Если таблица 1SUPDTS уже была полностью очищена, минимизировать риски появления «битых» ссылок можно с помощью обработки, которая рекурсивно найдет и перезапишет все объекты, на которые ссылаются документы текущего периода.
Разберем алгоритм действий:
Документ.Справочник.Номенклатура или Справочник.Контрагенты), открываем соответствующий элемент и выполняем его принудительную запись методом Записать(). Это заново создаст запись о справочнике в 1SUPDTS.Чтобы избежать подобных инцидентов при регламентных работах, рекомендуем придерживаться следующих правил: