Имя: Пароль:
1C
1C 7.7
v7: ЗапросБИ.ИспользоватьСубконто()
0 Damash
 
07.04.12
21:38
Есть такой код:

ЗапросБИ=СоздатьОбъект("БухгалтерскиеИтоги");
       ЗапросБИ.ИспользоватьСубконто(ВидыСубконто.Номенклатура,СписокТоваров,2,0);
       ЗапросБИ.ИспользоватьСубконто(ВидыСубконто.МестаХранения,СписокСкладов,2,0);  
       Если ЗапросБИ.ВыполнитьЗапрос(,,"41.1",,,1,,4)=0 Тогда
           Сообщить("Запрос сработал некоректно!");
           Возврат;
       Иначе
           ЗапросБИ.ВыбратьСубконто(1,1);
           Пока ЗапросБИ.ПолучитьСубконто(1)=1 Цикл
               Товар=ЗапросБИ.Субконто(1);
// алгоритм заполнения шахматки
КонецЦикла;
КонецЕсли;

где СписокТоваров и СписокСкладов - СЗ.
так вот до Запроса: СписокТоваров.РазмерСписка()=15432
а в переборе ЗапросБИ.ВыбратьСубконто(1,1) и т.д. проходит цикл только 11 342. Т.е. ЗапросБИ отметает тот товар, по которому не было никаких движений еще.

Вопрос: можно ли как-то включить в ЗапросБИ все таки новый товар, который только ввелся в базу без движений?
1 Slaventiya
 
07.04.12
22:15
Сомневаюсь я в возможности
2 Slaventiya
 
07.04.12
22:15
Да и собственно зачем ?
3 Classic
 
07.04.12
22:22
(2)
Наверное чтоб в шахматку попадали все номенклатуры :)
4 Classic
 
07.04.12
22:24
(0)
Перебирай справочник и уже там
ЗапросБИ.ПолучитьСубконто(1,,СпрНоменклатура.ТекущийЭлемент())
5 Damash
 
07.04.12
22:26
это в продолжение темы:
Остатки по складам
идет выгрузка всей номенклатуры, кроме архивного каталога. (3) да, верно
6 Slaventiya
 
07.04.12
22:27
(4) И ? Все равно не найдет, в итогах, просто вывести в произвольный отчет как текущий элемент... да
7 Classic
 
07.04.12
22:29
(6)
Конечно не найдет, номенклатуры то нет. Иногда надо выводить и пустые поля.
Например для инвентаризации
8 Slaventiya
 
07.04.12
22:33
(7) Почему нет, в справочнике есть, но счет не двигала, Инвентаризировать по 0 количеству ? Или имеется в виду как таковой перечень номенклатуры ?
9 Classic
 
07.04.12
22:36
(0)
Ну конечно. Я не уверен, что ТСу нужна инвентаризация, но в инвентаризации все именно так.
Распечатываешь остатки по номенклатуре, отдаешь проверяющим и они идут и заполняют фактические остатки :)
Естественно нужна и номенклатура с нулевым остатком - а вдруг на складе излишки.
А так как номенклатура должна быть определенным образом отсортирована, то вариант "вывести ненулевые, а потом те, которых нет" - не катит
10 Classic
 
07.04.12
22:36
(9)-(8)
11 Slaventiya
 
07.04.12
22:40
(9) Согласен, но по коду в теме не попадет, от конкретики зависит
12 Damash
 
07.04.12
22:42
здесь завязана выгрузка на сайт, добавление нового товара на сайт из 1С, и выгрузка соответственно стоков по розничным точкам.

Вот и получается, что есть инвойс, но сам товар придет только через месяц. В 1С его вбить нужно, затем выгрузить на сайт пусть даже и с нулевыми остатками по всем точкам.
13 Damash
 
07.04.12
22:43
Вывод я так понял: через БухИтоги.Запрос - я никак не подхвачу данный товар, да?
14 Classic
 
07.04.12
22:45
(13)
Чем тебе не нравится вариант обходить список и позиционировать запрос на каждую номенклатуру?
15 Slaventiya
 
07.04.12
22:46
(13) Как ? Позиция счет не двигала, бух. запросом нет, а вот если сначала перебирать элементы номенклатуры и их уже подставлять в запрос как ТекущийЭлемент() то да.

(14) Вот с языка сорвал, но так медленнее.... но се ля ви
16 Damash
 
07.04.12
22:49
(14)(15) база SQL - перебор надолго затягивает даже на 15 000 позиций, хотел полностью через запросы организовать
17 Classic
 
07.04.12
22:49
В принципе если это и вся задача, то можно обойти бухзапросом те, что есть, попутно удаляя из списка элементы. И потом выгрузить оставшийся список
18 Classic
 
