Имя: Пароль:
1C
1C 7.7
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 это если у тебя выборка складов будет вложенной под товарами, чтобы в выборку по конкретному товару попадали все склады из запроса, а не только те, по которым есть итоги по конкретному товару.

Нажеюсь я не сильно запутал. Это для шахматки, когда склады горизонтально.