Многопоточность в 1С 8

floats

Давайте представим себе такую ситуацию, что программист 1С написал некоторую обработку, которая отрабатывает на его рабочем месте довольно быстро. Внес данную обработку в конфигурацию и через УРИБ она разлетелась по всем узлам. Пользователи позже звонят и говорят, что она выполняется очень долго. Как так? Дело в  том, что скорость выполнения напрямую зависит от мощностей аппаратного обеспечения. И там где «железо» слабое будет обрабатываться намного дольше.

Однако многие не знают, что начиная с платформы 1С Предприятие 8 некоторые вычисления можно выполнять параллельно, в несколько потоков. Если у вас существуют некоторые блоки, которые не зависят от вычислений в других местах, то их можно обработать параллельно. К примеру необходимо обработать какой-либо справочник или произвести запись в огромный регистр сведений.

Пусть руководство поручило увеличить с начала 2016 года все расценки из справочника РучныеРаботы на 20%. Данный справочник просто огромен, поэтому задача ложится на плечи  программиста :). Для этого пишем простейшую обработку:

Процедура УвеличениеРасценок(Кнопка)
       Старт=ТекущаяДата();
       Запрос=Новый Запрос;
       Запрос.Текст=«ВЫБРАТЬ
                | схРучныеРаботыВРастениеводстве.Ссылка
                |ИЗ
                | Справочник.схРучныеРаботыВРастениеводстве КАК схРучныеРаботыВРастениеводстве» ;

       ТаблицаРасценок=Запрос.Выполнить().Выгрузить();

       Коэффициент=1.2;

        Для каждого Строка Из ТаблицаРасценок Цикл
            Элемент=Строка.Ссылка.ПолучитьОбъект();
            Элемент.РасценкаЗаЕдиницуРаботыРуб=Элемент.РасценкаЗаЕдиницуРаботыРуб*Коэффициент;
            Элемент.ДоплатаЗаСверхурочныеРуб=Элемент.ДоплатаЗаСверхурочныеРуб*Коэффициент;
            Элемент.Записать();
        КонецЦикла;

     ВремяВыполнения= ТекущаяДата()-Старт;

КонецПроцедуры

 

В результате время выполнения обработки заняло 6 минут 43 секунды. Можно было бы на этом и остановиться, но мы то хотим добиться максимальной скорости.  С этого моменты мы начинаем использовать параллельные вычисления в 1с.

 

Процедура УвеличениеРасценок(Кнопка)

 Старт=ТекущаяДата();
 Запрос=Новый Запрос;
 Запрос.Текст=«ВЫБРАТЬ
      | схРучныеРаботыВРастениеводстве.Ссылка
      |ИЗ
     | Справочник.схРучныеРаботыВРастениеводстве КАК схРучныеРаботыВРастениеводстве» ;

 ТаблицаРасценок=Запрос.Выполнить().Выгрузить();
 КоличествоПотоков=4;
 ОбъемДанныхПотока= Цел(ТаблицаРасценок.Количество()/КоличествоПотоков);

  МассивПотоков=Новый Массив;

  Для НомерПотока=1 По КоличествоПотоков Цикл
              СтартовыйИндекс=(НомерПотока-1)*ОбъемДанныхПотока;

              Если НомерПотока=КоличествоПотоков Тогда
                  ОбъемДанныхПотока= ТаблицаРасценок.Количество()-(КоличествоПотоков1)*ОбъемДанныхПотока ;
              КонецЕсли;

             НаборПараметров=Новый Массив;
             НаборПараметров.Добавить(ТаблицаРасценок);
             НаборПараметров.Добавить(СтартовыйИндекс);
             НаборПараметров.Добавить(ОбъемДанныхПотока);

             Поток = ФоновыеЗадания.Выполнить(«Пересчет.ОбновитьРасценку»,НаборПараметров); 
             МассивПотоков.Добавить(Поток);

  КонецЦикла;

 ВремяВыполнения=ТекущаяДата()-Старт;

КонецПроцедуры

 

«Пересчет.ОбновитьРасценку» — является общим модулем следующего содержания

 

Процедура ОбновитьРасценку(ТаблицаРасценок, СтартовыйИндекс, ОбъемДанныхПотока) Экспорт  

          Коэффициент=1.2;

        Для Строка=1 По  ОбъемДанныхПотока Цикл

                      Индекс = ?(Строка=1, СтартовыйИндекс, СтартовыйИндекс+1);  
                      Элемент=ТаблицаРасценок[Индекс].Ссылка.ПолучитьОбъект();
                      Элемент.РасценкаЗаЕдиницуРаботыРуб=Элемент.РасценкаЗаЕдиницуРаботыРуб*Коэффициент;
                      Элемент.ДоплатаЗаСверхурочныеРуб=Элемент.ДоплатаЗаСверхурочныеРуб*Коэффициент;
                      Элемент.Записать();
        КонецЦикла;

     ВремяВыполнения= ТекущаяДата()-Старт;

КонецПроцедуры

В результате выполнения данной обработки время сократилось до 2 минут 54 секунд, почти в 2 раза. Хороший выигрыш, не правда?Вот что такое многопоточность 1с. Также можно играться количеством потоков, но не стоит усердствовать — оптимальное количество 4-10. при последующем увеличении вы можете добиться обратного эффекта.

Поделитесь своим мнением

Свежие записи
Советы и помощь программиста в 1с © 2018 ·   Войти   · Наверх