07.04.12
22:51
(16)
Так ты по сформированному списку беги. Правда по запросу бегать для каждой номенклатуры будешь долго
19 Damash
 
07.04.12
22:53
(18) все понятно. Ок.
по справочнику или по списку - тут повремени можно глянуть так и так и уже потом оставить наименьшее
20 Classic
 
07.04.12
22:54
(19)
Я надеюсь ты правильно понял. Сначала выполнить запрос, а потом бегать по списку, а не бегать по списку и для каждой номенклатуры выполнять запрос ? ;)
21 Damash
 
07.04.12
22:58
"Сначала выполнить запрос"
так после этого запроса на выходе я уже не получаю номенклатуру, по которой не было движения...
22 Slaventiya
 
07.04.12
23:03
А просто запрос ? И из него элемент номенклатуры в бух. запрос... ?
23 Damash
 
07.04.12
23:05
(22) тоже как вариант
24 Classic
 
07.04.12
23:12
(21)
Значит не понял. Ты обегаешь список. И для каждого элемента списка делаешь  

Если БИЗапрос.ПолучитьСубконто(1,,ТвояНоменклатураИзСписка) = 1 Тогда
// побежали-побежали по второму субконто
Иначе
// выводим номенклатуру с пустыми значениями полей
КонецЕсли;

Извини полный код писать лень
25 Slaventiya
 
07.04.12
23:18
(24) Думаю, самый лучший вариант, хотя список номенклатуры тоже заполняет предварительно, но вариант быстрее всех, врятли из него что выжать по скорости больше получится
26 NS
 
07.04.12
23:18
(24) Это очень медленно
намного проще обойти результат бух запроса, в ТЗ, и потом добавить в него справочник.
27 Damash
 
07.04.12
23:22
(26) можно чуть подробней...
бухзапрос делаю такой?
ЗапросБИ=СоздатьОбъект("БухгалтерскиеИтоги");
ЗапросБИ.ИспользоватьСубконто(ВидыСубконто.Номенклатура,,1,0);
ЗапросБИ.ИспользоватьСубконто(ВидыСубконто.МестаХранения,СписокСкладов,2,0);  
Если ЗапросБИ.ВыполнитьЗапрос(,,"41.1",,,1,,4)=0 Тогда
...
28 Classic
 
07.04.12
23:23
(26)
Я это предлагал в (17)
:)
Только без ТЗ. К большим ТЗ в 7.7 я отношусь как-то настороженно
29 Classic
 
07.04.12
23:27
(27)
такой же как в (0)
У тебя же есть уже список номенклатур, или нет?
30 Slaventiya
 
07.04.12
23:27
Может стоит просто померить производительность в разных методах и выбрать?
31 NS
 
07.04.12
23:29
(28) У него миллион номенклатуры?
32 Slaventiya
 
07.04.12
23:29
С выгрузкой в ТЗ результат вариант оч. неплох, но померить стоит
33 NS
 
07.04.12
23:30
(30) Нет смысла мерить, и так всё понятно.
34 Damash
 
07.04.12
23:30
(29) да, есть!

   Запрос = СоздатьОбъект("Запрос");
       ТекстЗапроса = "
       |Обрабатывать НеПомеченныеНаУдаление;
       |Товар = Справочник.Номенклатура.ТекущийЭлемент;
       |Группировка Товар без Групп;
       |Условие(НЕ(Товар В глАрхивныйКаталог));
       |";
       Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
           Предупреждение("Запрос не состоялся");
           Возврат;
       КонецЕсли;        
       
       таблСписокТоваров=СоздатьОбъект("ТаблицаЗначений");
       Запрос.Выгрузить(таблСписокТоваров,,0);
       СписокТоваров=СоздатьОбъект("СписокЗначений");
       таблСписокТоваров.Выгрузить(СписокТоваров);
35 viktor_vv
 
07.04.12
23:50
(34) Тем более ТЗ с номенклатурой у тебя уже есть. Добавляешь в таблСписокТоваров необходимые тебе колонки. И при обходе результатов запоса Ищешь в табл номенклатуру и пишешь в ТЗ что тебе надо. Можешь туда сразу и колонки для складов добавить. На выходе полуишь готовую ТЗ с простым выводом в таблцу.
36 Torquader
 
07.04.12
23:55
(35) Я бы ещё посоветовал выбрать не только остатки, но и движения по товарам за определённый период (с прошлой инвентаризации, например), тогда будут получены только те товары, которые или есть на складе или были когда-то (и могут случайно остаться).

Другое дело, что в реальности на складе может быть найден товар, которого вообще не закупали, так как у поставщика тоже бывает пересортица.