helpf.pro
Регистрация
 0 
Распечатать

1С 8.x : Фоновые задания 1С, примеры работы и параллельного запуска

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

Что у нас в 1с Предприятии 8.2 имеется для распараллеливания & это фоновые задачи. Метод, который будет вызываться в фоновой задаче, должен быть прописан в серверном общем модуле и быть экспортным. Естественно нам понадобиться в фоновую задачу передавать и забирать значения.

В моем случае передача значений в фоновую задачу происходила через параметры. Метод ЗагрузитьИзВИБ имеет два параметра это ВходнойПараметр и АдресВХранилище. ВходнойПараметр это структура, в которую сгружаются все данные, необходимые для проведения загрузки. АдресВХранилище это адрес во временном хранилище, по которому будет передан результат загрузки. Сам код метода фонового задания выглядит так:

Код 1C v 8.х
 Процедура ЗагрузитьИзВИБ(ВходнойПараметр,АдресВХранилище) Экспорт
    //Из структуры перегоняем данные в переменные
    ТаблицаДляЗаполнения = ВходнойПараметр.ТаблицаДляЗаполнения;
    ДанныеОбъекта = ВходнойПараметр.ДанныеОбъекта;

    //Тут идет собственно загрузка данных
    ВыполнитьЗагрузку(ТаблицаДляЗаполнения,ДанныеОбъекта);

    //Возвращаем данные из фоновой задачи в хранилище
    ПоместитьВоВременноеХранилище(ТаблицаДляЗаполнения, АдресВХранилище);
КонецПроцедуры

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

Для того чтобы запустить фоновые задачи выполняется следующий код:

Код 1C v 8.х
 МассивАдресовВХранилище = Новый Массив;
МассивЗапущенныхЗаданий = Новый Массив;
Сч = 1;
Пока Сч <= КоличествоПотоков Цикл
Ключ = Новый УникальныйИдентификатор;
ВходнойПараметр = Новый Структура;
ВходнойПараметр.Вставить("ТаблицаДляЗаполнения",ТаблицаДляЗаполнения);
ВходнойПараметр.Вставить("ДанныеОбъекта",ДанныеОбъекта);

//Подготовим адрес в хранилище
АдресВХранилище = ПоместитьВоВременноеХранилище(Неопределено);
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(ВходнойПараметр);
МассивПараметров.Добавить(АдресВХранилище);
МассивАдресовВХранилище.Добавить(АдресВХранилище);

МассивЗапущенныхЗаданий.Добавить(ФоновыеЗадания.Выполнить("ОбщийМодульСервер.ЗагрузитьИзВИБ",МассивПараметров, Ключ, "Загрузка"));
Сч = Сч + 1;
КонецЦикла;

Перед запуском фоновой задачи через ФоновыеЗадания.Выполнить() мы формируем массив параметров. Значения из массива параметров переходят в метод фонового задания в качестве параметров. В МассивЗапущенныхЗаданий хранятся все фоновые задачи, которые мы запустили. Теперь надо подождать их ожидания.

ФоновыеЗадания.ОжидатьЗавершения(МассивЗапущенныхЗаданий);

После того как все задачи были завершены, можем приступить к получению из них данных. Для этого мы проходим по всем адресам в хранилище, которые хранятся в массиве МассивАдресовВХранилище. После получения результата фонового задания перегоняем его в общую таблицу.

Код 1C v 8.х
 Для Каждого ТекАдресВХранилище Из МассивАдресовВХранилище Цикл
    ТекТаблица = ПолучитьИзВременногоХранилища(ТекАдресВХранилище);


    Для Каждого ТекСтрокаДанные Из ТекТаблица Цикл
        НоваяСтрока = НашаОбщаяТаблица.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока,ТекСтрокаДанные);
    КонецЦикла;
КонецЦикла;

Вопрос определения оптимального количества потоков выходит за рамки данного поста. А после получения некоторых результатов на рабочих данных пока что выходит и за рамки моего сознания ). Но если у вас есть идеи как посчитать нужное количество потоков, пишите в комментариях, с радостью почитаю.

Источник

Разместил:   Версии: | 8.x | 8.2 УП | 8.3 |  Дата:   Прочитано: 997
 0 
Распечатать
Возможно, вас также заинтересует
1C и Google Maps 12
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во...
COM-подключение к базе 7.7 из 8.2 1С 4
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе="...
Google maps, поиск оптимального маршрута 2
В данном посте хочу коснуться основных аспектов построения оптимального маршрута с использованием API Google maps. Исходные данные для построения маршрута: * Географические координаты объектов, которые хранятся в базе; *...
Автоматизация обмена данных используя обработку "Универсальный обмен данными в формате XML" 3
Автоматизация обмена между базами используя обработку " Универсальный обмен данными в формате XML" В основу данной публикации положены найденные мною материалы по cозданию обмена между двумя базами с использованием ...
Альтернативный перенос остатков между 7.7 и 8.1 (обработкой с ИТС ЗагрузкаДанныхИзТаблДокум) 0
Нашел альтернативный, практически моментальный способ переноса остатков между семерой и восьмерой (так и между восмерками). Не требуется никаких дополнительных усилий, программирования, писания обработок и т.д. и т.п....
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.