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

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 производительность скорость заполнение Формирование записей книги покупок

См. также

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

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

15500 руб.

02.09.2020    180176    1001    403    

954

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

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

12000 руб.

20.12.2024    6471    11    14    

14

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

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

9600 руб.

19.06.2012    140241    274    81    

232

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

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

2000 руб.

29.04.2019    33932    60    51    

63

Обмен с ГосИС Мастера заполнения 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    64811    408    298    

76

Закрытие периода Мастера заполнения Бухгалтер Платформа 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Комплексная автоматизация 2.х Бухгалтерский учет Налоговый учет УСН Платные (руб)

При формировании КУДиР при УСН часто возникает множество вопросов и проблем, к.т.: 1. Как выполняется заполнение книги учета доходов и расходов 2. Неправильно формируется книга учета доходов и расходов в 1С а). Доходы / расходы не попадают в КУДиР; б). Доходы / расходы попадают, но не принимаются к учету и многие другие ошибки. При правильном учёте, книга формируется корректно, но идеальный учет это скорее фантастика, для реальных случаев можно использовать специальный инструмент. Обработка предназначена для заполнения КУДиР. Версия для актуальных конфигураций на управляемых формах поддерживает один механизм заполнения - от бухгалтерской проводки. Старый метод автоматизации штатного заполнения присутствует в отдельной версии для обычных форм.

5880 руб.

12.03.2014    134460    81    97    

108
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 Сейчас в теме
Автор, молоток! Плюсанул, в том числе и по Книге покупок! :)
Оставьте свое сообщение