Вопрос с запросом
11.01.2012
08:26
#1
"Написал простенький запрос:<br> <br><br><pre> Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ХозрасчетныйОстатки.КоличествоОстаток КАК Количество |ИЗ | РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, , , ) КАК ХозрасчетныйОстатки |ГДЕ | ХозрасчетныйОстатки.Субконто1.Ссылка = &Номенклатура | И ХозрасчетныйОстатки.Субконто2.Ссылка = &Склад | И ХозрасчетныйОстатки.Счет = &Счет"; Запрос.УстановитьПараметр("Номенклатура", СтрокаТЧ.Номенклатура); Запрос.УстановитьПараметр("Склад", Склад); Запрос.УстановитьПараметр("Период", Дата); Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01")); ТЗ = Запрос.Выполнить().Выгрузить(); </pre><br><br> <br>Его задача - найти количественный остаток конкретной номенклатуры на указанную дату на указанном складе.<br> <br>Оно работает, но очень уж долго. Подскажите пожалуйста, как можно оптимизировать этот запрос, с целью сокращения времени его выполнения? Или нужно было писать по другому?"
11.01.2012
10:11
#3
"у меня там период задан *смущенно<br>То есть мысль в том, чтобы запихнуть туда все остальные параметры?<br> <br>Смотрим:<br>Субконто - у нас отбор по видам субконто, в рамках конкретной задачи, ИМХО, не нужно;<br>УсловиеСчета - выражение типа Булево, условие отбора счёта. Вот тут у меня вопрос - как записать такое условие? *чешет в затылке<br>Условие - произвольное выражение, возвращающее значение типа Булево. Опять же.... Как?<br> <br>Если не трудно - напишите, пожалуйста, пару примеров, чтобы я увидел, и больше не приставал с вопросами"
11.01.2012
10:20
#4
"<pre>// Вставить содержимое обработчика.<br> Запрос = Новый Запрос;<br> Запрос.Текст =<br> "ВЫБРАТЬ<br> | ХозрасчетныйОстатки.КоличествоОстаток КАК Количество<br> |ИЗ<br> | РегистрБухгалтерии.Хозрасчетный.Остатки(<br> | &Период,<br> | Счет В ИЕРАРХИИ (&Счет),<br> | ,<br> | Субконто1 В ИЕРАРХИИ (&Номенклатура)<br> | И Субконто2 В ИЕРАРХИИ (&Склад)) КАК ХозрасчетныйОстатки";<br> Запрос.УстановитьПараметр("Номенклатура", СтрокаТЧ.Номенклатура);<br> Запрос.УстановитьПараметр("Склад", Склад);<br> Запрос.УстановитьПараметр("Период", Дата);<br> Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.ТоварыНаСкладе);<br> ТЗ = Запрос.Выполнить().Выгрузить(); </pre>"
11.01.2012
14:41
#6
1. Почему проявляется пренебрежение к отбору по виду субконто? Его зря что ли придумали?<br>2. Судя по "СтрокаТЧ.Номенклатура" остатки нужно получать для всех товаров в табличной части, а не перебором строк каждый раз "дергать" таблицы регистров бух.учета.
11.01.2012
15:38
#7
- Если заранее известен счет, то явным определением порядка субконто можно пренебречь<br> - Попросили оптимизировать запрос, а не всю задачу.
11.01.2012
18:29
#8
в цикле получили остаток по конкретной номенклатуре - сравнили с количеством в ТЧ - если больше - то записываем в новую ТЗ1, дальше будем разбираться. Если =< - то нормально, пропускаем.<br>Получили новую ТЗ1. Теперь надо посмотреть, на каких складах есть остатки? Снова запрос и снова в цикл. Понятно, что запрос тут точно такой же, и повторяется столько раз, сколько у нас складов, но я не очень представляю, как можно использовать один запрос в данной задаче.<br>То, что нашлось (причем, элементы из ТЗ1, естественно, могут находиться на разных складах), записываем в ТЗ2, и на её основе делаем документы перемещения товаров, а то, чего на складах нет - делаем поступление.<br>Вот такая задачка.<br> <br>А как по другому? И будет ли это производительнее?
Читают тему
(гостей: 1)