Имя: Пароль:
1C
1С v8
Цикл по запросу!
0 Aleksei_Pro
 
18.08.11
18:01
Мне нужно получить отстатки за заданный период (например с 01.01.11 - 01,02,11)!

Делаю запрос в цикле:
   ПромежуточнаяДата = НачалоДня(НачПериода);
   Пока ПромежуточнаяДата <= НачалоДня(КонПериода) Цикл
       ПромежуточнаяДата = ПромежуточнаяДата + 24*60*60;
       ДатаНач  = НачалоДня(ПромежуточнаяДата);
       КонДата = КонецДня(ПромежуточнаяДата);    
       ........
       КонецЦикла;
Начальная и конечная дата не берется!Почему? Как поправить?
1 zbv
 
18.08.11
18:02
а нафиг запрос в цикле ?
2 zbv
 
18.08.11
18:03
а так границу надо юзать.
3 inka
 
18.08.11
18:03
и где сам запрос? или что Вы понимаете под запросом?
4 Axel2009
 
18.08.11
18:04
остаткииобороты с периодичностью день.
5 Aleksei_Pro
 
18.08.11
18:06
Вот :
   ПромежуточнаяДата = НачалоДня(НачПериода);
   Пока ПромежуточнаяДата <= НачалоДня(КонПериода) Цикл
       
       ПромежуточнаяДата = ПромежуточнаяДата + 24*60*60;
       ДатаНач  = НачалоДня(ПромежуточнаяДата);
       КонДата = КонецДня(ПромежуточнаяДата);    
       
       Запрос =  Новый Запрос;
       Запрос.УстановитьПараметр("НачПериода",ДатаНач);
       Запрос.УстановитьПараметр("КонПериода",КонДата);
       Запрос.УстановитьПараметр("Организация",Организация);
       Запрос.УстановитьПараметр("Счет",ПланыСчетов.Хозрасчетный.ТоварыНаСкладах);
       Запрос.Текст =
       "ВЫБРАТЬ
       |    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Субконто1,
       |    СУММА(ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток, 0)) КАК КоличествоКонечныйОстаток,
       |    СУММА(ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток, 0)) КАК СуммаКонечныйОстаток
       |ИЗ
       |    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачПериода, &КонПериода, , , Счет В ИЕРАРХИИ (&Счет), , ) КАК ХозрасчетныйОстаткиИОбороты
       |ГДЕ
       |    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток < 0
       |    И ХозрасчетныйОстаткиИОбороты.Организация = &Организация
       |
       |СГРУППИРОВАТЬ ПО
       |    ХозрасчетныйОстаткиИОбороты.Субконто1";
       
       Рез = запрос.Выполнить();
       Если Рез.Пустой()Тогда
           Продолжить;
       КонецЕсли;
       Результат = Рез.Выбрать();
       док = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
...........
6 Aleksei_Pro
 
18.08.11
18:07
(5) мне нужно чтобы строго выбираешь период на форме, и только те дни обрабатывались, которые в периоде!
7 Kraft
 
18.08.11
18:10
(5) это зло
8 Axel2009
 
18.08.11
18:10
периодичность день + итоги по периоду и вперед обрабатывай
9 Aleksei_Pro
 
18.08.11
18:11
(7) мне подкажите как только цикл поправить!
10 Жан Пердежон
 
18.08.11
18:12
(0) Толсто
11 Aleksei_Pro
 
18.08.11
18:18
(8) я это знаю , мне надо в цикле сделать, подскажите где поправить и как?
12 Fragster
 
гуру
18.08.11
18:25
(11) да нафига в цикле-то?
13 DrHiHi
 
18.08.11
18:26
а ты остатки не можешь получить за период с НачПериода по КонПериода?? периодичность день %)
14 Aleksei_Pro
 
18.08.11
18:31
так что ли:
ВЫБРАТЬ
       |    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Субконто1,
       |    СУММА(ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток, 0)) КАК КоличествоКонечныйОстаток,
       |    СУММА(ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток, 0)) КАК СуммаКонечныйОстаток,
       |    ХозрасчетныйОстаткиИОбороты.Период КАК Период
       |ИЗ
       |    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачПериода, &КонПериода, День, , Счет В ИЕРАРХИИ (&Счет), , ) КАК ХозрасчетныйОстаткиИОбороты
       |ГДЕ
       |    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток < 0
       |    И ХозрасчетныйОстаткиИОбороты.Организация = &Организация
       |
       |СГРУППИРОВАТЬ ПО
       |    ХозрасчетныйОстаткиИОбороты.Субконто1,
       |    ХозрасчетныйОстаткиИОбороты.Период
       |ИТОГИ
       |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Субконто1),
       |    СУММА(КоличествоКонечныйОстаток),
       |    СУММА(СуммаКонечныйОстаток)
       |ПО
       |    Период
15 MadHead
 
18.08.11
18:34
(14) Типа того, только в таблицу могут не попасть дни по которым не было движений.
16 DrHiHi
 
18.08.11
18:34
(14) и отбор по организации засунь в параметры таблицы ОстаткиИОбороты
17 DrHiHi
 
18.08.11
18:36
(16) может при обходе оставлять предыдущее значение или в запросе сделать по дням
18 Fragster
 
гуру
18.08.11
18:36
(15) а в вариатне с циклом они тоже не попадут
19 Aleksei_Pro
 
18.08.11
18:38
Вообщем вот так :
       Запрос =  Новый Запрос;
       Запрос.УстановитьПараметр("НачПериода",НачалоДня(НачПериода));
       Запрос.УстановитьПараметр("КонПериода",КонецДня(КонПериода));
       Запрос.УстановитьПараметр("Организация",Организация);
       Запрос.УстановитьПараметр("Счет",ПланыСчетов.Хозрасчетный.ТоварыНаСкладах);
       Запрос.Текст =
       "ВЫБРАТЬ
       |    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Субконто1,
       |    СУММА(ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток, 0)) КАК КоличествоКонечныйОстаток,
       |    СУММА(ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток, 0)) КАК СуммаКонечныйОстаток,
       |    ХозрасчетныйОстаткиИОбороты.Период КАК Период
       |ИЗ
       |    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачПериода, &КонПериода, День, , Счет В ИЕРАРХИИ (&Счет), , ) КАК ХозрасчетныйОстаткиИОбороты
       |ГДЕ
       |    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток < 0
       |    И ХозрасчетныйОстаткиИОбороты.Организация = &Организация
       |
       |СГРУППИРОВАТЬ ПО
       |    ХозрасчетныйОстаткиИОбороты.Субконто1,
       |    ХозрасчетныйОстаткиИОбороты.Период
       |ИТОГИ
       |    СУММА(КоличествоКонечныйОстаток),
       |    СУММА(СуммаКонечныйОстаток)
       |ПО
       |    Период,
       |    Субконто1";
       
       Рез = запрос.Выполнить();
       Если Рез.Пустой()Тогда
           Продолжить;
       КонецЕсли;    
       ВыбПоРегистратору= Рез.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Период");
       Пока ВыбПоРегистратору.Следующий() цикл
           док = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
           Док.ВидОперации = Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ПокупкаКомиссия;
           док.Организация = Организация;
           Док.Дата = НачалоДня(ДатаНач);
           док.Контрагент = Контрагент;
           док.ДоговорКонтрагента =  Договор;
           док.Склад = Склад;
           док.СуммаВключаетНДС = истина;
           док.УчитыватьНДС = истина;
           док.Комментарий = "Создан автоматически!!!";    
           ВыбПоСтроке= ВыбПоРегистратору.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Субконто1");
           Пока ВыбПоСтроке.Следующий() цикл
               ТС = Док.Товары.Добавить();
               ТС.Номенклатура = Результат.Субконто1;
               ТС.ЕдиницаИзмерения = ТС.Номенклатура.БазоваяЕдиницаИзмерения;
               ТС.Количество = -(Результат.КоличествоКонечныйОстаток);
               ТС.Сумма = -(Результат.СуммаКонечныйОстаток);
               ТС.Цена = ТС.Сумма / ТС.Количество;
               ТС.СтавкаНДС = Перечисления.СтавкиНДС.НДС18;
               док.ЗаполнитьСчетаУчетаРасчетов();
               ОбработкаТабличныхЧастей.ПриИзмененииНоменклатурыТабЧасти(ТС, Док);
               ЗаполнитьСчетаУчетаВСтрокеТабЧасти(ТС,Организация,док.Склад, Истина);
               ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(ТС, Док);
           КонецЦикла;
           Док.Записать(РежимЗаписиДокумента.Проведение);
       КонецЦикла;
