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

13.12.17

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

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

Файлы

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

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

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

 

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

 

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

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

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

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

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

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

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

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

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

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

 

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

 

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

 

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

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

См. также

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

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

15500 руб.

02.09.2020    218201    1194    413    

1055

SALE! 50%

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

Корректируйте банковские документы быстро и легко! Создайте правило обработки, и оно автоматически применится при загрузке выписки, экономя ваше время. Решение позволяет автоматически заполнять расшифровку платежа, исключать загрузку ненужных документов (дублей) из банка, заполнять комиссию за эквайринг и многое другое. Вам не нужно доплачивать за алгоритмы, они уже включены в решение. Автоматическая обработка применяется при загрузке данных как из файлов клиент банка, так и через DirectBank.

15000 руб.

20.12.2024    10866    39    24    

40

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

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

9600 руб.

19.06.2012    143093    295    81    

244

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

Данное расширение автоматически заполняет бизнес-регион партнера в 1С (УТ 11, КА 2, ERP) при записи на основании КПП или индекса из адреса. Присутствует возможность сохранить имеющиеся бизнес-регионы партнеров, а также перезаполнить или очистить их при первичном заполнении. Возможен выбор региона по умолчанию для партнера без КПП или адреса (например, если вы не указываете адреса физ. лиц и знаете, что они из Вашего региона).

5010 руб.

29.04.2019    35191    71    51    

75

SALE! 50%

Регламентированный учет и отчетность Мастера заполнения Бухгалтер 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Налоговый учет ЕСН Платные (руб)

Обработка позволяет создавать документы "Сведения об уплате налогов на едином налоговом счете" по данным файла операций из личного кабинета ЕНС сайта ФНС в конфигурации 1С:Бухгалтерия предприятия 3.0.

10000 5000 руб.

22.11.2024    2532    16    4    

17

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

Расширение для типовых конфигураций 1С:БП 3.0 и 1С:УНФ 3.0 добавляет в справочник "Контрагенты" поля "Код ОКВЭД" и "Наименование ОКВЭД" и заполняет их по ИНН контрагента через сервис "1С-Контрагент"

7200 руб.

28.10.2024    1717    5    0    

6

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

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

5000 руб.

26.01.2023    6839    14    1    

10
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 470 02.12.15 08:29 Сейчас в теме
(1) Eksterulo,
Спасибо за проявленный интерес к публикации. На самом деле не такое уж и шаманство :) Скорее, это очередное подтверждение известной рекомендации избегать явных и неявных (в случае виртуальных таблиц) вложенных запросов как при соединении так и в условиях. К сожалению, SQL сервер не всегда оптимально их отрабатывает, путаясь с вычислением предполагаемого количества записей при формировании плана запроса. На этапе разработки, на "маленьких" данных, все может прекрасно работать, а при разрастании базы быстрый запрос вдруг становится неадекватным.
3. DoctorRoza 08.12.15 13:46 Сейчас в теме
Автор, молоток! Плюсанул, в том числе и по Книге покупок! :)
Для отправки сообщения требуется регистрация/авторизация