Заметки из Зазеркалья

24.01.2024

Оптимизация менеджеров объектов для пакетной обработки

Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.

Планируется в версии 8.3.26

При анализе кода существующих типовых конфигураций было обнаружено, что достаточно часто выполняется пакетная обработка объектов базы данных (справочников, документов и т. п.) в соответствии с заданным набором ссылок на объекты. В процессе обработки состояние каждого из объектов загружается из БД с использованием Ссылка.ПолучитьОбъект(). Затем выполняется анализ значений реквизитов и, в случае необходимости, объект модифицируется и записывается.

Каждая из операций Ссылка.ПолучитьОбъект() приводит к обращению к базе данных для чтения состояния объекта, что довольно накладно. В то же время в платформе «1С:Предприятии 8» с версии 8.0 присутствует механизм выборок, который позволяет за одно обращение к базе получить выборку, содержащую данные сразу многих объектов.

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

Для более быстрой пакетной обработки у менеджеров объектов базы данных будет реализован метод ВыбратьПоСсылкам(), позволяющий получать выборки по заданному набору ссылок.

В менеджеры объектов СправочникМенеджер.<Имя_справочника>, ДокументМенеджер.<Имя_документа>, ПланВидовХарактеристикМенеджер.<Имя_плана_видов_характеристик> и т.д. (полный список будет доступен в документации) будут добавлены методы ВыбратьПоСсылкам(<Источник>, <Колонка>) / SelectByRefs(<Source>, <Column>).

Метод ВыбратьПоСсылкам() в целом подобен методу Выбрать(), присутствующему в том или ином виде в каждом из упомянутых менеджеров. Оба метода возвращают выборку объектов соответствующего типа. Отличие состоит в том, что в качестве критерия выборки метод ВыбратьПоСсылкам() получает коллекцию ссылок на объекты соответствующего менеджеру типа.

Параметры метода ВыбратьПоСсылкам():

<Источник> - обязательный, источник ссылок на объекты. Это может быть ТаблицаЗначений, РезультатЗапроса, Массив, ФиксированныйМассив.

<Колонка> - необязательный. Если в качестве значения первого параметра фигурирует ТаблицаЗначений или РезультатЗапроса, то с помощью этого параметра можно указать колонку, содержащую ссылки. Колонка может быть задана именем (значение типа Строка) или индексом (значение типа Число). Если значение параметра не задано, то используется первая колонка источника. Если значением параметра <Источник> является Массив, то значение параметра <Колонка> игнорируется.

Метод возвращает выборку объектов типа, соответствующего менеджеру: СправочникВыборка.<Имя_справочника>, ДокументВыборка.<Имя_документа> и т.д.

Метод ВыбратьПоСсылкам считывает объекты порциями (как и метод Выбрать). Заметим, этот механизм не обеспечивает целостного считывания, если не предпринять дополнительных мер. Например, если товар в некоторой операции переносится из одного заказа в другой, то может сложиться ситуация, когда товар окажется в двух заказах, так как один считается до переноса данных, а другой после. Иными словами, целостность данных обеспечивается только на уровне отдельных объектов, но не всей выборки в целом.

Пример использования:

Запрос = Новый Запрос();
Запрос.Текст = "
|ВЫБРАТЬ
|      Товары.Ссылка КАК Ссылка
|ИЗ
|      Справочник.Товары КАК Товары
|";

ТаблицаЗначений = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.Прямой);
Выборка = Справочники.Товары.ВыбратьПоСсылкам(ТаблицаЗначений);

Сч = 0;

Пока Выборка.Следующий() Цикл
    Сч = Сч + 1;

    Если ПолучатьОбъекты Тогда
        Об = Выборка.ПолучитьОбъект();

        //обработка объекта
    КонецЕсли;
КонецЦикла;

Мы будем рекомендовать разработчикам рассматривать использование методов ВыбратьПоСсылкам(<Источник>, <Колонка>) для массовой обработки объектов по набору ссылок для улучшения производительности, что может быть особенно важно для крупных внедрений.

Теги: 8.3.26  разработка 

Рассказать друзьям: