Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 14:00

Тормозит при проведении

Автор akaipbay, 03 авг 2016, 13:10

0 Пользователей и 1 гость просматривают эту тему.

akaipbay

Добрый день!

Подскажите пожалуйста, при проведении документа есть такой запрос (ниже). Он очень долго Выполняется(), в чем может быть причина? Как его можно оптимизировать или ускорить подскажите?

Процедура ЗаполнитьТаблицуОстатковНДС(ДатаК,Склад,СписСчетов,тбОстСтатей) экспорт
зпОст = новый Запрос;
текстОст =
"ВЫБРАТЬ
| ВложНДС.Счет,
| ВложНДС.Склад,
| ВложНДС.СтатьяЗатрат,
| ВложНДС.ОстНДС,
| ВложСчета.ОстатокСтатьи,
| ВЫБОР
| КОГДА ЕСТЬNULL(ВложСчета.ОстатокСтатьи, 0) = 0
| ТОГДА 0
| ИНАЧЕ ВложНДС.ОстНДС / ВложСчета.ОстатокСтатьи
| КОНЕЦ КАК коэфф,
| ВложНДС.КолОстНДС
|ИЗ
| (ВЫБРАТЬ
| УслНДС_ОИОб.Счет КАК Счет,
| УслНДС_ОИОб.Склад КАК Склад,
| УслНДС_ОИОб.СтатьяЗатрат КАК СтатьяЗатрат,
| СУММА(НАК_УслНДС_ОИОб.СуммаНДСНачальныйОстаток + УслНДС_ОИОб.СуммаНДСПриход) КАК ОстНДС,
| СУММА(НАК_УслНДС_ОИОб.КоличествоНачальныйОстаток + УслНДС_ОИОб.КоличествоПриход) КАК КолОстНДС
| ИЗ
| РегистрНакопления.УслугиПроизводствоНДС.ОстаткиИОбороты(&ДатаНач, &ДатаКон, Период, , Счет В ИЕРАРХИИ (&СписСчетов)) КАК НАК_УслНДС_ОИОб
| ГДЕ
| ВЫБОР
| КОГДА &Склад <> 0
| ТОГДА УслНДС_ОИОб.Склад = &Склад
| ИНАЧЕ ИСТИНА
| КОНЕЦ
|
| СГРУППИРОВАТЬ ПО
| УслНДС_ОИОб.Счет,
| УслНДС_ОИОб.Склад,
| УслНДС_ОИОб.СтатьяЗатрат) КАК ВложНДС
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ВЫБОР
| КОГДА ТОИОб.Счет = &счет2621_1
| ТОГДА &счет2612_1
| КОГДА ТОИОб.Счет = &счет2622_6
| ТОГДА &счет2613_5
| КОГДА ТОИОб.Счет = &счет2622_1
| ТОГДА &счет2613_1
| ИНАЧЕ ТОИОб.Счет
| КОНЕЦ КАК Счет,
| ВЫБОР
| КОГДА ПОДСТРОКА(ТОИОб.Счет.Код, 1, 4) = ""2613""
| ИЛИ ПОДСТРОКА(ТОИОб.Счет.Код, 1, 4) = ""2621""
| ИЛИ ПОДСТРОКА(ТОИОб.Счет.Код, 1, 4) = ""2622""
| ТОГДА ТОИОб.Субконто1
| ИНАЧЕ ТОИОб.Субконто2
| КОНЕЦ КАК Склад,
| ВЫБОР
| КОГДА ПОДСТРОКА(ТОИОб.Счет.Код, 1, 4) = ""2613""
| ИЛИ ПОДСТРОКА(ТОИОб.Счет.Код, 1, 4) = ""2621""
| ИЛИ ПОДСТРОКА(ТОИОб.Счет.Код, 1, 4) = ""2622""
| ТОГДА ТОИОб.Субконто2
| ИНАЧЕ ТОИОб.Субконто3
| КОНЕЦ КАК СтатьяЗатрат,
| СУММА(ВЫБОР
| КОГДА ТОИОб.Счет = &счет2621_1
| ИЛИ ТОИОб.Счет = &счет2622_6
| ИЛИ ТОИОб.Счет = &счет2622_1
| ТОГДА -ТОИОб.СуммаНачальныйОстатокКт
| ИНАЧЕ ТОИОб.СуммаНачальныйОстатокДт + ТОИОб.СуммаОборотДт
| КОНЕЦ) КАК ОстатокСтатьи
| ИЗ
| РегистрБухгалтерии.Типовой.ОстаткиИОбороты(&ДатаНач, &ДатаКон, Период, , Счет В ИЕРАРХИИ (&СписСчетов), , ) КАК ТОИОб
| ГДЕ
| ВЫБОР
| КОГДА &Склад <> 0
| ТОГДА ВЫБОР
| КОГДА ПОДСТРОКА(ТОИОб.Счет.Код, 1, 4) = ""2613""
| ИЛИ ПОДСТРОКА(ТОИОб.Счет.Код, 1, 4) = ""2621""
| ИЛИ ПОДСТРОКА(ТОИОб.Счет.Код, 1, 4) = ""2622""
| ТОГДА ТОИОб.Субконто1 = &Склад
| ИНАЧЕ ТОИОб.Субконто2 = &Склад
| КОНЕЦ
| ИНАЧЕ ИСТИНА
| КОНЕЦ
|
| СГРУППИРОВАТЬ ПО
| ВЫБОР
| КОГДА ТОИОб.Счет = &счет2621_1
| ТОГДА &счет2612_1
| КОГДА ТОИОб.Счет = &счет2622_6
| ТОГДА &счет2613_5
| КОГДА ТОИОб.Счет = &счет2622_1
| ТОГДА &счет2613_1
| ИНАЧЕ ТОИОб.Счет
| КОНЕЦ,
| ВЫБОР
| КОГДА ПОДСТРОКА(ТОИОб.Счет.Код, 1, 4) = ""2613""
| ИЛИ ПОДСТРОКА(ТОИОб.Счет.Код, 1, 4) = ""2621""
| ИЛИ ПОДСТРОКА(ТОИОб.Счет.Код, 1, 4) = ""2622""
| ТОГДА ТОИОб.Субконто1
| ИНАЧЕ ТОИОб.Субконто2
| КОНЕЦ,
| ВЫБОР
| КОГДА ПОДСТРОКА(ТОИОб.Счет.Код, 1, 4) = ""2613""
| ИЛИ ПОДСТРОКА(ТОИОб.Счет.Код, 1, 4) = ""2621""
| ИЛИ ПОДСТРОКА(ТОИОб.Счет.Код, 1, 4) = ""2622""
| ТОГДА ТОИОб.Субконто2
| ИНАЧЕ ТОИОб.Субконто3
| КОНЕЦ) КАК ВложСчета
| ПО ВложНДС.Счет = ВложСчета.Счет
| И ВложНДС.Склад = ВложСчета.Склад
| И ВложНДС.СтатьяЗатрат = ВложСчета.СтатьяЗатрат"
;

