Как организовать автоматическое проведение документов при обмене данными в 1С:Управление торговлей 10.3?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В процессе эксплуатации распределенных информационных баз (РИБ) на платформе 1С:Предприятие 8.3 (особенно в старых редакциях, таких как Управление торговлей 10.3) администраторы часто сталкиваются с последствиями свертки базы данных. Одной из наиболее острых проблем является появление «битых ссылок» (объект не найден) в регистре накопления ПартииТоваровНаСкладах. Это происходит, когда документы-основания партий удаляются в процессе свертки в центральной базе, но информация о них продолжает мигрировать из подчиненных узлов, где свертка не проводилась или была выполнена некорректно.

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

Вариант 1: Использование подписки на событие ПриЗаписи

Проанализируем самый оперативный метод решения — создание подписки на событие ПриЗаписи для всех документов, которые формируют движения по партиям. Идея заключается в том, чтобы перехватить момент записи объекта при загрузке из обмена и принудительно вызвать метод Записать(РежимЗаписиДокумента.Проведение).

Рассмотрим пример кода, который можно разместить в общем модуле. Обратите внимание на использование свойства ОбменДанными.Загрузка. Обычно при значении Истина программный код в модулях объектов блокируется, чтобы данные записались «как есть». Нам же нужно обойти это ограничение для проведения.


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

Важный нюанс: использование конструкции Попытка...Исключение в данном случае обязательно. Если документ не сможет провестись (например, из-за отрицательных остатков), транзакция обмена не должна прерываться, но администратор должен получить уведомление через журнал регистрации.

Вариант 2: Отложенное проведение через регламентное задание

Если в вашей сети более 10-15 магазинов и объем документов велик, проведение каждого документа в момент обмена может критически замедлить процесс загрузки и вызвать блокировки в базе данных. Выясним, как сделать этот процесс более «мягким» для системы.

Вместо немедленного проведения в подписке, мы можем регистрировать ссылки на документы в специальном вспомогательном регистре сведений или использовать стандартный механизм последовательностей. Затем создадим Регламентное задание, которое будет запускаться в периоды минимальной нагрузки (например, ночью или каждые 2 часа).

Алгоритм работы регламентного задания:

  1. Выбрать документы, загруженные из филиалов за последний период.
  2. Проверить состояние их движений в регистре ПартииТоваровНаСкладах.
  3. Если обнаружены битые ссылки, выполнить программное перепроведение.
  4. Восстановить Последовательность партионного учета, так как в УТ 10.3 правильное списание партий зависит от хронологии документов в последовательности.

Вариант 3: Настройка правил миграции данных

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

Для этого в плане обмена (или в правилах конвертации данных, если они используются) необходимо исключить регистр ПартииТоваровНаСкладах из состава обмена для направления «Филиал -> Центр». Это гарантирует, что старые битые ссылки из филиалов никогда не попадут в центральную базу.

Рекомендации по восстановлению последовательности

Просто перепровести документы недостаточно для корректного учета. В конфигурации Управление торговлей 10.3 партионный учет работает корректно только тогда, когда граница последовательности установлена на актуальный момент. После массового проведения документов в ходе обмена, обязательно запустите обработку «Проведение документов по партиям» (меню «Операции» — «Проведение документов»).

Посмотрим на ключевые рекомендации при выполнении этих работ:

  1. Создайте резервную копию: Любые манипуляции с проведением в режиме загрузки могут изменить финансовые показатели.
  2. Проверьте настройки учетной политики: Убедитесь, что в центре включено «Списывать партии при проведении документов».
  3. Очистка в узлах: Если есть возможность, запустите в филиалах внешнюю обработку по очистке битых ссылок в регистрах. Это можно сделать через НаборЗаписей регистра с отбором по регистратору.

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

← На главную