Применение параллельных вычислений для ускорения регламентных задач на 1С Предприятие 8.2 -01.10.2012   

   

В моей практике все больше сталкиваюсь с ситуациями, когда клиентам необходимо ускорить выполнение регламентных отчетов, обработок, документов (в дальнейшем будем называть - задачи). Как правило, эти задачи выполняются очень долго, время их выполнения измеряется часами или даже сутками.
Далее в статье будет рассмотрен пример того, как можно применять параллельные вычисления в 1С:Предприятие 8.2 для ускорения документа РаспределениеНДСКосвенныхРасходов (распределение НДС косвенных расходов).

Содержание
Введение
Проведение документа РаспределениеНДСКосвенныхРасходов с применением параллельных вычислений
  Суть проблемы
  Общие подходы к решению
  Реализация механизма многопоточного проведения
     
Общее описание механизма
       Подробнее о разбиении исходного документа
       Форма «Параллельное проведение документов» 
       Подробнее о фоновых заданиях
Тестовые замеры
Условия эффективной работы механизма
Скрытые проблемы
Резюме

 

Введение
Основные сложности при выполнении длительных регламентных задач возникают в следующих случаях:
1. На выполнение задачи выделен строго определенный ограниченный интервал времени, которого может не хватать для завершения регламентной задачи.
2. Выполнять задачу необходимо множество раз, в несколько итераций, когда в каждой последующей итерации постепенно корректируются какие-либо данные в зависимости от результатов предыдущей итерации до тех пор, пока не будут получены целевые значения. Общая продолжительность таких действий может оказаться неприемлемо большой.
3. Если длительность выполнения задачи начинает превышать некий порог, она каждый раз завершается аварийно (либо «зависает навсегда»). И корректно выполнить её вообще не удаётся.
4. Необходимо постоянное присутствие специалиста во время выполнения задачи, притом что её длительность может достигать 9-12 часов и более.
Во многих случаях решить проблему ускорения длительных задач можно применением параллельных вычислений.
Как указывалось в предыдущих статьях, написание программистом кода, в котором заложено использование параллельных вычислений, - это более сложная задача, чем классическое кодирование в «один поток».
Также следует отметить, что не все задачи в принципе распараллеливаются (по крайней мере, эффективно).
Напомню, за счет чего при использовании параллельных вычислений возможно ускорение. В современных серверах увеличение производительности идет по пути увеличения количества процессоров (и их ядер). Задача, написанная классически в «один поток», будет использовать только один процессор, и большая часть вычислительного потенциала многопроцессорного сервера останется не задействованной. Ускорение возможно в том случае, если задача будет работать одновременно в нескольких потоках и эффективно задействовать мощности нескольких процессоров.
Далее рассматривается пример того, как можно ускорить проведение документа РаспределениеНДСКосвенныхРасходов с помощью параллельных вычислений.

Проведение документа РаспределениеНДСКосвенныхРасходов с применением параллельных вычислений
Суть проблемы с проведением РаспределениеНДСКосвенныхРасходов заключается в следующем.
По мере увеличения количества корректирующих движений, производимых документом, время его проведения увеличивается. Также увеличивается перечень блокируемых при этом ресурсов и длительность блокировок. В какой-то момент длительность проведения документа становится неприемлемо большой, либо документ вообще перестаёт корректно проводиться (например, он может «повисать», и отклика от него дождаться не удаётся).
Ситуация усугубляется тем, что зачастую формирование этого документа происходит итерационно, когда он сначала заполняется, затем проводится, затем на основании полученного результата в документ вносятся корректировки, затем он еще раз проводится и так далее до тех пор, пока не будут получены желаемые цифры.
Общие подходы к решению
Описанные выше проблемы заставляют искать способ принципиально ускорить проведение документа РаспределениеНДСКосвенныхРасходов. Таким решением может быть применение параллельных вычислений, а именно, многопоточное проведение документа.
Для успешной реализации такого решения в данном виде документа имеется ряд предпосылок:
• Специфика алгоритмов данного документа такова, что если единый большой документ (тут величина документа оценивается по количеству строк в ТЧ «СоставКосвенныхРасходов») разделить на множество более мелких документов-дочек, то созданные при проведении множества мелких документов корректирующие движения дадут тот же результат (с точки зрения бухгалтерской отчетности), что и движения единого большого документа. Эта особенность известна и иногда используется на практике. Следует учесть, что небольшая разница в итоговых цифрах всё же возможна из-за погрешностей, связанных с округлением сумм.
• Дробить большой документ можно на произвольное число более мелких документов-дочек.
• Дробление исходного документа можно выполнять автоматически программно, это явно легкореализуемо.
• Проводить документы-дочки можно в любой последовательности.
• Организовать многопоточное проведение можно либо с через запуск N-сессий толстого клиента 1С:Предприятие, либо (что более эффектно и удобно) через использование механизма фоновых заданий.
• Можно предположить, что, скорее всего, перечисленные выше факторы позволят реализовать механизм многопоточного проведения полностью штатными средствами 1С, без изменения структуры документа и без вмешательства в стандартный алгоритм проведения. А значит, будет автоматически выполнено главное условие реализации данного механизма – это обеспечение корректности итоговых данных с точки зрения бухгалтерской отчетности.
Возможный выигрыш от многопоточного проведения в первом приближении можно оценить следующим образом:
• Из опыта можно утверждать, что суммарное время проведения мелких документов-дочек, скорее всего, будет либо больше, либо примерно соответствовать времени большого документа-родителя. Однако, если запустить проведение документов-дочек в несколько потоков, то время должно сократиться за счет распараллеливания. Понятно, что степень реального параллелизма будет сильно зависеть от специфики конкретной ИС, в каких-то случаях её получить, возможно, не удастся, но в целом в большинстве случаев всё же можно ожидать выигрыша по времени.
• В тех случаях, когда исходный большой документ вообще может проводиться стандартным способом, «многопоточный» вариант как минимум гарантирует успешное проведение в течение какого-то обозримого времени. А это уже немало в такой ситуации.


Реализация механизма многопоточного проведения
Далее приводится пример практической реализации механизма многопоточного проведения документа РаспределениеНДСКосвенныхРасходов.
Сразу следует также отметить, что описанный здесь механизм – не единственный возможный вариант реализации принципа параллельных вычислений для этого документа.
Общее описание механизма
В форму документа РаспределениеНДСКосвенныхРасходов добавлена кнопка «ПараллельноеПроведение», при нажатии на которую происходит автоматическое разбиение документа на множество более мелких «дочек», и открывается экранная форма «Параллельное проведение документов».
На этой форме отображены сведения о сформированных «дочках»: номера, текущие статусы и пр. Также на форме имеется кнопка «Провести», при нажатии на которую всем «дочкам» присваивается статус «готов к проведению», что является сигналом к началу многопоточного проведения. Статусы «дочек» вместе с прочей информацией о них хранятся в регистре сведений «ПараллельноеПроведение».
На сервере приложений функционирует специальное регламентное задание «Диспетчер параллельного проведения», которое с заданной периодичностью (несколько секунд) проверяет наличие «дочек» со статусом «готов к проведению». Как только появляются документы с таким статусом, он запускает специальные фоновые задания, и передаёт им эти документы для проведения (или отмены проведения). Алгоритм фонового задания заключается в проведении (или отмене проведения) полученного документа и присвоении ему статуса «проведён» («распроведён»).
Экранная форма «Параллельное проведение документов» периодически опрашивает регистр сведений «ПараллельноеПроведение» и актуализирует отображаемые данные.

Подробнее о разбиении исходного документа
На форме документа РаспределениеНДСКосвенныхРасходов добавлена специальная кнопка «Параллельное проведение». При нажатии на неё выполняется запрос к специальному регистру сведений «ПараллельноеПроведение»:
• если в этом регистре есть сведения о документах-дочках, то сразу открывается дополнительная форма «Параллельное проведение документов»;
• в противном случае запускается автоматический алгоритм создания документов-дочек, по окончании которого открывается дополнительная форма «Параллельное проведение документов»;



Рис.. Форма документа-родителя №00019.

 

