|
v7: Остатки по складам | ☑ | ||
---|---|---|---|---|
0
Damash
06.04.12
✎
22:59
|
1С 7.7 БУ SQL
Требуется Номенклатуру (без Групп и не входящую в Архивную группу) вывести поколичественно по определенным складам. Т.к. SQL - то перебором, постоянно обращаясь к БухИтоги, да еще в разрезе нужных складов - занимает очень много времени! Попробовал написать через запросы - тоже долго. Может кто сталкивался... Вот последний мой вариант: Процедура ВыводОстатковПоСкладам() Склад=СоздатьОбъект("Справочник.МестаХранения"); Рез1=Склад.НайтиПоКоду(1); Склад1=Склад.ТекущийЭлемент(); Рез2=Склад.НайтиПоКоду(2); Склад2=Склад.ТекущийЭлемент(); Рез7=Склад.НайтиПоКоду(7); Склад7=Склад.ТекущийЭлемент(); Рез8=Склад.НайтиПоКоду(8); Склад8=Склад.ТекущийЭлемент(); Если Рез1+Рез2+Рез7+Рез8=4 Тогда СписокСкладов=СоздатьОбъект("СписокЗначений"); СписокСкладов.ДобавитьЗначение(Склад1); СписокСкладов.ДобавитьЗначение(Склад2); СписокСкладов.ДобавитьЗначение(Склад7); СписокСкладов.ДобавитьЗначение(Склад8); Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = " |Обрабатывать НеПомеченныеНаУдаление; |Товар = Справочник.Номенклатура.ТекущийЭлемент; |Группировка Товар; |Условие(Товар.ПринадлежитГруппе(глАрхивныйКаталог)=0); |Условие(Товар.ЭтоГруппа()=0); |"; Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Предупреждение("Запрос не состоялся"); Возврат; КонецЕсли; таблСписокТоваров=СоздатьОбъект("ТаблицаЗначений"); Запрос.Выгрузить(таблСписокТоваров,,0); СписокТоваров=СоздатьОбъект("СписокЗначений"); таблСписокТоваров.Выгрузить(СписокТоваров); ЗапросБИ=СоздатьОбъект("БухгалтерскиеИтоги"); ЗапросБИ.ИспользоватьСубконто(ВидыСубконто.Номенклатура,СписокТоваров,2,0); ЗапросБИ.ИспользоватьСубконто(ВидыСубконто.МестаХранения,СписокСкладов,2,0); Если ЗапросБИ.ВыполнитьЗапрос(,ТекущаяДата(),"41.1",,,1,,4)=0 Тогда Сообщить("Запрос сработал некоректно!"); Возврат; Иначе //алгоритм выстраивания шахматки "Количество отобранного товара по 4-м складам" КонецЕсли; КонецЕсли; КонецПроцедуры |
|||
1
G-Re
06.04.12
✎
23:20
|
(0) Текст достаточно корректен. А где жрет время, в бухзапросе или при формировании шахматки? Бухзапрос должен отрабатывать, как правило, за секунды(не десятки).
|
|||
2
Damash
07.04.12
✎
01:14
|
алгоритм формирования шахматки пока даже не вставляю.
просто жду окончания обработки |
|||
3
Внучок
07.04.12
✎
01:22
|
Если на ТекущаяДата(), тогда попробуй ЗапросБИ.периодМ(ТекущаяДата()) - будет существенно быстрее
|
|||
4
viktor_vv
07.04.12
✎
01:28
|
У тебя тормозит запрос к справочнику скорее всего, если много номенклатуры. Попробуй так
|Группировка Товар без групп; |Условие (НЕ(Товар В глАрхивныйКаталог)); |
|||
5
viktor_vv
07.04.12
✎
01:39
|
(4)+ А то вот это очень не быстрые конструкции.
|Условие(Товар.ПринадлежитГруппе(глАрхивныйКаталог)=0); |Условие(Товар.ЭтоГруппа()=0); |
|||
6
AlexNew
07.04.12
✎
01:39
|
(0) Субконто у вас всего сколько?
|
|||
7
AlexNew
07.04.12
✎
01:40
|
|Условие(Товар.ПринадлежитГруппе(глАрхивныйКаталог)=0);
|
|||
8
Damash
07.04.12
✎
01:42
|
(6) два: Номенклатура и МестоХраниния
|
|||
9
Damash
07.04.12
✎
01:42
|
(4) товаров около 15 000
|
|||
10
AlexNew
07.04.12
✎
01:43
|
(8) Всего?
|
|||
11
Damash
07.04.12
✎
01:45
|
(10) Ну да. А зачем больше?
|
|||
12
AlexNew
07.04.12
✎
01:45
|
(9)Не товаров - субконто.
|
|||
13
Damash
07.04.12
✎
01:48
|
Счет 41.1
Субконто1 - Спр.Номенклатура Субконто2 - Спр.МестаХранения |
|||
14
AlexNew
07.04.12
✎
01:51
|
(13) Что макс субконто? Там пользователи лазили?
|
|||
15
Damash
07.04.12
✎
01:52
|
База - самопис.
|
|||
16
viktor_vv
07.04.12
✎
01:55
|
(14) Завязывай бухпть.
Максимальное количество субконто до 5 штатно. |
|||
17
viktor_vv
07.04.12
✎
01:56
|
(16) *бухать.
|
|||
18
AlexNew
07.04.12
✎
02:01
|
(17) Друг мой, ваши советы - неуместны, как минимум. Заткнитесь, пожалуйста, надоело.
|
|||
19
viktor_vv
07.04.12
✎
02:04
|
(18) Ну так и вы потрудитесь как-то членораздельно свои мысли выражать.
|
|||
20
viktor_vv
07.04.12
✎
02:06
|
Дабы и мы, сирые и убогие, могли проникнуться глубиной.
|
|||
21
Damash
07.04.12
✎
02:06
|
мальчики, не ссорьтесь
|
|||
22
Damash
07.04.12
✎
02:07
|
переделал согласно (3) и (4)
сейчас попробую запустить |
|||
23
Damash
07.04.12
✎
02:12
|
Обработка начата: 01:06:49
Обработка завершена: 01:11:20 Обработано: 15869 элементов Процедура ВыводОстатковПоСкладам() Перем Ч,М,С; Сообщить("Обработка начата: " + ТекущееВремя(Ч,М,С)); Склад=СоздатьОбъект("Справочник.МестаХранения"); Рез1=Склад.НайтиПоКоду(1); Склад1=Склад.ТекущийЭлемент(); Рез2=Склад.НайтиПоКоду(2); Склад2=Склад.ТекущийЭлемент(); Рез7=Склад.НайтиПоКоду(7); Склад7=Склад.ТекущийЭлемент(); Рез8=Склад.НайтиПоКоду(8); Склад8=Склад.ТекущийЭлемент(); Если Рез1+Рез2+Рез7+Рез8=4 Тогда СписокСкладов=СоздатьОбъект("СписокЗначений"); СписокСкладов.ДобавитьЗначение(Склад1); СписокСкладов.ДобавитьЗначение(Склад2); СписокСкладов.ДобавитьЗначение(Склад7); СписокСкладов.ДобавитьЗначение(Склад8); Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = " |Обрабатывать НеПомеченныеНаУдаление; |Товар = Справочник.Номенклатура.ТекущийЭлемент; |Группировка Товар без Групп; |Условие(Товар.ПринадлежитГруппе(глАрхивныйКаталог)=0); |Условие(НЕ(Товар В глАрхивныйКаталог)); |"; Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Предупреждение("Запрос не состоялся"); Возврат; КонецЕсли; таблСписокТоваров=СоздатьОбъект("ТаблицаЗначений"); Запрос.Выгрузить(таблСписокТоваров,,0); СписокТоваров=СоздатьОбъект("СписокЗначений"); таблСписокТоваров.Выгрузить(СписокТоваров); ЗапросБИ=СоздатьОбъект("БухгалтерскиеИтоги"); ЗапросБИ.ИспользоватьСубконто(ВидыСубконто.Номенклатура,СписокТоваров,2,0); ЗапросБИ.ИспользоватьСубконто(ВидыСубконто.МестаХранения,СписокСкладов,2,0); ЗапросБИ.ПериодМ(ТекущаяДата()); Если ЗапросБИ.ВыполнитьЗапрос(,,"41.1",,,1,,4)=0 Тогда Сообщить("Запрос сработал некоректно!"); Возврат; Иначе Сообщить("Обработка завершена: " + ТекущееВремя(Ч,М,С)); Сообщить("Обработано: " + СписокТоваров.РазмерСписка() + " элементов"); //алгоритм выстраивания шахматки "Количество отобранного товара по 4-м складам" КонецЕсли; КонецЕсли; КонецПроцедуры |
|||
24
Damash
07.04.12
✎
02:12
|
уже по времени неплохо
|
|||
25
viktor_vv
07.04.12
✎
02:15
|
Так убери это
|Условие(Товар.ПринадлежитГруппе(глАрхивныйКаталог)=0); раз вставил через НЕ. |
|||
26
Внучок
07.04.12
✎
02:18
|
Убери ВыполнитьЗапрос() После ПериодМ() он не нужен
|
|||
27
Damash
07.04.12
✎
02:18
|
сорри, тупанул... машинально
|
|||
28
Damash
07.04.12
✎
02:19
|
(26) не понял...
а как выбрать остатки по складам? |
|||
29
viktor_vv
07.04.12
✎
02:21
|
Таки да, выбери что-то одно. Но мне кажется при ПериодМ придется тянуть в цикле через БИ.СКД(Счет,Субконто) и это будет не быстро.
|
|||
30
Внучок
07.04.12
✎
02:21
|
ЗапросБИ.СНД(<?>,,,)
Синтаксис: СНД(<Счет>,<ТипСуммы>,<Валюта>,<Субконто1...>) Назначение: Возвращает дебетовое сальдо по счету на начало периода. |
|||
31
Damash
07.04.12
✎
02:25
|
(30) для SQL-варианта это долгое время! Я специально начал через запросы переписывать эту обработку.
|
|||
32
viktor_vv
07.04.12
✎
02:32
|
Я так понял склады по горизонтали, тогда сразу почитай внимательно про параметры ВыбратьСубконто() тебе там нужен будет ФлагВсе = 1 для вложенной выборки по складам.
|
|||
33
viktor_vv
07.04.12
✎
02:33
|
(32)+ Это для режима Запроса.
|
|||
34
Damash
07.04.12
✎
02:38
|
(32) согласен
но мне нужно не по всем складам, а по конкретно выбранным (см. СписокЗначений) или я не прав? |
|||
35
viktor_vv
07.04.12
✎
03:00
|
(34) Да все правильно, в результатах запроса у тебя будут только скалды из твоего списка.
А ФлагВсе=1 это если у тебя выборка складов будет вложенной под товарами, чтобы в выборку по конкретному товару попадали все склады из запроса, а не только те, по которым есть итоги по конкретному товару. Нажеюсь я не сильно запутал. Это для шахматки, когда склады горизонтально. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |