Как реализовать классификацию контрагентов по сроку долга в 1С без изменения конфигурации

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

Довольно часто перед разработчиком встает задача визуального выделения контрагентов в списке в зависимости от глубины их задолженности. Например, если долг висит более 30 дней, контрагент должен быть «красным», если менее — «желтым». Сложность задачи возрастает, когда конфигурация находится на поддержке и вносить изменения непосредственно в код форм или метаданные нельзя. В данной статье мы разберем, как элегантно решить эту задачу, используя штатные механизмы 1С и внешние инструменты.

Архитектура решения: используем свойства объектов

Поскольку мы не можем добавлять новые реквизиты в справочник Контрагенты, воспользуемся универсальным механизмом дополнительных свойств. В типовых решениях (таких как УТ 10.3) для этого предназначен регистр сведений ЗначенияСвойствОбъектов. Наша стратегия будет заключаться в следующем:

  1. Создадим в плане видов характеристик СвойстваОбъектов новое свойство под названием «Статус задолженности» (или «Цвет»).
  2. Разработаем внешнюю обработку, которая будет рассчитывать максимальный срок задолженности по каждому контрагенту.
  3. Результат расчета обработка будет записывать в регистр ЗначенияСвойствОбъектов.
  4. Настроим регламентное задание для автоматического запуска этой обработки.

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

Разбор логики запроса: поиск максимальной просрочки

Основная проблема, с которой сталкиваются разработчики при написании запроса, — это наличие у контрагента нескольких договоров или расчетных документов. Если просто выбрать данные, мы получим несколько строк по одному клиенту. Нам же нужно определить «самый старый» долг.

Рассмотрим пример неправильного подхода, когда используется ВЫБРАТЬ ПЕРВЫЕ 1. Такой запрос вернет всего одну запись из всей базы, а не по каждому контрагенту. Проанализируем правильный подход с использованием агрегатных функций и группировки.

Для получения актуальной задолженности в разрезе сроков нам необходимо обратиться к регистру накопления ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов. Если в вашей базе учет по документам расчетов не ведется, срок будет определить крайне сложно, так как система не будет знать дату возникновения конкретного долга.

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


ВЫБРАТЬ
    Взаиморасчеты.ДоговорКонтрагента.Владелец КАК Контрагент,
    МАКСИМУМ(РАЗНОСТЬДАТ(Взаиморасчеты.ДокументРасчета.Дата, &ТекущаяДата, ДЕНЬ)) КАК ДнейПросрочки
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки(&ТекущаяДата, ) КАК Взаиморасчеты
ГДЕ
    Взаиморасчеты.СуммаВзаиморасчетовОстаток > 0
СГРУППИРОВАТЬ ПО
    Взаиморасчеты.ДоговорКонтрагента.Владелец

В данном запросе мы используем функцию МАКСИМУМ для поля, вычисляющего разницу в днях между датой документа и текущей датой. Группировка по полю Контрагент позволяет нам схлопнуть все документы расчетов и получить одну строку на каждого дебитора с указанием его самого старого долга.

Автоматизация процесса: внешняя обработка и регламентное задание

Чтобы данные в регистре сведений всегда были актуальными, нам нужно автоматизировать процесс записи. Рассмотрим алгоритм, который следует реализовать во внешней обработке:

  1. Получение данных: Выполняем описанный выше запрос.
  2. Обход выборки: Для каждого контрагента определяем, к какой категории он относится (например, более 30 дней — статус «Красный»).
  3. Запись в регистр: Используем менеджер записи или набор записей для записи в ЗначенияСвойствОбъектов.

Проанализируем пример кода для записи значения свойства:


// Предположим, Выборка - это результат выполнения запроса
Пока Выборка.Следующий() Цикл
    МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Объект = Выборка.Контрагент;
    МенеджерЗаписи.Свойство = СсылкаНаСвойствоЦвет; // Предварительно найденная ссылка
    
    Если Выборка.ДнейПросрочки > 30 Тогда
        МенеджерЗаписи.Значение = ЗначениеКрасный;
    ИначеЕсли Выборка.ДнейПросрочки > 0 Тогда
        МенеджерЗаписи.Значение = ЗначениеЖелтый;
    КонецЕсли;
    
    МенеджерЗаписи.Записать(Истина);
КонецЦикла;

Совет по оптимизации: Чтобы не перегружать систему постоянными записями, перед вызовом метода Записать() рекомендуется проверить, не совпадает ли текущее значение в регистре с тем, которое мы собираемся записать. Если они идентичны, запись можно пропустить.

Как запустить это без изменения конфигурации?

Выясним, как заставить этот код работать по расписанию, если мы не можем добавить регламентное задание в дерево метаданных. Рассмотрим два способа:

Способ 1: Использование внешней консоли заданий. Во многих типовых решениях или в составе инструментов разработчика есть возможность подключить внешнюю обработку как регламентное задание. В УТ 10.3 можно воспользоваться справочником ДополнительныеВнешниеОбработки, если в вашей версии реализован механизм их запуска по расписанию (в некоторых доработках это встречается).

Способ 2: Запуск через параметры командной строки. Можно настроить запуск отдельного сеанса 1С через планировщик Windows с параметрами /Execute, где указать путь к нашей обработке. В самой обработке в процедуре ПриОткрытии (или в модуле объекта для управляемых форм) прописать логику выполнения и автоматического закрытия сеанса после завершения работы.

Визуализация результата для пользователей

После того как данные начали попадать в регистр, нам нужно показать их пользователям. В обычных формах (УТ 10.3) это делается следующим образом:

  1. Открываем список контрагентов.
  2. Нажимаем правую кнопку мыши в любом месте списка — Настройка списка.
  3. В колонке «Доступные поля» ищем наше свойство. Обычно оно отображается в иерархии свойств объекта.
  4. Переносим его в правую колонку «Выбранные поля».

Теперь менеджеры будут видеть актуальный цветовой статус (текстом или значением из перечисления свойств) прямо в списке, что позволит им быстро ориентироваться в состоянии дебиторской задолженности. Этот метод полностью безопасен для обновлений конфигурации и не требует участия программиста при каждом изменении состава свойств.

← На главную