Ускоряем формирование отчета "Книга покупок"

30.10.15

Разработка - Запросы

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Книга покупок и книга продаж (zip-архив)
.zip 227,02Kb
51
51 Скачать (1 SM) Купить за 1 850 руб.

Итак, с помощью отладчика была обнаружена функция "ПолучитьДополнительнуюИнформациюПоСФДляКнигиПокупок", располагающаяся в общем модуле "УчетНДС" (или непосредственно в модуле отчета, в зависимости от версии отчета). Эта функция запросом собирает данные по всем номерам ГТД и странам происхождения товаров по списку документов, переданному в качестве параметра. Запрос состоит из множества подзапросов по табличным частям документов различных типов, объединенных через "ОБЪЕДИНИТЬ ВСЕ" и в каждом из этих подзапросов повторяется одно единственное условие "... ТаблицаТоваров.Ссылка В (&СписокСФ)":


// Дополнение по ГТД и стране происхождения
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ТаблицаТоваров.Ссылка КАК СчетФактура,
| ТаблицаТоваров.СтранаПроисхождения.Код КАК СтранаПроисхождения,
| ТаблицаТоваров.НомерГТД,
| СУММА(1) КАК КоличествоЭлементов
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Товары КАК ТаблицаТоваров
|ГДЕ
| ТаблицаТоваров.Ссылка В(&СписокСФ)
|
|СГРУППИРОВАТЬ ПО
| ТаблицаТоваров.Ссылка,
| ТаблицаТоваров.СтранаПроисхождения,
| ТаблицаТоваров.НомерГТД,
| ТаблицаТоваров.СтранаПроисхождения.Код
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ТаблицаТоваров.Ссылка,
| ТаблицаТоваров.СтранаПроисхождения.Код,
| ТаблицаТоваров.НомерГТД,
| СУММА(1)
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Оборудование КАК ТаблицаТоваров
|ГДЕ
| ТаблицаТоваров.Ссылка В(&СписокСФ)
|
|СГРУППИРОВАТЬ ПО
| ТаблицаТоваров.Ссылка,
| ТаблицаТоваров.СтранаПроисхождения,
| ТаблицаТоваров.НомерГТД,
| ТаблицаТоваров.СтранаПроисхождения.Код


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

Было решено немного переделать это безобразие, использовав для хранения списка документов проиндексированную временную таблицу, а вхождение документа в эту таблицу отрабатывать через "ВНУТРЕННЕЕ СОЕДИНЕНИЕ". Т.е. текст проблемного условия фактически заменяем на текст: "... ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТСписокСчетовФактур КАК СписокСчетовФактур ПО ТаблицаТоваров.Ссылка = СписокСчетовФактур.СчетФактура", где "СписокСчетовФактур" - это наша временная таблица.

Вот кусок кода, который преобразует исходный запрос:

 

Запрос.УстановитьПараметр("СписокСФ", СписокСчетовФактур);


//--> ДОРАБОТКА (замена в запросе условий "ГДЕ Документ В &СписокСФ" на "ВНУТРЕННЕЕ СОЕДИНЕНИЕ" к временной таблице)

//заменим тексты условий на наш текст с внутренним соединением

//если поле с именем "Ссылка"
Запрос.Текст = СтрЗаменить(Запрос.Текст, "ГДЕ
| ТаблицаТоваров.Ссылка В(&СписокСФ)",
"ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТСписокСчетовФактур КАК СписокСчетовФактур
| ПО ТаблицаТоваров.Ссылка = СписокСчетовФактур.СчетФактура");

//если поле с именем "СчетФактура"
Запрос.Текст = СтрЗаменить(Запрос.Текст, "ГДЕ
| ТаблицаТоваров.СчетФактура В(&СписокСФ)",
"ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТСписокСчетовФактур КАК СписокСчетовФактур
| ПО ТаблицаТоваров.СчетФактура = СписокСчетовФактур.СчетФактура");

//сформируем таблицу значений с одной единственной типизированной колонкой СчетФактура для передачи ее в качестве параметра запроса
ТаблицаСчетовФактур = Новый ТаблицаЗначений;
ТаблицаСчетовФактур.Колонки.Добавить("СчетФактура", Новый ОписаниеТипов(Документы.ТипВсеСсылки()));
Для Каждого СФ Из СписокСчетовФактур Цикл
       ТаблицаСчетовФактур.Добавить().СчетФактура = СФ;
КонецЦикла;

Запрос.УстановитьПараметр("ТаблицаСчетовФактур", ТаблицаСчетовФактур);

//добавим в начало исходного запрос текст создания временной таблицы на основании ТЗ ТаблицаСчетовФактур, не забывая добавить индекс по полю СчетФактура
Запрос.Текст = "
|ВЫБРАТЬ СчетФактура КАК СчетФактура
|ПОМЕСТИТЬ ВТСписокСчетовФактур
|ИЗ &ТаблицаСчетовФактур КАК ТаблицаСчетовФактур
|ИНДЕКСИРОВАТЬ ПО СчетФактура
|;
|
|" + Запрос.Текст;

//
ГТДпоСФ = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);

 

Итак, результаты замеров производительности - ~600 секунд до оптимизации запроса против ~4 секунд после (см. картинку в блоке скриншотов). Результаты были получены при количестве строк в книге покупок около 15 000. Приведен результат лишь одного сравнительного замера, хотя замеры делались несколько раз для исключения фактора везения :) Замеры были сделаны  на "боевом" среднезагруженном SQL в рабочее время и результаты естественно немного разнились. Несмотря на все оговорки и прямолинейность методики тестирования, можно довольно уверенно констатировать, что профит от доработок довольно ощутим.

 

Примечания:

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

- в качестве подопытного выступал отчет "Книга покупок по Постановлению № 1137" (Бухгалтерия КОРП 2.0.46.5), но все изложенное, скорее всего, применимо и к другим версиям отчета, в т.ч. из других релизов. Во всяком случае, в Бухгалтерии 3.0 проблемная функция осталась неизменной.

 

См. также:

Ускоряем заполнение документа "Формирование записей книги покупок"

 

 К публикации приложены доработанные версии отчетов "Книга покупок", "Книга покупок по Постановлению № 1137" , "Книга продаж по Постановлению  № 1137" (Бухгалтерия КОРП 2.0).

Обновления:

30.10.2015 - добавлена версия отчета "Книга покупок по Постановлению № 1137" (Бухгалтерия предприятия КОРП 2.0.64.35)

книга покупок

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    184667    1029    403    

967

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Данный инструмент помогает анализировать доработанную конфигурацию после обновления на новый релиз и находить «битые» тексты запросов, в которых участвуют несуществующие в новом релизе метаданные.

2 стартмани

06.02.2025    2198    17    XilDen    26    

36

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

В статье приведена удобная возможность отладки исполняемого запроса динамического списка.

03.12.2024    5731    artemusII    11    

23

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    13135    sergey279    18    

66

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    8215    XilDen    36    

90

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

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

20.08.2024    3191    PROSTO-1C    0    

23

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    10797    user1840182    5    

29
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sanjabor 17 17.10.13 22:52 Сейчас в теме
В типовой книге продаж обращал внимание, что во многих местах тоже используется В. Надо попробовать переписать, намечается база с книгой строк на 50 000 за месяц.
2. tango 546 17.10.13 22:59 Сейчас в теме
отлично. (плюс не дает брозер поставить: завтра уж на рабочем месте)
3. tango 546 18.10.13 10:15 Сейчас в теме
апну, как образец достойной публикации
4. Mi4man 175 18.10.13 17:14 Сейчас в теме
Вы писали:
Ведь, как известно, условия с использованием "В" могут работать просто до неприличия долго
. Можете подсказать где можно почитать подобные приемы ?
5. KAPACEB.AA 470 18.10.13 17:48 Сейчас в теме
(4) Mi4man,

Например, здесь:
http://its.1c.ru/db/metod81#content:2499:1
корум; ojiojiowka; Aleskey_K; Mi4man; +4 Ответить
6. friday1 18.10.13 23:17 Сейчас в теме
книга покупок у вас долго формируется? обычно довольно быстро..
7. den_valley 235 05.11.13 12:08 Сейчас в теме
Лови плюс, классная статья, все по полочкам разложил и отчет супер.
У меня с 3 часов до 2 минут время формирования уменьшилось!
8. KAPACEB.AA 470 05.11.13 12:37 Сейчас в теме
(7) den_valley,
Спасибо! Рад, что пригодилось)
9. den_valley 235 05.11.13 13:02 Сейчас в теме
Книгу продаж тоже переделал, там конечно не так все паршиво было, но все-таки с 10 минут до одной уменьшилось.
Как всегда 1C-ка в своем репертуаре, умудряется не соблюдать собственные же рекомендации :)
корум; ojiojiowka; vladir; ixijixi; KAPACEB.AA; +5 Ответить
10. b-dm 177 16.01.14 14:47 Сейчас в теме
скачал,попробовал применить ,не взлетело.скорее всего тормоза не в этом.
кроме того, сейчас уже релиз 2.0.54 на дворе и этот кусок переместился в общий модуль УчетНДС, а вызывается в УчетНДСКлиент в СоответствиеСтрокиДопИнформацииПоСчетуФактуре.
11. KAPACEB.AA 470 17.01.14 15:49 Сейчас в теме
Добавил в приложенный к публикации архив доработанную версию отчета "Книга покупок по Постановлению № 1137" из Бухгалтерии 2.0.54.9.
12. SergeyRomanov 124 27.01.14 12:33 Сейчас в теме
Большое тебе спасибо! Выручил! У меня при формировании за год книги покупок ошибка Сеанс завершен администратором! (буха на 64x SQL и 64x 1C сервере - 160 Гб). Хотел уж было сам выискивать слабые места в отчёте - но правильный запрос в поисковике и твой отчёт сделали мои мучения не продолжительные. Отчёт теперь формируется за 15 минут, а то висел около часу, а потом ошибка. (помогает также в таких больших базах справиться с ошибкой - пере индексация с пересчётом итогов - но скорости тестирование особо не даёт).
Спасибо!
KAPACEB.AA; +1 Ответить
13. soap 67 13.02.14 14:36 Сейчас в теме
спасибо Очень логично и толково описан подход и метод
14. EugenLiquor 06.03.14 17:53 Сейчас в теме
В принципе все довольно понятно изложено, но опять же, могут возникнуть некоторые программные сбои
15. bashinsky 152 26.12.14 12:04 Сейчас в теме
Тоже с эти столкнулся, переписал запрос как советует автор, теперь все летает, бухи в экстазе. Автору плюс
16. user632424_gegammarkaryan1 07.09.17 11:53 Сейчас в теме
Большое спасибо автору статьи!
17. alex_bitti 98 24.05.19 14:48 Сейчас в теме
спасибо автору. Прошло столько лет ничего не поменялось, только процедура переместилась в модуль объекта КнигаПокупок, может полезно будет если кто использует еще бух 2.0
18. b-dm 177 27.05.19 11:09 Сейчас в теме
Ну кстати да, реально помогала доработка автора, прошло столько лет вспоминаю с благодарностью. хотя уже давно не пользуюсь БУХ 2.0.
Оставьте свое сообщение