20 Aleksei_Pro
 
18.08.11
18:40
Вот это еще нужно вставить перед 2 циклом:
           Если ВыбПоСтроке.Количество() = 0 тогда
               Продолжить;
           КонецЕсли;
21 Axel2009
 
18.08.11
18:42
(20) разрешаю.
22 DrHiHi
 
18.08.11
18:42
(19) голяк
23 Fragster
 
гуру
18.08.11
18:43
(20) а зачем?
24 DrHiHi
 
18.08.11
18:43
(19) у тебя два документа поступление товаров и услуг будет создаваться
25 Aleksei_Pro
 
18.08.11
18:44
(24) как же правильно!
26 DrHiHi
 
18.08.11
18:50
(19) замечание:
1. счет один, зачем тогда в запросе "В"
2. на null не нужно проверять
3. " И ХозрасчетныйОстаткиИОбороты.Организация = &Организация" убери, а в "РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачПериода, &КонПериода, День, , Счет В ИЕРАРХИИ (&Счет), , Организация = &Организация)" добавить
4. общие итоги группировать только по Периоду
5.      |ИТОГИ
       |    СУММА(КоличествоКонечныйОстаток),
       |    СУММА(СуммаКонечныйОстаток)
   ------ бессмысленная группировка

(25) вообще не взлетит
27 Aleksei_Pro
 
18.08.11
18:50
(24) и почему же будет создаваться 2 документа?
28 DrHiHi
 
18.08.11
18:51
(27) потому что у тебя будут итоги на дату НачПериода и на КонПериода
29 Aleksei_Pro
 
18.08.11
18:52
Тогда такой запрос:
   "ВЫБРАТЬ
   |    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Субконто1,
   |    СУММА(ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток, 0)) КАК КоличествоКонечныйОстаток,
   |    СУММА(ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток, 0)) КАК СуммаКонечныйОстаток,
   |    ХозрасчетныйОстаткиИОбороты.Период КАК Период
   |ИЗ
   |    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачПериода, &КонПериода, День, , Счет В ИЕРАРХИИ (&Счет), , Организация = &Организация) КАК ХозрасчетныйОстаткиИОбороты
   |ГДЕ
   |    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток < 0
   |
   |СГРУППИРОВАТЬ ПО
   |    ХозрасчетныйОстаткиИОбороты.Субконто1,
   |    ХозрасчетныйОстаткиИОбороты.Период
   |ИТОГИ ПО
   |    ОБЩИЕ,
   |    Период ПЕРИОДАМИ(ДЕНЬ, &НачПериода, &КонПериода)";
30 Fragster
 
гуру
18.08.11
18:54
(29) метод дополнения поставь "Движения" - там по умолчанию еще и границы стоят...
31 Aleksei_Pro
 
18.08.11
18:57
Не понимаю, как это сработает:
   // Вставить содержимое обработчика.    
   Запрос =  Новый Запрос;
   Запрос.УстановитьПараметр("НачПериода",НачалоДня(НачПериода));
   Запрос.УстановитьПараметр("КонПериода",КонецДня(КонПериода));
   Запрос.УстановитьПараметр("Организация",Организация);
   Запрос.УстановитьПараметр("Счет",ПланыСчетов.Хозрасчетный.ТоварыНаСкладах);
   Запрос.Текст =
   "ВЫБРАТЬ
   |    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Субконто1,
   |    СУММА(ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток, 0)) КАК КоличествоКонечныйОстаток,
   |    СУММА(ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток, 0)) КАК СуммаКонечныйОстаток,
   |    ХозрасчетныйОстаткиИОбороты.Период КАК Период
   |ИЗ
   |    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачПериода, &КонПериода, День, Движения, Счет В ИЕРАРХИИ (&Счет), , Организация = &Организация) КАК ХозрасчетныйОстаткиИОбороты
   |ГДЕ
   |    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток < 0
   |
   |СГРУППИРОВАТЬ ПО
   |    ХозрасчетныйОстаткиИОбороты.Субконто1,
   |    ХозрасчетныйОстаткиИОбороты.Период
   |ИТОГИ ПО
   |    ОБЩИЕ,
   |    Период ПЕРИОДАМИ(ДЕНЬ, &НачПериода, &КонПериода)";
   
   Рез = запрос.Выполнить();
   Если Рез.Пустой()Тогда
       Возврат;
   КонецЕсли;    
   Результат= Рез.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Период");
   Пока Результат.Следующий() цикл
       док = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
       Док.ВидОперации = Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ПокупкаКомиссия;
       док.Организация = Организация;
       Док.Дата = НачалоДня(Результат);
       док.Контрагент = Контрагент;
       док.ДоговорКонтрагента =  Договор;
       док.Склад = Склад;
       док.СуммаВключаетНДС = истина;
       док.УчитыватьНДС = истина;
       док.Комментарий = "Создан автоматически!!!";    
       //  строки пошли минусовые
       ТС = Док.Товары.Добавить();
           ТС.Номенклатура = Результат.Субконто1;
           ТС.ЕдиницаИзмерения = ТС.Номенклатура.БазоваяЕдиницаИзмерения;
           ТС.Количество = -(Результат.КоличествоКонечныйОстаток);
           ТС.Сумма = -(Результат.СуммаКонечныйОстаток);
           ТС.Цена = ТС.Сумма / ТС.Количество;
           ТС.СтавкаНДС = Перечисления.СтавкиНДС.НДС18;
           док.ЗаполнитьСчетаУчетаРасчетов();
           ОбработкаТабличныхЧастей.ПриИзмененииНоменклатурыТабЧасти(ТС, Док);
           ЗаполнитьСчетаУчетаВСтрокеТабЧасти(ТС,Организация,док.Склад, Истина);
           ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(ТС, Док);
       //    конец записи строки
       Док.Записать(РежимЗаписиДокумента.Проведение);
   КонецЦикла;
32 DrHiHi
 
18.08.11
19:03
(31) мы сами в шоке ))))

"СУММА(ЕСТЬNULL(" замени на "СУММА("

"Счет В ИЕРАРХИИ (&Счет)" замени на "Счет = &Счет"

"    |ИТОГИ ПО
   |    ОБЩИЕ,
   |    Период ПЕРИОДАМИ(ДЕНЬ, &НачПериода, &КонПериода)";"
замени на

"    |ИТОГИ ПО
   |    Период";"

"        //  строки пошли минусовые"
замени на
Выборка = Результат.Выбрать()



а если честно то никого не слушай а делай как делал)))))
33 DrHiHi
 
18.08.11
19:07
(32) а не получиться из-за того, что таким методом у тебя выйдет таблица, например:

дата           остаток
01.01.2011      -10
01.02.2011      -20 (списалось еще 10)

а в документ поступление ты будешь добавлять
01.01.2011 - 10 штук
01.02.2011 - 20 штук
и в итоге у тебя на складе останется 10шт))))
34 Aleksei_Pro
 
18.08.11
19:10
(33) вот и именно что в цикле все получится как в 0 я делал!
35 DrHiHi
 
18.08.11
19:11
(33) а хотя может и получиться, только вот берешь не конечний остаток, а коностаток - начостаток это и будет количество, которое нужно добавить в документ
36 Aleksei_Pro
 
18.08.11
19:12
(34)+ так там что то с циклом, как же поправить цикл , возвращаемся к 0.....
37 Aleksei_Pro
 
18.08.11
19:13
(35) годать не будем, я таким методом как в 0 уже не раз пользовался, только вот с циклом что то не так происходит, первую дату не берет и последнюю
38 Axel2009
 
18.08.11
19:26
(37) ну так прибавляй после всех обработок
39 DrHiHi
 
18.08.11
19:58
(37) если еще для тебя актуально, то могу написать