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

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С.

12000 руб.

02.09.2020    169275    937    403    

905

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

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

9600 руб.

19.06.2012    139411    265    81    

225

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

Если вам нужно корректировать банковские документы, это расширение — именно то, что вам нужно! Создайте правило обработки, укажите, как заполнять документы, и оно автоматически применится при загрузке банковской выписки. Это значительно сократит время и усилия на корректировку. Расширение легко устанавливается в большинство современных конфигураций 1С:УТ 11.5, 1С:ERP 2.5, 1С:КА 2.5, 1С:УНФ 3.0, Розница 3.0

12000 руб.

20.12.2024    602    2    2    

4

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

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

2000 руб.

29.04.2019    33539    59    51    

61

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

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

5000 руб.

13.03.2023    18432    47    50    

76

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

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

1200 руб.

23.07.2015    64954    313    15    

183

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

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

7200 руб.

28.10.2024    445    1    0    

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