зпОст.Текст = текстОст;
зпОст.УстановитьПараметр("ДатаНач",НачалоМесяца(ДатаК));
зпОст.УстановитьПараметр("ДатаКон",КонецМесяца(ДатаК));
зпОст.УстановитьПараметр("СписСчетов",СписСчетов);
зпОст.УстановитьПараметр("Склад",Склад);

счет2612_1 = ПланыСчетов.Типовой.НайтиПоКоду("2612.1");
счет2613_5 = ПланыСчетов.Типовой.НайтиПоКоду("2613.5");
счет2613_1 = ПланыСчетов.Типовой.НайтиПоКоду("2613.1");

счет2621_1 = ПланыСчетов.Типовой.НайтиПоКоду("2621.1");
счет2622_6 = ПланыСчетов.Типовой.НайтиПоКоду("2622.6");
счет2622_1 = ПланыСчетов.Типовой.НайтиПоКоду("2622.1");

зпОст.УстановитьПараметр("счет2612_1",счет2612_1);
зпОст.УстановитьПараметр("счет2613_5",счет2613_5);
зпОст.УстановитьПараметр("счет2613_1",счет2613_1);

зпОст.УстановитьПараметр("счет2621_1",счет2621_1);
зпОст.УстановитьПараметр("счет2622_6",счет2622_6);
зпОст.УстановитьПараметр("счет2622_1",счет2622_1);

резЗпОст = зпОст.Выполнить();
тбОстСтатей = резЗпОст.Выгрузить();


КонецПроцедуры

vitasw

"Выбор" - это зло. я б использовал кучу левых соединений.

cska-fanat-kz

и
ПОДСТРОКА(ТОИОб.Счет.Код, 1, 4) = ""2613""
- зло

лучше "...Счет = &Счет2613" или "...Счет В (&СписокСчетов2600)" или "...Счет В ИЕРАРХИИ(&Счет2600)"
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Klyacksa

и мои 5 копеек:
&Склад = 0 или УслНДС_ОИОб.Склад = &Склад
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

vitasw

"или" - вообще зло, лучше список значений.

SGIRG

Попробуйте использовать временные таблицы.
Оптимизатор 1С плохо работает с вложенными запросами

Klyacksa

Цитата: vitasw от 03 авг 2016, 17:03
"или" - вообще зло, лучше список значений.
ИМХО, не все так однозначно
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Luzer1C

ЦитироватьПопробуйте использовать временные таблицы.
Плюсую. Временные таблицы в последнее время работают быстрее всяких вложенных запросов.
Добавлено: 04 авг 2016, 04:50


Например:
ВЫБРАТЬ
ПланСчетовТиповой.Ссылка
ПОМЕСТИТЬ СписокСчетов
ИЗ
ПланСчетов.Типовой КАК ПланСчетовТиповой
ГДЕ
ПланСчетов.Типовой.Код = "2612.1"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
ПланСчетовТиповой.Ссылка
ИЗ
ПланСчетов.Типовой КАК ПланСчетовТиповой
ГДЕ
ПланСчетов.Типовой.Код = "2613.5"

И так далее. Запрос получится громоздкий, но работать будет на порядок быстрее.
Халамбалам.

cska-fanat-kz

Luzer1C, вы имеете ввиду соединение с таблицей плана счетов будет быстрее условия "...Счет В (&СписокСчетов)"?
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Luzer1C

100%. Вместо &СписокСчетов прописать так:

(Выбрать
СписокСчетов.Ссылка
Из
СписокСчетов)
Халамбалам.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск