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

13.12.17

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

В одной из своих публикаций я уже затрагивал вопрос неоптимальной работы подсистемы учета НДС в условиях больших объемов данных. На этот раз попробуем ускорить заполнение документа "Формирование записей книги покупок", а, точнее, один из ее разделов "Вычет по приобретенным ценностям".

Скачать файл

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

Наименование По подписке [?] Купить один файл
Обработка заполнения "Вычет по приобретенным ценностям"
.epf 18,60Kb
3
3 Скачать (1 SM) Купить за 1 850 руб.

Буду краток. В процедуре УчетНДС.ОпределитьНаличиеСчетовФактурПолученных был изменен способ обращения к временной таблице счетов-фактур, использующейся для отбора при выборке из физических таблиц документов. Условие "ГДЕ Ссылка В (ВЫБРАТЬ ...)" было преобразовано во внутреннее соединение:

 

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

 

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

В результате этих изменений MSQL Server стал строить эффективный план запроса, с использованием всех доступных ему индексов, чего, к сожалению, не удавалось добиться при типовом написании запроса.

План запроса до оптимизации:

План запроса до оптимизации

Видим, что на каждом этапе происходит сканирование таблиц без использования индексов. Две большие таблицы 121 тыс. строк и 48 тыс. строк соединяются перебором в цикле и количество обработанных строк доходит до 6 миллиардов при всего 3-х строках в конечной выборке.

План запроса после оптимизации:

План запроса после оптимизации

Здесь все красиво - исходные таблицы сразу отфильтрованы по индексу и на всем протяжении происходит обработка всего 3-х строк.

На моей базе (SQL Server 2005) время выполнения запроса уменьшилось с порядка 2000-3000 секунд до 10-30 секунд. Как на Вашей конкретной базе сработает оптимизатор - это вопрос, но, если скорость заполнения у Вас катастрофически низкая, то попробовать методику стоит.

Для себя из этой истории я сделал один простой вывод - использовать условие "ГДЕ В ()" надо очень и очень аккуратно, особенно в условиях неявных соединений нескольких физических таблиц (в данном случае соединялись таблицы документа и его табличной части ДокументыОснования). Не помог даже тот факт, что временная таблица СФ была проиндексирована - оптимизатор совершенно проигнорировал этот факт и не воспользовался преимуществом индекса.

 

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

 

К публикации приложена внешняя обработка заполнения табличной части "Вычет по приобретенным ценностям" документа (создана на базе релиза Бухгалтерия предприятия КОРП 2.0.64.35) . 

 

Книга покупок НДС Бухгалтерия 2.0 производительность скорость заполнение Формирование записей книги покупок

См. также

SALE! 15%

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159453    874    399    

861

Операции по ВЭД Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Мастера заполнения Бухгалтер Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

СКАЧАЙТЕ И ПОПРОБУЙТЕ БЕСПЛАТНО! Данная обработка расширяет функционал типовой конфигурации «1С:Бухгалтерия предприятия» и позволяет осуществлять автоматическое заполнение ГТД в документах «Реализация товаров и услуг», «Списание товаров», «Отчет о розничных продажах», «Отчет комиссионера (агента) о продажах», «Требование-накладная», «Возврат товаров от покупателя», «Комплектация номенклатуры», «Безвозмездная передача», «Отчет производства за смену». Обработка предназначена для работы в конфигурации «1С:Бухгалтерия предприятия 8, редакция 3.0» Есть версия обработки оптимизированная для работы в 1CFresh

9600 руб.

19.06.2012    138950    264    81    

223

Обмен с ГосИС Мастера заполнения WEB-интеграция Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет Оперативный учет Управляемые формы 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Универсальное расширение конфигурации для автоматической загрузки и заполнения реквизитов контрагентов (партнеров) из ОГРН для 1С:ERP Управление предприятием 2 (1С:ERP Управление предприятием 2, редакция 2.4), 1С:ERP Управление предприятием 2 (1С:ERP Управление предприятием 2, редакция 2.2), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.5), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.4), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.3), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.2), 1С:Комплексная автоматизация 8 (1С:Комплексная автоматизация, редакция 2.4), 1С:Комплексная автоматизация 8 (1С:Комплексная автоматизация, редакция 2.2), 1С:Комплексная автоматизация 8 (1С:Комплексная автоматизация, редакция 2.0) и 1С:Бухгалтерия 8 (Бухгалтерия предприятия, редакция 3.0).

3900 руб.

08.11.2017    63795    406    295    

73

Мастера заполнения Нейросети Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Платные (руб)

Расширение для заполнения описания товара (номенклатуры) с помощью модели ИИ ChatGPT с ключевыми словами. Расширение формирует продающее описание товара по его наименованию с помощью модели искусственного интеллекта. Будет полезно для владельцев интернет магазинов, каталогов товаров и продающих через маркетплейсы. Адаптировано для основных конфигураций: УТ, ЕРП, КА, УНФ. Прошло аудит на 1cfresh.com. Версия для автоматического заполнения

5000 руб.

13.03.2023    17953    46    49    

75

Мастера заполнения Платформа 1С v8.3 1С:Управление торговлей 11 Россия Платные (руб)

Если вы устали каждый раз выбирать один и тот же договор из множества других при оформлении документов, это расширение для вас! Пометьте один договор как основной и это избавит вас от рутинного поиска необходимого договора.

4560 руб.

26.01.2023    5573    12    1    

9

Обмен с ГосИС Мастера заполнения Системный администратор Бухгалтер Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Простое решение по автоматическому заполнению реквизитов контрагентов (юридических и физических лиц) по ИНН и наименованию. Может использоваться в любых конфигурациях 1С Предприятие 8: УТ 10.2, УТ 10.3 и т.д. Обновление механизмов 2022 года! Программный код открыт.

1200 руб.

23.07.2015    64785    311    15    

180
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Eksterulo 25.11.15 15:20 Сейчас в теме
Спасибо. Это интересная идея из разряда "шаманство". Проверил на БП 3.0.42 (под 8.3.6) - действительно эффект есть.
Однако эффект вроде бы не поражает воображение. Наверное моя база не такая впечатляющая: заполнение документа полторы минуты длится.
  • На MSSQL 2008 и PostGre у меня и так всё срабатывало за 2-3 секунды.
  • В Oracle всё страшно. Но "1С" сказала, что в 8.3.7 как раз "В (&Параметр)" они страшно оптимизировали, и всё шустро залетает.
  • Те, кто пользуются файловой базой, лежащей в сети, тоже могут увидеть эффект. Но у них столько данных не наберётся, чтобы невооружённым глазом заметить ускорение на десяток процентов.
2. KAPACEB.AA 466 02.12.15 08:29 Сейчас в теме
(1) Eksterulo,
Спасибо за проявленный интерес к публикации. На самом деле не такое уж и шаманство :) Скорее, это очередное подтверждение известной рекомендации избегать явных и неявных (в случае виртуальных таблиц) вложенных запросов как при соединении так и в условиях. К сожалению, SQL сервер не всегда оптимально их отрабатывает, путаясь с вычислением предполагаемого количества записей при формировании плана запроса. На этапе разработки, на "маленьких" данных, все может прекрасно работать, а при разрастании базы быстрый запрос вдруг становится неадекватным.
3. DoctorRoza 08.12.15 13:46 Сейчас в теме
Автор, молоток! Плюсанул, в том числе и по Книге покупок! :)
Оставьте свое сообщение