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

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

При автоматизации бизнес-процессов часто возникает задача классификации клиентуры: например, установить контрагенту статус «Постоянный», если совокупная сумма оплат от него превысила 100 000 рублей, и оставить статус «Разовый» по умолчанию. Рассмотрим, как правильно реализовать эту логику в конфигурации «Управление торговлей» редакции 10.3, избежав типовых ошибок начинающих разработчиков.

Анализ архитектурных ошибок: почему нельзя менять справочник при проведении ПКО

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

  1. Разнообразие документов поступления: Оплата от покупателя может приходить не только через кассу. В системе используются документы ПлатежноеПоручениеВходящее, ПлатежныйОрдерПоступлениеДенежныхСредств, а также зачеты авансов через КорректировкаДолга. Если привязаться только к кассовым ордерам, расчет совокупных оплат будет некорректным.
  2. Блокировки и транзакции: Изменение объекта справочника Контрагенты внутри транзакции проведения документа приводит к блокировке элемента. Если параллельно другой пользователь открывает карточку этого контрагента или проводит по нему документ, возникают ожидания и ошибки блокировок.
  3. Сброс кэша: Запись объекта справочника во время проведения документов сбрасывает кэш данных справочника у остальных пользователей, создавая повышенную нагрузку на систему.
  4. Отмена проведения: При распроведении или удалении платежного документа сумма оплат может снизиться ниже установленного порога. Реализация логики в проведении потребует также сложной обработки события отмены проведения.

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

Наиболее надежный и производительный способ — расчёт накопительных сумм и обновление статусов с помощью регламентного задания, запускаемого во внерабочее время (например, ночью) или с заданной периодичностью.

Рассмотрим алгоритм работы регламентного задания по шагам:

  1. Выполняем запрос к регистру накопления ВзаиморасчетыСКонтрагентами для получения сумм поступивших оплат по контрагентам со статусом «Разовый».
  2. Проверяем условие превышения порога (например, 100 000 рублей).
  3. Меняем значение реквизита СтатусКонтрагента на «Постоянный» и записываем элемент.

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


Процедура ОбновитьСтатусыКонтрагентов() Экспорт

    УстановитьПривилегированныйРежим(Истина);

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Взаиморасчеты.Контрагент КАК Контрагент,
        |	СУММА(Взаиморасчеты.СуммаВзаиморасчетовКредит) КАК СуммаОплат
        |ИЗ
        |	РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(, , Авто, Контрагент.СтатусКонтрагента = Значение(Перечисление.СтатусыКонтрагентов.Разовый)) КАК Взаиморасчеты
        |СГРУППИРОВАТЬ ПО
        |	Взаиморасчеты.Контрагент
        |ИМЕЮЩИЕ
        |	СУММА(Взаиморасчеты.СуммаВзаиморасчетовКредит) >= 100000";

    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетали = РезультатЗапроса.Выбрать();

    Пока ВыборкаДетали.Следующий() Цикл
        ОбъектКонтрагент = ВыборкаДетали.Контрагент.ПолучитьОбъект();
        Если ОбъектКонтрагент <> Неопределено Тогда
            ОбъектКонтрагент.СтатусКонтрагента = Перечисления.СтатусыКонтрагентов.Постоянный;
            Попытка
                ОбъектКонтрагент.Записать();
            Исключение
                ЗаписьЖурналаРегистрации("Обновление статуса контрагента",
                    УровеньЖурналаРегистрации.Ошибка,
                    ,
                    ,
                    ОписаниеОшибки());
            КонецПопытки;
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры

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

Оптимальный подход 2: Подписка на событие проведения

Если бизнес-требования требуют мгновенного изменения статуса сразу после проведения платежного документа, следует использовать механизмы платформы — подписку на событие.

Разберем порядок настройки этого варианта:

  1. В конфигураторе создается ПодпискаНаСобытие.
  2. В качестве источника указываются документы-регистраторы регистра ВзаиморасчетыСКонтрагентами (например, ПриходныйКассовыйОрдер, ПлатежноеПоручениеВходящее и др.).
  3. Событие подписки — ОбработкаПроведения.
  4. В обработчике события выполняется запрос к оборотам регистра с фильтрацией по текущему контрагенту. Если совокупный кредит превышает 100 000 рублей, статусу присваивается значение Постоянный.

При таком подходе мы обращаемся к фактическим движениям в регистре накопления, а не к табличным частям конкретных документов, что обеспечивает корректность расчетов при любом источнике поступления средств.

Резюме

Для реализации логики смены статуса контрагента в УТ 10.3 рекомендуем:

1. Брать данные о поступивших оплатах из регистра накопления ВзаиморасчетыСКонтрагентами (обороты по кредиту), а не из отдельных документов оплат.

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

← На главную