В процессе эксплуатации распределенных информационных баз (РИБ) на платформе 1С:Предприятие 8.3 (особенно в старых редакциях, таких как Управление торговлей 10.3) администраторы часто сталкиваются с последствиями свертки базы данных. Одной из наиболее острых проблем является появление «битых ссылок» (объект не найден) в регистре накопления ПартииТоваровНаСкладах. Это происходит, когда документы-основания партий удаляются в процессе свертки в центральной базе, но информация о них продолжает мигрировать из подчиненных узлов, где свертка не проводилась или была выполнена некорректно.
Разберем ситуацию подробно: в центральном узле (ЦБ) партионный учет необходим для расчета себестоимости, а в розничных точках (филиалах) он может не вестись. Однако при обмене «мусорные» записи из филиалов возвращаются в центр, создавая хаос в отчетах. Проанализируем, как можно автоматизировать исправление этой ситуации через программное проведение документов непосредственно в момент загрузки данных.
Проанализируем самый оперативный метод решения — создание подписки на событие ПриЗаписи для всех документов, которые формируют движения по партиям. Идея заключается в том, чтобы перехватить момент записи объекта при загрузке из обмена и принудительно вызвать метод Записать(РежимЗаписиДокумента.Проведение).
Рассмотрим пример кода, который можно разместить в общем модуле. Обратите внимание на использование свойства ОбменДанными.Загрузка. Обычно при значении Истина программный код в модулях объектов блокируется, чтобы данные записались «как есть». Нам же нужно обойти это ограничение для проведения.
Процедура _ПроведениеПриЗаписи(Источник, Отказ) Экспорт
// Проверяем, что запись происходит в режиме загрузки данных из другого узла
Если Источник.ОбменДанными.Загрузка Тогда
// Проверяем, что отправитель не является главным узлом (данные идут из филиалов)
// И документ уже был проведен ранее (нам не нужно проводить черновики)
Если НЕ Источник.ОбменДанными.Отправитель.Главный
И ЗначениеЗаполнено(Источник.Ссылка)
И Источник.Ссылка.Проведен Тогда
Попытка
// Создаем объект для проведения, чтобы не конфликтовать с текущим Источником
ОбъектДок = Источник.Ссылка.ПолучитьОбъект();
// Отключаем автозаполнение получателей, чтобы не зациклить обмен
ОбъектДок.ОбменДанными.Получатели.АвтоЗаполнение = Ложь;
// Выполняем проведение
ОбъектДок.Записать(РежимЗаписиДокумента.Проведение);
Исключение
// Важно логировать ошибки, чтобы понимать, почему документ не провелся
ЗаписьЖурналаРегистрации("ОбменДанными.Проведение",
УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка проведения документа " + Источник.Ссылка + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важный нюанс: использование конструкции Попытка...Исключение в данном случае обязательно. Если документ не сможет провестись (например, из-за отрицательных остатков), транзакция обмена не должна прерываться, но администратор должен получить уведомление через журнал регистрации.
Если в вашей сети более 10-15 магазинов и объем документов велик, проведение каждого документа в момент обмена может критически замедлить процесс загрузки и вызвать блокировки в базе данных. Выясним, как сделать этот процесс более «мягким» для системы.
Вместо немедленного проведения в подписке, мы можем регистрировать ссылки на документы в специальном вспомогательном регистре сведений или использовать стандартный механизм последовательностей. Затем создадим Регламентное задание, которое будет запускаться в периоды минимальной нагрузки (например, ночью или каждые 2 часа).
Алгоритм работы регламентного задания:
ПартииТоваровНаСкладах.Рассмотрим более радикальный, но эффективный способ предотвращения проблемы. Если в магазинах партионный учет действительно не нужен, мы можем запретить передачу движений (регистров накопления) из подчиненных узлов в центральную базу. В этом случае в центр будут прилетать только «голые» документы, а движения по партиям будут формироваться в центре автоматически при первой записи документа.
Для этого в плане обмена (или в правилах конвертации данных, если они используются) необходимо исключить регистр ПартииТоваровНаСкладах из состава обмена для направления «Филиал -> Центр». Это гарантирует, что старые битые ссылки из филиалов никогда не попадут в центральную базу.
Просто перепровести документы недостаточно для корректного учета. В конфигурации Управление торговлей 10.3 партионный учет работает корректно только тогда, когда граница последовательности установлена на актуальный момент. После массового проведения документов в ходе обмена, обязательно запустите обработку «Проведение документов по партиям» (меню «Операции» — «Проведение документов»).
Посмотрим на ключевые рекомендации при выполнении этих работ:
НаборЗаписей регистра с отбором по регистратору.Подведем итог: использование подписки на событие — это быстрый и эффективный способ «здесь и сейчас», но для долгосрочной стабильности системы лучше настроить фильтрацию миграции движений регистров в плане обмена. Это избавит центральную базу от лишнего «информационного мусора» и позволит системе самостоятельно генерировать чистые данные.