gifts2017

Ускоряем проведение многострочных документов в БП...

Опубликовал Юрий П (nano1c) в раздел Администрирование - Оптимизация БД (HighLoad)

Скорость проведения документов, содержащих тысячи строк, в типовой БП невелика, но есть простое решение этой проблемы.

Скорость проведения документов, содержащих тысячи строк, в типовой БП невелика. Зависимость ее от количества строк очень нелинейна. Таким образом, разбивая таблицу товаров при проведении на подтаблицы, можно значительно ускорить проведение.

 

По х - сотни строк, по y- секунды.
Типовая 1С 8.2 БП, документ - реализация.
Нижний график - усовершенствованный механизм (решение ниже), вверху - типовой. 

Простейший пример усовершенствования: Вместо строки в модуле проведения:

 

УправлениеЗапасамиПартионныйУчет.ДвижениеПартийТоваров(Заголовок, ТаблицаПоТоварам, Истина, СтруктураШапкиДокумента.ОтражатьВНалоговомУчетеУСН, Отказ, , СодержаниеПроводки);


Вставляем блок:

 

              

 Если ТаблицаПоТоварам.Колонки.Найти("ПодразделениеОрганизации") = Неопределено Тогда

                               ТаблицаПоТоварам.Колонки.Добавить("ПодразделениеОрганизации");

                КонецЕсли;

               

                Если ТаблицаПоТоварам.Колонки.Найти("СписанныеПартии") = Неопределено Тогда

                               ТаблицаПоТоварам.Колонки.Добавить("СписанныеПартии");

                КонецЕсли;

               

                Если ТаблицаПоТоварам.Колонки.Найти("ДоговорПоставщика") = Неопределено Тогда

                               ТаблицаПоТоварам.Колонки.Добавить("ДоговорПоставщика");

                КонецЕсли;

               

                Для Индекс = 1 По 3 Цикл

                               Если ТаблицаПоТоварам.Колонки.Найти("КорСубконтоСписания" + Индекс) = Неопределено Тогда

                                               ТаблицаПоТоварам.Колонки.Добавить("КорСубконтоСписания" + Индекс);

                               КонецЕсли;

                КонецЦикла;

               

                Если ТаблицаПоТоварам.Колонки.Найти("СписыватьПоУказаннойСтоимости") = Неопределено Тогда

                               ТаблицаПоТоварам.Колонки.Добавить("СписыватьПоУказаннойСтоимости", Новый ОписаниеТипов("Булево"));

                КонецЕсли;

               

                Если ТаблицаПоТоварам.Колонки.Найти("Себестоимость") = Неопределено Тогда

                               ТаблицаПоТоварам.Колонки.Добавить("Себестоимость");

                КонецЕсли;

       

                колвоСтрок = ТаблицаПоТоварам.количество();

                если  колвоСтрок>400 тогда

                ТаблицаПоТоварам2 = ТаблицаПоТоварам.СкопироватьКолонки();

                              

                               для каждого с из ТаблицаПоТоварам цикл

                               сс=ТаблицаПоТоварам2.добавить();

                               ЗаполнитьЗначенияСвойств(сс,с);

                               индескСтроки = ТаблицаПоТоварам.индекс(с)+1;

                               дробь=индескСтроки/300;

                               если окр(дробь) = дробь или индескСтроки = колвоСтрок тогда

                               УправлениеЗапасамиПартионныйУчет.ДвижениеПартийТоваров(Заголовок, ТаблицаПоТоварам2, Истина, СтруктураШапкиДокумента.ОтражатьВНалоговомУчетеУСН, Отказ, , СодержаниеПроводки);

                               для каждого ст из ТаблицаПоТоварам2 цикл   //передаем измененную подтаблицу в таблицу..

                                               стт=ТаблицаПоТоварам.найти(ст.номерстроки,"НомерСтроки");

                                               ЗаполнитьЗначенияСвойств(стт,ст);

                               конеццикла;

                               ТаблицаПоТоварам2.очистить();

                               конецесли;

                               конеццикла;

 

                иначе   

                УправлениеЗапасамиПартионныйУчет.ДвижениеПартийТоваров(Заголовок, ТаблицаПоТоварам, Истина, СтруктураШапкиДокумента.ОтражатьВНалоговомУчетеУСН, Отказ, , СодержаниеПроводки);

                конецесли;


 

 

Резюме: разбиение только в движении партий позволяеет приблизить зависимость времени проведения от количества строк к линейной. Точнее эта зависимость имеет не столь выраженную нелинейность, и экономия времении проведения может быть в разы. Добавлю, что использовался серверный вариант БД, версия 1С - 8.2.13.219, но примерное такие же графики были получены и на сервреной версии 8.1. Использовался режим "первого проведения" - второе проведение тойже последовательности документов дает более гладкую кривую и меньшие времена проведений.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Максим Полянский (yandextesting) 31.05.11 15:16
может ускоряем, а не убыстряем?
2. Артур Аюханов (artbear) 31.05.11 16:22
Интересная мысль, что-то подобное я уже видел вроде бы.
У меня также в последнее время в БП проведение начало хромать, хотя объемы не сильно выросли.
ЗЫ оформи публикацию получше, плиз, - почитай рекомендации http://infostart.ru/public/66592/
Особенно Разукрашку рекомендую.
Vladal; nano1c; +2 Ответить 1
3. Алексей Константинов (alexk-is) 31.05.11 16:29
artbear пишет:
Интересная мысль, что-то подобное я уже видел вроде бы.
(2) Ага. Вот здесь
4. Артур Аюханов (artbear) 31.05.11 16:49
(3) Нет, по 77 это давно известно. я именно по 8-ке где-то видел :)
5. Алексей Константинов (alexk-is) 31.05.11 16:53
(4) А в чем принципиальная разница?
6. Артур Аюханов (artbear) 31.05.11 16:56
(5) Разница в надежде, что в 8-ке нет этой проблемы - нелинейная зависимость времени проведения от количества строк в таблице :)
7. Александр Медведев (anig99) 01.06.11 08:28
Действительно... Статья хромает. Не раскрыта суть, оформление отсутствует. Не понятно ЧТО поменялось - текст "до" и "после"
8. Александр Орефков (orefkov) 01.06.11 11:20
А никто не рыл, где именно собака порылась?
Все-таки нелинейность говорит о каких-то косяках в движке.
Пусть даже строгой линейности нет, но пусть хотя бы N*Log(N), а то по графику больше на N^2 тянет...
9. Артур Аюханов (artbear) 01.06.11 11:36
(0) Кстати, ты не указал версию СУБД!
СКЛ ?
Надеюсь, минимум Скуль 2005 ?
10. Валерий Дубовой (Valerich) 02.06.11 05:33
(8) думаю причина кроется в формировании итогов по регистрам, затронутым в проведении. Ведь в них при изменении набора записей должны пересчитаться подитоги, чтобы потом виртуальные таблицы работали быстро.
Ведь в принципе регистры - это тот же OLAP, только подготовка "размазана" во времени, выполняется во время записи в регистр.
11. Валерий Дубовой (Valerich) 02.06.11 05:34
а вообще система триггеров на уровне СКЛ сервера значительно ускорила бы этот процесс. но у спецов 1С что-то плохо с этим...
12. Юрий П (nano1c) 02.06.11 15:11
да, MS SQL 2005
замерял скорости только на БП, надо бы на УТ попробовать.. RLS отключен.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа