Групповое проведение документов. Ускоряемся?

Довольно часто при решении задач в системе 1С:Предприятие возникает необходимость в групповом проведении документов. Одна из основных причин - исправление ошибок, которые могут возникнуть за какой-либо прошлый период. Иногда это является частью алгоритма работы. Например, в течение одного месяца ведется только количественный оперативный учет, а затем, в конце месяца, формируются бухгалтерские проводки и суммовой учет в оперативной подсистеме. Есть еще много причин, но статья посвящена не этому. Цель статьи разобраться как можно ускорить данную обработку в системе 1С:Предприятие 7.7 SQL версии. Довольно часто приходится слышать, что в этой версии групповое проведение работает значительно медленнее, чем в DBF версии.

SQL версия. Компоненты ОУ и БУ.

Довольно часто при решении задач в системе 1С:Предприятие возникает необходимость в групповом проведении документов. Одна из основных причин - исправление ошибок, которые могут возникнуть за какой-либо прошлый период. Иногда это является частью алгоритма работы. Например, в течение одного месяца ведется только количественный оперативный учет, а затем, в конце месяца, формируются бухгалтерские проводки и суммовой учет в оперативной подсистеме. Есть еще много причин, но статья посвящена не этому. Цель статьи разобраться как можно ускорить данную обработку в системе 1С:Предприятие 7.7 SQL версии. Довольно часто приходится слышать, что в этой версии групповое проведение работает значительно медленнее, чем в DBF версии.

Сразу хочу заметить, что групповое проведение в 1С можно реализовать несколькими способами: своей обработкой, через меню 'Операции - Проведение документов :'. При этом второй способ как вы наверное могли заметить работает быстрее чем проведение документов с помощью обработки (по сути проведение документов с помощью метода Провести). Дело в том, как мне кажется, в этом случае система оптимизирует расчет остатков при проведении документов. Рассматривая через Profiler что же творится в этот момент, я сделал вывод, что это именно так. По крайней мере, я не обнаружил сложных вычислений остатков, а также обнаружил некоторые 'подозрительные' манипуляции с таблицей остатков. Долго разбираться не хватило сил - при проведении всего двух документов список сообщений в Profiler состоялљ из нескольких десятков страниц.

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

На этом закончим рассмотрение стандартных способов оптимизации. Перейдем к основной части статьи - оптимизация с использованием собственных алгоритмов. Почему слово 'ускоряемся' стоит под знаком вопроса, спросите вы. Да потому что это всего лишь теоретические выкладки, которые нужно проверять на практике и самое главное - произвести сравнение со стандартными методами. Если вдруг случится такое невероятное событие, что у меня появится неделька свободного времени, то вполне возможно, что я проведу такие испытания и при их успешном завершении (то есть если будет получен значительный выигрыш) включу данную возможность в свою компоненту ToySQL.

Итак (наконец-то ;) сам алгоритм.

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

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

Рассмотрим работу алгоритма на одном регистре.

Входные данные:

Регистр хранения остатков <ТабОст, ТабДвиж>,

ТабОст = ФО(Изм1, Изм2, .. ИзмН, Период) -> Рес,

ТабДвиж = ФД(Изм1, Изм2, .. ИзмН, Документ) -> Рес,

Последовательность проведения документов

ДП = {ДI = <Дата, Изм1, Изм2, .. ИзмН>}I = 1..N.

Вспомогательные данные:

Промежуточная таблица хранения итогов:

ВремИтоги = ФВ( Область)->Рес. Область ={ <Изм1, Изм2, .. ИзмН, Период>}. Таблица упорядочена по тем же измерениям и в том же порядке что и в регистре. Можно в индекс добавить также Период.

Функция расчета остатка на любую дату (документ):

Ф(Изм1, Изм2, .. ИзмН, Дата_Документ) =

?(Дата_Документ = КонМесяца(Дата_Документ),

ФО(Изм1, Изм2, .. ИзмН, Дата_Документ),

ФО(Изм1, Изм2, .. ИзмН, НачМесяца(Дата_Документ)-1) +

å ФД(Изм1, Изм2, .. ИзмН, Документ Î {Д|(Д.Дата >= НачМесяца(Дата_Документ)) и

(Д.Дата <= Дата_Документ)}))

