Как настроить автоматическую категоризацию документов в 1С по группе доступа контрагента?

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

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

Анализ проблемы производительности

Многие начинающие разработчики при попытке решить данную задачу совершают распространенную ошибку: они организуют выполнение Запрос внутри цикла Для каждого. Это крайне негативно сказывается на скорости работы системы: если в табличной части документа содержится 100 контрагентов, программа будет обращаться к базе данных 100 раз. Мы же с вами поступим иначе — выполним один запрос к целой таблице данных.

Решение через оптимизированный запрос к табличной части

Наиболее правильный путь — выгрузить данные из табличной части в ТаблицаЗначений, передать её в запрос как параметр и воспользоваться временной таблицей. Это позволит системе выполнить поиск «ВИП-клиентов» в один проход.

Разберем алгоритм по шагам:

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

Пример программного кода для реализации данного метода:


ТаблЗнач = Источник.Получатели.Выгрузить();
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ТЗ.Получатель КАК Получатель
    |ПОМЕСТИТЬ Получатели
    |ИЗ
    |	&ТаблЗнач КАК ТЗ
    |;
    |ВЫБРАТЬ
    |	ПЕРВЫЕ 1
    |	ИСТИНА КАК ЭтоВИП
    |ИЗ
    |	Получатели КАК Получатели
    |ГДЕ
    |	Получатели.Получатель.ГруппаДоступа = &ГруппаДоступа";

Запрос.УстановитьПараметр("ГруппаДоступа", Справочники.ГруппыДоступаКонтрагентов.НайтиПоНаименованию("ВИП"));
Запрос.УстановитьПараметр("ТаблЗнач", ТаблЗнач);

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

Альтернативный подход: использование дополнительных реквизитов

Иногда логика бизнеса меняется настолько часто, что правка основного кода становится трудоемкой. В таких случаях рекомендуем использовать механизм ДополнительныеРеквизитыИСведения. Это позволяет добавить признак «ВИП» прямо в пользовательском интерфейсе, не изменяя структуру конфигурации и не снимая её с поддержки.

Алгоритм действий с доп. реквизитом:

  1. Создайте дополнительный реквизит для справочника Контрагенты (например, «Статус_VIP» с типом Булево).
  2. В коде правила категоризации найдите этот реквизит с помощью функции ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту.
  3. Проверьте значение этого реквизита у всех контрагентов из табличной части документа.

Пример реализации с использованием доп. реквизита:


Результат = Ложь;
СвойствоВИП = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Статус_VIP");

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

Важные советы при разработке

При работе с категоризацией документов важно учитывать следующие моменты:

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

← На главную