Групповое проведение документов. штатные методы оптимизации.

создатель статьи: Виктор Болбат (Enot)

Источник hare.ru

Прочтение статьи Павла Шемякина Групповое проведение документов. Ускоряемся? продемонстрировало, что работа движка V7 (или совсем не обрисованная в документации, или обрисованная не хорошо) вызывает большое количество неясностей и вопросов. Мне думается, что прежде, чем придумывать какие-то сложные методы ускорения, реализация которых требует высокой квалификации, хорошо бы попытаться оптимизировать групповое проведение штатными способами ? это может оказаться достаточным.

Итак, перед нами стоит задача оптимизации проведения документов при групповом проведении (в более широком смысле ? при автоматическом проведении нескольких документов сходу).

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

  1. Установка периодических реквизитов справочника.
  2. Запись бухгалтерских проводок. Напомню, что наряду с этим происходит не только запись в издание проводок, но и обновляются бухгалтерские итоги (потом БИ).
  3. Запись перемещений регистров. Как и при с проводками, дополнительно обновляются итоги.
  4. Запись записей издания расчетов (по данной части я не имею глубоких познаний и исходя из этого потом разглядывать не буду).
  5. Исполнение запросов для получения данных по остаткам и оборотам БИ.
  6. Исполнение запросов для получения данных по остаткам и оборотам регистров.
  7. Запись данных, за исключением прошлых пунктов.
  8. Чтение, анализ данных.

Что возможно сделать со всем этим? Сходу возможно откинуть п.8, оптимизировать тут нечего.

Для оптимизации любой записи данных (среди них и перемещений документа) возможно воспользоваться механизмом транзакций. Для этого перед стартом групповой обработки выполняется команда НачатьТранзакцию(), а в конце ? ЗафиксироватьТранзакцию().

Как раз так сделано в обработке ОбработкаДокументов, при НЕ монопольного подключения к базе. Приблизительный суть в том, что в ходе проведения запись данных в базу не производиться, а накапливается в буфере. По окончании окончания проведения, все трансформации записываются пачкой.

Эффект таковой оптимизации получается весьма большой, производительность может вырасти в разы.

Имеется и недочёт ? в случае если документов проводиться довольно много (либо данных большое количество), то буфер, в котором накапливаются трансформации, сам становиться узким местом (подробностей внутренней организации транзакций я не знаю, но на практике это выглядит как раз так). Оптимальной есть следующая тактика: разбить всю массу документов на пакеты (количество документов в пакете подбирается экспериментально, исходя из количества данных, хранимых в документе) и проведение каждого пакета оформляется в виде транзакции.

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

И взглянуть на производительность.