Функция получения подмножества измерений:

Изм({Изм1, Изм2, .. ИзмН, Период}) = {<Изм1, Изм2, .. ИзмН>}

Выходные данные:

Оптимизированное значение функции Ф = ФОПТ для последовательности документов ДП.

Алгоритм

Для И = 1 по Н Цикл
	НадоСчитать = Изм(ДИ - ВремИтоги.Область * ДИ)

	// Вычислить новое значение функции ФВ
	Втаблице = {  Î ВремИтоги.Область |
	$Y Î НадоСчитать " Î ВремИтоги.Область (L <= Z) }

	ФВ(Х =  Î Втаблице) = ФВ(Х) - ФД(Y;Документ Î {Д|(Д > Дата) и 
	(Д.Дата <= ДИ.Дата)}

	ФВ(Х = ,Y   Î (НадоСчитать - Изм(Втаблице))) = Ф(Y; ДИ.Дата)

	// Все остатки для текущего документа
	ФОПТ(Х =  Î ДИ) = ФВ(Х) - ФД(Y;Документ Î {Д|(Д >= ДИ) и
	(Д.Дата <= ДИ.Дата)}
КонецЦикла

Прошу прощения если допустил какие-то грубые или не очень ошибки в описании алгоритма таким образом. Очень хотелось записать алгоритм как можно короче - использование математического языка в этом случае очень помогает. Самое главное кто с ним знаком, то все понятно. Не ручаюсь за правильность использования данного языка - давно не было практики, а в учебники как-то лень заглядывать (для начала их еще найти надо ;).

Пояснения для неграмотных :):

Таблица остатков и движений суть функции по измерениям и периоду (дате). Значение функции в общем случае числовой вектор. В моем случае ресурс один. Документ рассматриваем как множество кортежей, то есть реляционная таблица. Считаем, что все значения реквизитов и значение даты документа хранятся в одной таблице. Промежуточная таблица итогов похожа на таблицу остатков с той лишь разницей, что периодичность их хранения один день. Функция расчета остатка - понятно без обЪяснений (так считает остатки сама 1С). На выходе мы должны получить функцию аналогичной Ф, результат вычисления которой для последовательности документов ДП будет более оптимальным с точки зрения производительности.

В процессе формулировки последнего предложения меня посетила мысль, что результатом данного алгоритма должна стать не более оптимальная функция, а просто функция. Не знаю есть ли такое понятие в математическом аппарате как оптимальность функции по отношению к другой, но то что существует оценка алгоритма, реализующего функцию это точно. К сожалению я не владею данным аппаратом, но думаю, что тем, кто с этим знаком не составит труда произвести оценку первого алгоритма реализующего функцию Ф (то есть простой ее вариант, рассмотренный в секции вспомогательные данные) и алгоритма реализующего эту же функцию, но названную как ФОПТ. То есть функция одна, а алгоритма два.

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

Вот и все. Остается произвести оценку алгоритма, как было описано выше, и затем подтвердить ее на практике.

Приложение. Реализация на T-SQL

Здесь я рассмотрю некоторые шаги алгоритма, реализованные на T-SQL. Структура таблиц (похожа на 1С, но не совсем):

Регистр

Итоги (rg)

izm0
izm 1
Period
Res

Движения (ra)

Izm0
Izm1
Datedoc
Time
Debkred
Res

Остальные таблицы имеют структуру аналогичную итогам регистра. @DateDoc - дата текущего документа, @Timedoc - время текущего документа, @BegMonth - начало месяца для @DateDoc.

Определение множества НадоСчитать:

Select d.izm0, d. izm1 into #need_calc from #temp_tot t, #doc_data d
Where t. izm 0 = d. izm0 and t. izm1 = d. izm1 and t.period <> d.period

Определение множества Втаблице:

Select t.* into #in_temp from #need_calc n, #temp_tot t
Where n.izm0 = t.izm0 and n.izm1 = t. izm1 and
t.period = (select max(tt.period) from #temp_tot tt
where tt.izm0 = t.izm0 and tt.izm1 = t.izm1 and tt.period <= t.period)

Расчет остатков по множеству Втаблице:

Insert #temp_tot
Select i.izm0,i.izm1,sum(t.res+(1-2*ra.debkred)*ra.res)
from #in_temp I
left join #temp_tot t on t.izm0 = i.izm0 and t.izm1 = i.izm1 and t.period = i.period
left join rg on rg.izm0 = i.izm0 and rg.izm1 = i.izm1 and i.period < rg.Datedoc and rg.Datedoc <= @DateDoc

Расчет остатков, которых нет в таблице временных итогов:

Insert #temp_tot
Select i.izm0,i.izm1,sum(rg.res+(1-2*ra.debkred)*ra.res)
from #need_calc n
left join rg on n.izm0 = rg.izm0 and n.izm1 = rg.izm1 and rg.period = dateadd(day,-1,@BegMonth)
left join ra on ra.izm0 = n.izm0 and ra.izm1 = n.izm1 and @BegMonth <= ra.Datedoc and rg.Datedoc <= @DateDoc
where not exists (select * from #in_temp i where n.izm0 = i.izm0 and n.izm1 = i.izm1)

И наконец получение самого остатка:

Select d.izm0,d.izm1,sum(t.res-(1-2*ra.debkred)*ra.res)
from #in_temp d
left join #temp_tot t on t.izm0 = d.izm0 and d.izm1 = d.izm1 and t.period = @DateDoc
left join ra on ra.izm0 = d.izm0 and ra.izm1 = d.izm1 and ra.Datedoc = @Datedoc and ra.Time > @TimeDoc

P.S. Запросы не проверялись на правильность составления! Поскольку подсистема БУ очень похожа на ОУ в хранении итогов, то данную методки легко можно перенести и на БУ, нужно лишь учесть, что в таблице добавляется дополнительное измерение счет, а также то, что расчет остатка осущствляется при помощи нескольких полей таблицы итогов (остаток и обороты).

Шемякин Павел, июль 2002. Оригинал статьи на http://1csql.virtualave.net

Ещё раз: как продвигать свои посты на «Клерке»

Если вы видите это сообщение, значит продвижение работает.

Ещё раз: как продвигать свои посты на «Клерке»
10

Комментарии

1
  • ЛидиЯ
    а зачем этим всем заниматся если можна просто передвинуть та перед началом перепроведения на первый документ который подлежит перепроведению? тогда этой временной таблицей будет регистр остатков.
    или я чтото не уловил?

💥 Бодрящие скидки на курсы повышения квалификации и профессиональной переподготовки! Ведем запись на первый летний поток

Набираем первый летний поток-2024 на профкурсы. Успейте записаться до 3 июня, чтобы за лето повысить квалификацию и выйти на новый уровень знаний!

Курсы повышения
квалификации

22
Официальное удостоверение с занесением в госреестр Рособрнадзора

Календарь вебинаров для бухгалтера в июне 2024. Выбирайте и смотрите!

Будьте в курсе последних изменений в законодательстве! Выбирайте из 9 вебинаров интересные именно вам и записывайтесь. Забирайте в закладки календарь вебинаров для бухгалтера, которые пройдут в июне 2024. Подписчикам «Клерк.Премиум» — бесплатный доступ.

Календарь вебинаров для бухгалтера в июне 2024. Выбирайте и смотрите!
7
Инвестиции

Инвестиции в космические объекты пропишут в законе

Госдума приняла в первом чтении законопроект о государственно-частном партнерстве в сфере космической деятельности.

Лучшие спикеры, новый каждый день

Чем грозит неявка сотрудника на медосмотр

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

Все гранты на инновационное развитие освободили от налога

Компании, которые получают гранты на инновационное развитие, смогут не учитывать эти доходы при определении базы по налогу на прибыль.

Предприятия за каждого сотрудника из другого региона получат 300 тысяч рублей

Государство выделит субсидии бизнесу, который работает над крупным проектом и привлекает сотрудников из других регионов. Размер поддержки составит 12 МРОТ.

Опытом делятся эксперты-практики, без воды

За что заблокируют ваш счет? Что не нужно делать, чтобы «влететь» на блок

Сейчас в мире бизнеса идет война за темную и светлую сторону.

За что заблокируют ваш счет? Что не нужно делать, чтобы «влететь» на блок

Налоговые перспективы на 2025 год. Прогрессивная шкала НДФЛ

Какими будут налоговые ставки НДФЛ в 2025 году и можно ли этот налог оптимизировать.

🚚 Грузоперевозка в страну ЕАЭС может облагаться разным НДС

При сделках с контрагентами из стран ЕАЭС взимание косвенных налогов при работах, услугах идет в стране, территория которой признается местом реализации. При грузоперевозках место реализации – страна исполнителя.

МСФО

Внедрение азиатских МСФО на российский рынок

В данном докладе мы рассмотрим перспективы внедрения азиатских Международных стандартов финансовой отчетности (МСФО) на российский рынок.

Внедрение азиатских МСФО на российский рынок
1
Маркетплейсы

Цены на наушники на маркетплейсах оказались завышенными по сговору

ФАС выявила картель продавцов наушников на маркетплейсах. Продавцы общались в чате мессенджера, писали негативные комментарии конкурентам и заказывали наушники «в никуда».

💥 Бодрящие скидки на курсы повышения квалификации и профессиональной переподготовки! Ведем запись на первый летний поток обучения

Набираем первый летний поток-2024 на курсы повышения квалификации и переподготовки с максимальными скидками, чтобы вы не ограничивали траты на отпуск и получили полезные знания. Начало обучения 1 июня, присоединяйтесь!

💥 Бодрящие скидки на курсы повышения квалификации и профессиональной переподготовки! Ведем запись на первый летний поток обучения
2
Миникурсы, текстовые и видеоинструкции для бухгалтеров

Итоги 35 месяцев инвестиций. 3,83 млн рублей

1 июня, значит пора защищать детей и подводить итоги мая! Ежемесячно я пишу отчёт о том, что произошло с моими инвестициями. Напоминаю: я начал копить на квартиру в Сочи в июле 2021. 35 месяцев позади. Погнали!

Итоги 35 месяцев инвестиций. 3,83 млн рублей

Горящие глаза, «ген предпринимательства» и Борис Мальцев 

Студенты из акселератора «БизнесКуб» КубГУ, мечтая о собственных стартапах и предпринимательских прорывах, направлялись на встречу с успешными бизнесменами.

Горящие глаза, 
«ген предпринимательства» и 
Борис Мальцев 
1
Бесплатно с УСН

Как в 2024 году уменьшать налоги по УСН и ПСН на страховые взносы: таблица для ИП и ООО

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

Как в 2024 году уменьшать налоги по УСН и ПСН на страховые взносы: таблица для ИП и ООО

О чем говорят бухгалтеры — топ 5 обсуждаемых тем на этой неделе. 👂«Ночной бухгалтер» № 1694

Говорили не только о реформах, обычные рабочие проблемы никуда не делись. Кто-то в Китай не может перевести деньги, у кого-то налог на УСН — выпади глаза, а у кого-то вообще счета заблокировали. Но всегда есть коллеги-спасители, которые и словом утешат, и делом помогут.

Иллюстрация: Вера Ревина / Клерк.ру
Валюта

Стартовал сезон скупки долларов

Интерес к валюте вырос в преддверии сезона отпусков, на спрос также повлияло укрепление рубля.

3

Иван Никитенко: «Я точно не готов продавать душу и работать с клиентами-говнюками»

Это второй сезон проекта «ТоТ еще разговор». Хочется говорить с предпринимателями об их бизнесе. Мы пригласили краснодарского предпринимателя Ивана Никитенко.

Иван Никитенко: «Я точно не готов продавать душу и работать с клиентами-говнюками»
3
Банки

Доля просроченных микрозаймов сократилась до 32%

80% клиентов МФО получают займы дистанционно.

Интересные материалы

УСН

Изменения по УСН: НДС и новые лимиты

К каким переменам ИП и организациям на УСН надо приготовиться в 2024-2025 гг.

Иллюстрация: Вера Ревина/Клерк.ру