Ряд стандартных проверок, выполняемых в модуле документа РаспределениеНДСКосвенныхРасходов при его проведении, продублированы в специальной функции «ОбработкаОшибокПроведения», которая вызывается при нажатии на кнопку «Параллельное проведение» в документе-родителе. А в самом стандартном модуле документа в тех местах, где эти проверки выполняются, добавлено условие: если документ является чьей-то дочкой, то проверки не выполняются. Это сделано в целях ускорения проведения «дочек»: поскольку весь комплекс проверок уже был выполнен в документе-родителе (при нажатии на «Параллельное проведение» в функции «ОбработкаОшибокПроведения»), их можно не выполнять повторно при проведении каждой «дочки».

Рис.. Процедура, выполняемая при нажатии на кнопку «ПараллельноеПроведение» в основной форме документа. 

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

Рис.. Форма документа-дочки: «Часть №11» родительского документа №00019.

В процессе разбиения сведения о созданных документах-дочках заносятся в специальный регистр сведений «ПараллельноеПроведение».

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

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

Рис.. Форма «Параллельное проведение документа»: запущено проведение в 11 потоков.

Подробнее о фоновых заданиях
Документы-дочки проводятся в параллельном режиме: по нескольку штук одновременно, для этого используются фоновые задания сервера приложений 1С.
Для управления фоновыми заданиями реализовано специальное регламентное задание «Диспетчер параллельного проведения», которое с заданной периодичностью проверяет наличие документов-дочек со статусом «готов к проведению». Периодичность выполнения этого регламентного задания можно настраивать с помощью стандартной обработки «КонсольЗаданий.epf». Обычно достаточно частоты 5-7 секунд.
Как только диспетчер обнаруживает документы со статусом «готов к проведению», он начинает запускать специальные фоновые задания, передавая каждому их них по одному документу. Алгоритм фонового задания в основном заключается в проведении полученного документа и присвоении ему статуса «проведён».
Количество фоновых заданий определяется константой «ПараллельноеПроведениеПотоков». Оптимальное количество вместе с размером документов-дочек подбирается эмпирически для каждой конкретной системой.
Диспетчер параллельного проведения обеспечивает следующие важные условия:
1. Каждый документ-дочка выдаётся для проведения (или распроведения) только одному фоновому заданию.
2. В случае ошибки проведения документ может быть выдан фоновому заданию повторно.
3. Количество запущенных фоновых заданий не превышает заданного лимита (константа «ПараллельноеПроведениеПотоков»).

Рис.. Фоновые задания: проведение документов-дочек в 10 потоков.

Рис.. Диспетчер параллельного проведения: регламентное задание, основная процедура, имя метода.

Рис.. Диспетчер параллельного проведения: основная процедура.

Рис.. Основная процедура фонового задания.

Тестовые замеры
Для иллюстрации эффекта от применения описываемой технологии можно привести результаты замеров, полученные в ИС одного из клиентов.
Перед внедрением данного механизма в рабочую ИС, нужно получить ответы на два вопроса:
• Корректны ли данные, получаемые при использовании этого механизма (с точки зрения бухгалтерской отчетности)?
• Каков уровень эффекта, который он даёт, с точки зрения скорости проведения?
Чтобы ответить на оба вопроса был проведён следующий тест.
1. В качестве контрольных решено использовать документы, закрывающие второй квартал 2011г. Для закрытия этого квартала изначально был создан единый большой документ РаспределениеНДСКосвРасходов, в ТЧ «СоставКосвенныхРасходов» этого документа содержалось 1889 строк. Провести его стандартным способом не удавалось, поэтому данный документ был вручную разбит специалистами Заказчика на 8 документов поменьше, которые в свою очередь по отдельности провести им удалось.
2. В качестве критерия оценки результатов решено использовать ряд бухгалтерских отчётов, предложенных Заказчиком (далее – «контрольные отчеты»).
3. Была создана тестовая копия боевой БД. Далее все работы проводились в тестовой копии.
4. Были сформированы контрольные отчеты и сохранены в файл.
5. Далее стандартным способом была выполнена отмена проведения всех 8-ми контрольных документов РаспределениеНДСКосвРасходов, закрывающих второй квартал.
6. Выполнено проведение исходного единого большого документа РаспределениеНДСКосвРасходов (ТЧ=1889) в «параллельном» (с применением описываемой здесь технологии). При этом исходный большой документ разбивался на 126 документов-дочек по 15 строк в ТЧ у каждой, а проведение осуществлялось в 12 потоков. Время проведения составило 18 мин.
7. Повторно сформированы контрольные отчёты, и сверены с отчётами, сохранёнными ранее в файл. Сверка показала, что отчёты идентичны. Присутствовала лишь небольшая допустимая разница (на копейки) в нескольких позициях, обусловленная погрешностями при округлении сумм, но это было ожидаемо, и можно считать допустимым.
8. Выполнена отмена проведения исходного единого большого документа РаспределениеНДСКосвРасходов (ТЧ=1889) в «параллельном» режиме (с применением описываемой здесь технологии).
9. Вручную стандартным способом последовательно проведено 8 документов, закрывающих второй квартал. Т.е.воспроизведены действия, выполненные ранее Заказчиком при закрытии квартала в рабочей БД. При этом суммарное время проведения всех 8-ми документов составило около 14 часов.

Обобщённо тест дал следующие результаты.
1. Относительно корректности данных был сделан вывод: применение механизма параллельного проведения даёт корректный результат с точки зрения бухгалтерской отчётности.
2. Применение механизма параллельного проведения дало ускорение времени проведения примерно в 45 раз (!). Подробнее показатели замеров времени проведении описаны ниже в таблице.
Таб.. Результаты сравнительных замеров скорости проведения документа с ТЧ=1889 строк.
Способ проведения Параметры аппаратной части Доп.параметры Результат (время проведения)
Стандартным способом Кол-во ядер ЦП - 24; Опер.память - 32 ГБ. Проведение исходного большого документа "целиком" провести не удаётся
Стандартным способом Последовательное проведение 8-ми документов, полученных ручной разбивкой исходного большого документа 14 часов (840 мин)
С применением механизма параллельного проведения Многопоточное (12 потоков) проведение 126 «дочек» (по 15 строк), сформированных автоматически 18 мин


Условия эффективной работы механизма
Следует иметь в виду, что практический эффект от применения описанного механизма в реальной рабочей БД зависит от множества факторов. Ниже перечислены основные условия, которые необходимо соблюдать для получения максимального эффекта.
1. Необходимо обеспечить своевременное обновление нужных индексов и статистик. Перед тем как применять механизм, рекомендуется выполнить переиндексацию таблиц, задействованных в алгоритме проведения документа, особенно самых больших регистров.
2. Проведение с применением механизма желательно выполнять в нерабочее время, когда другие пользователи 1С не будут составлять конкуренцию с точки зрения 1С- и SQL-блокировок, а также аппаратных ресурсов.
3. Следует соблюдать баланс между размером «дочек» и их количеством. При слишком большом размере будет низкий параллелизм из-за блокировок на общих ресурсах. При слишком маленьком размере, «дочек» может оказаться слишком много и, несмотря на высокий параллелизм, эффективность механизма упадёт из-за возрастания накладных расходов на диспетчеризацию и прочих факторов.
4. Количество фоновых заданий не должно превышать количества ядер ЦП на сервере приложений 1С.


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

Резюме
Описанный пример реализации специального механизма для проведения документа РаспределениеНДСКосвРасходов показывает, что использование параллельных вычислений для ускорения длительных регламентных задач в ИС на платформе 1С:Ппредприятие 8.2 + SQL-Server действительно возможно и способно давать мощнейший эффект.
Компания Софтпоинт имеет готовое решение для ускорения регламентного документа РаспределениеНДСКосвРасходов, применимое для ИС на платформе 1С:Ппредприятие 8.1/8.2 + SQL Server 2000/2005/2008.
На текущий момент ведётся разработка технологии восстановления последовательности для 1С 7.7 с использованием параллельных вычислений. В планах компании создание и других решений на базе параллельных вычислений для ускорения длительных регламентных задач.

Статья: Применение параллельных вычислений для ускорения регламентных задач на 1С Предприятие 8.2 -01.10.2012

Перейти на главную страницу компании "Софтпоинт"