Вероятно пара вариантов оптимизации:

  • Возможно установить бухгалтерские итоги на начало всех времен. Наряду с этим обновление их происходить не будет. Большая скорость записи проводок. Но данный способ возможно применять лишь в своеобразных случаях, т.к. в ходе проведения довольно часто (в большинстве случаев) появляется необходимость получения данных БИ. Данный метод рекомендуется для документов, каковые не обращаются БИ в модулях проведения.

  • Возможно воспользоваться способом Актуальность() обЪекта БухгалтерскиеИтоги (возможно подсмотреть реализацию в обработке ОбработкаДокументов). Суть в том, что обЪект БухгалтерскиеИтоги будет поддерживать БИ в актуальном состоянии при проведении документов. При обновлении БИ, эти будут браться из обЪекта БухгалтерскиеИтоги,/tt
    (тут я не уверен, а вдруг правильнее ? не помню, отражается ли это на скорости записи проводок, либо нет).
  • И, наконец, возможно воспользоваться встроенным механизмом Проведение документов. Наряду с этим БИ рассчитываются на момент проведения документа, а расчёт итогов на по окончании документа не производится (совокупность рассчитывает промежуточные итоги на начало проведения документа, по окончании проведения эти сведенья обновляются и употребляются потом, и лишь в конце периода они записываются в базу). Это наилучший вариант.
  • С записью перемещений регистров обстановка подобная. В своевременном учете существует понятие точки актуальности (потом ТА). При записи перемещений в ТА обновляются только данные в ТА. Так, все, что требуется, это перемещать ТА вместе с проведением документа (вернее, нужно сначала установить ТА на первый документ, а дальше ТА при проведении обязана перемещаться машинально). Как это делается технически ? опять-таки, возможно взглянуть в обработке ОбработкаДокументов. Подобно трудится и встроенный механизм Проведение документов.

    Запросы r БИ при проведении документов, в большинстве случаев, выполняются на дату документа (вернее, на начало документа). К примеру, дабы вычислить цену, исходя из текущих остатков. Для оптимизации скорости исполнения как раз таких запросов (в случае если запрос выполняется на произвольную дату, то ничего сделать не окажется) возможно воспользоваться рассмотренными выше способами: применение встроенного механизма Проведение документов либо способа Актуальность() обЪекта БухгалтерскиеИтоги.

    БИ будут браться из временных данных (текущих итогов), а не рассчитываться В первую очередь периода итогов (квартала).

    Помимо этого, в случае если употребляется способ БИ.Вычислить(ТекущийДокумент()) и потом пользовать функции СКД(), то возможно воспользоваться функцией ИтогиАктуальны(), если она возвращает единицу, то делать способ БИ.Вычислить(ТекущийДокумент()) не нужно, возможно сходу обращаться к итогам. Выигрыш в скорости проведения получается большой.

    Оптимизация запросов к итогам регистров похожа на оптимизацию запросов к БИ. В случае если документ двигает ТА, то возможно сразу же обращаться к итогам. Это проверяется совершенно верно так же, функцией ИтогиАктуальны()

    Подведем итог. Что необходимо в модулях проведения:

    1. Для оптимизации записи перемещений никаких действий предпринимать не нужно.
    2. Для получения итогов регистров нужно выбирать остатки либо делать запросы на ТА. Перед этим неизменно необходимо контролировать актуальность итогов.
    3. Для получения БИ при исполнения запроса (а также при помощи обЪекта БухгалтерскиеИтоги) никаких действий предпринимать не нужно. При прямого обращения к БИ без запроса, необходимо предварительно контролировать необходимость исполнения расчета (актуальность итогов).

    Для группового проведения документов нужно пользоваться:

    1. Встроенным механизмом ПроведенияДокументов. Это самый оптимальный и универсальный вариант.
    2. Дополнительной обработкой с проведением и использованием транзакций пакетами. К примеру, ОбработкаДокументов НЕ в монопольном режиме (как раз в этом режиме включаются транзакции в данной обработке). В некоторых случаях (незначительное применение регистров и проводок, отсутствие обращений к итогам) получается большой выигрыш если сравнивать с прошлым способом.
    3. Дополнительной обработкой, которая поддерживает итоги в актуальном состоянии с проведением документов. К примеру, ОбработкаДокументов В монопольном режиме (как раз в этом режиме поддерживаются актуальными итоги). Трудится медленнее первого варианта (не смотря на то, что, существуют случаи, в то время, когда стремительнее, из-за оптимизации БИ по квитанциям), но незначительно.
    4. Дополнительной обработкой, которая применяет п.2 и п.3. В обработке ОбработкаДокументов в один момент эти способы не употребляются. Из-за чего, я не знаю. Практическая проверка говорит о том, что всё трудится нормально. Но, на всякий случай, применяйте данный способ с осторожностью.

    Эффект во многом зависит от каждого конкретного случая, но, в большинстве случаев, при грамотной оптимизации штатными способами производительность уведичивается в разы.
    Стань специалистом
    Корень
    Рейтинг публикаций
    Цены Нативная реклама Связаться
    Мнения
    Клерк (0) Facebook Вконтакте
    Добавить

    • Цитировать
    • Ссылка на фрагмент

    Люди которым это нравится

    Закрыть
    Вам возможно весьма интересно:

    Групповое перепроведение документов в 1С 8.3


    Похожие заметки:

    Понравилась статья? Поделиться с друзьями: