Отправляет email-рассылки с помощью сервиса Sendsay

1С и электронная коммерция

  Все выпуски  

1С и электронная коммерция Групповое проведение документов. Штатные методы оптимизации.




1С и электронная коммерция    Рассылка сайта Системная интеграция + 1С

Четверг, 15 Мая 2008 года (2 Мая 2008 по ст.ст.)
Седмица 3-я по Пасхе, Глас вторый


ш Свт. Афанасия Великого, архиеп. Александрийского (373). Перенесение мощей блгвв. князей страстотерпцев Бориса и Глеба, во святом Крещении Романа и Давида (1072 и 1115). Свт. Афанасия, патриарха Константинопольского, Лубенского чудотворца (1654). Мчч. Еспера и Зои и чад их Кириака и Феодула (II). Блгв. и равноап. царя Бориса, во святом Крещении Михаила (906-907), принявшего Крещение со своим народом в IX веке (Болг.). Путивльской (1635) и Вутиванской икон Божией Матери .

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

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

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

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

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

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

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

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

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

Возможно несколько вариантов оптимизации:

  • Можно установить бухгалтерские итоги на начало всех времен. При этом обновление их происходить не будет. Максимальная скорость записи проводок. Но этот метод можно использовать только в специфических случаях, т.к. в процессе проведения часто (как правило) возникает необходимость получения данных БИ. Этот способ рекомендуется для документов, которые не обращаются БИ в модулях проведения.

     

  • Можно воспользоваться методом Актуальность() объекта БухгалтерскиеИтоги (можно подсмотреть реализацию в обработке "ОбработкаДокументов"). Смысл в том, что объект БухгалтерскиеИтоги будет поддерживать БИ в актуальном состоянии при проведении документов. При обновлении БИ, данные будут браться из объекта БухгалтерскиеИтоги, (здесь я не уверен, а если точнее – не помню, сказывается ли это на скорости записи проводок, или нет).

     

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

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

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

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


    Архив рассылки по адресу: www.anobis.ru
    Пишите нам: altvix@mail.ru
    ICQ: 322770372

    Подпишитесь на другие наши рассылки

Рассылки Subscribe.Ru
Секреты рекламы и создания интернет-магазинов
Скидки, подарки, призы...
1С и электронная коммерция
Серверы, сетевое оборудование, тесты, характеристики, советы
Рукопашный бой для девушек – выживание, психология, самозащита!
Милосердие. Чем ты можешь помочь ближнему.
Православные знакомства.
Здоровый образ жизни.

В избранное