В процессе работы с документами в системе 1С часто возникает необходимость автоматизировать процесс классификации. Например, если в табличной части документа указан контрагент, относящийся к определенной группе доступа (например, «ВИП»), документу необходимо автоматически присвоить соответствующую категорию. Рассмотрим, как реализовать эту задачу наиболее грамотно и эффективно с точки зрения производительности.
Многие начинающие разработчики при попытке решить данную задачу совершают распространенную ошибку: они организуют выполнение Запрос внутри цикла Для каждого. Это крайне негативно сказывается на скорости работы системы: если в табличной части документа содержится 100 контрагентов, программа будет обращаться к базе данных 100 раз. Мы же с вами поступим иначе — выполним один запрос к целой таблице данных.
Наиболее правильный путь — выгрузить данные из табличной части в ТаблицаЗначений, передать её в запрос как параметр и воспользоваться временной таблицей. Это позволит системе выполнить поиск «ВИП-клиентов» в один проход.
Разберем алгоритм по шагам:
Результат.Пример программного кода для реализации данного метода:
ТаблЗнач = Источник.Получатели.Выгрузить();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЗ.Получатель КАК Получатель
|ПОМЕСТИТЬ Получатели
|ИЗ
| &ТаблЗнач КАК ТЗ
|;
|ВЫБРАТЬ
| ПЕРВЫЕ 1
| ИСТИНА КАК ЭтоВИП
|ИЗ
| Получатели КАК Получатели
|ГДЕ
| Получатели.Получатель.ГруппаДоступа = &ГруппаДоступа";
Запрос.УстановитьПараметр("ГруппаДоступа", Справочники.ГруппыДоступаКонтрагентов.НайтиПоНаименованию("ВИП"));
Запрос.УстановитьПараметр("ТаблЗнач", ТаблЗнач);
Выборка = Запрос.Выполнить().Выбрать();
Результат = НЕ Выборка.Пустой();
Иногда логика бизнеса меняется настолько часто, что правка основного кода становится трудоемкой. В таких случаях рекомендуем использовать механизм ДополнительныеРеквизитыИСведения. Это позволяет добавить признак «ВИП» прямо в пользовательском интерфейсе, не изменяя структуру конфигурации и не снимая её с поддержки.
Алгоритм действий с доп. реквизитом:
Контрагенты (например, «Статус_VIP» с типом Булево).ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту.Пример реализации с использованием доп. реквизита:
Результат = Ложь;
СвойствоВИП = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Статус_VIP");
Если ЗначениеЗаполнено(СвойствоВИП) Тогда
Для каждого СтрокаПолучателя Из Источник.Получатели Цикл
СтрокаСвойства = СтрокаПолучателя.Получатель.ДополнительныеРеквизиты.Найти(СвойствоВИП, "Свойство");
Если СтрокаСвойства <> Неопределено Тогда
Результат = Результат Или СтрокаСвойства.Значение;
КонецЕсли;
КонецЦикла;
КонецЕсли;
При работе с категоризацией документов важно учитывать следующие моменты:
Выборка.Пустой()), а не пытаться сравнить ссылку с булевым значением.Строка.Получатель.ГруппаДоступа). В высоконагруженных системах лучше использовать предварительный запрос, который выберет все необходимые данные за один раз.Применяя эти методы, вы обеспечите стабильную работу механизмов автоматической категоризации и облегчите дальнейшую поддержку вашего решения!