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

31.05.11

База данных - HighLoad оптимизация

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

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

 

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

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

 

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


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

 

              

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

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

                КонецЕсли;

               

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

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

                КонецЕсли;

               

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

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

                КонецЕсли;

               

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

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

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

                               КонецЕсли;

                КонецЦикла;

               

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

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

                КонецЕсли;

               

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

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

                КонецЕсли;

       

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

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

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

                              

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

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

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

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

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

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

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

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

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

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

                               конеццикла;

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

                               конецесли;

                               конеццикла;

 

                иначе   

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

                конецесли;


 

 

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

Вступайте в нашу телеграмм-группу Инфостарт

См. также

HighLoad оптимизация Программист 1С 8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Использование оператора «В» для полей или данных составного типа (например, Регистратор) может приводить к неочевидным проблемам.

10.11.2025    6514    ivanov660    48    

52

HighLoad оптимизация Программист 1С:Предприятие 8 1C:ERP Бесплатно (free)

Приведем примеры использования различных в динамических списках и посмотрим, почему это плохо.

18.02.2025    8926    ivanov660    39    

61

HighLoad оптимизация Технологический журнал Системный администратор Программист Бесплатно (free)

Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.

24.06.2024    11367    ivanov660    13    

64

HighLoad оптимизация Программист 1С:Предприятие 8 Бесплатно (free)

Метод очень медленно работает, когда параметр приемник содержит намного меньше свойств, чем источник.

06.06.2024    17636    Evg-Lylyk    73    

46

HighLoad оптимизация Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    8669    spyke    29    

54

HighLoad оптимизация Программист 1С:Предприятие 8 Бесплатно (free)

Оказывается, в типовых конфигурациях 1С есть, что улучшить!

13.03.2024    12064    vasilev2015    22    

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