Имя: Пароль:
1C
1C 7.7
v7: Запрос к ТЧ с отбором
,
0 1С-ница
 
27.01.15
12:04
"//{{ЗАПРОС(Сформировать)
        |ОбрабатыватьДокументы все;
        |Заезд = Документ.Резервирование.ДатаС;
        |Выезд = Документ.Резервирование.ДатаПо;
        |Резерв = Документ.Резервирование.ТекущийДокумент;
        |Группировка Резерв;
        |Группировка Заезд;
        |Условие(Выезд=ДатаКон);
        |Условие(Заезд=ДатаНач);

ДатаС и ДатаПо находятся в табличной части. Как я понимаю. сейчас он берет первую строку документа. Как сделать чтобы ДатаС была с первой строки, а ДатаПо - с последней?
1 Ёпрст
 
27.01.15
12:06
(0) скажем так, не первую, а проверяется условие для каждой строки документа
2 Ёпрст
 
27.01.15
12:15
Ну, и если очень надо, то так, к примеру:

Функция ПроверитьДаты(Док)
  Если Док.ПолучитьСтрокуПоНомеру(1) =0 Тогда
     Возврат 0;
  ЕначеЕсли Док.Заезд<>ДатаНач тогда
     Возврат 0;
  КонецЕсли;
  Док.ПолучитьСтрокуПоНомеру(Док.КоличествоСтрок());
  Возврат ?(Док.Выезд=ДатаКон,1,0);
КонецФункции

"//{{ЗАПРОС(Сформировать)

        |ОбрабатыватьДокументы все;
        |Заезд = Документ.Резервирование.ДатаС;
        |Выезд = Документ.Резервирование.ДатаПо;
        |Резерв = Документ.Резервирование.ТекущийДокумент;
        |Группировка Резерв;
        |Группировка Заезд;
//        |Условие(Выезд=ДатаКон);
//        |Условие(Заезд=ДатаНач);
        |Условие(ПроверитьДаты(Резерв)=1);
3 1С-ница
 
27.01.15
14:17
(2) Что то не работает, почему - не пойму((
4 1С-ница
 
27.01.15
14:21
Я же отладчиком не могу посмотреть, что делается в ф-ции ПроверитьДаты()?
5 Ёпрст
 
27.01.15
14:22
можешь
6 Ёпрст
 
27.01.15
14:22
а так, ну попробуй период указать в тексте запроса.

Хотя, у тебя видать ни один документ не попадает в условия на даты твои.
7 1С-ница
 
27.01.15
14:23
(5) что то не заходит. ОДну запись выводит.
8 1С-ница
 
27.01.15
14:25
(7) даты этой записи отличаются от ДатыНач и ДатыКон
9 1С-ница
 
27.01.15
14:26
(6) Указать так?:
|ОбрабатыватьДокументы все;
        |Заезд = Документ.Резервирование.ДатаС;
        |Выезд = Документ.Резервирование.ДатаПо;
        |Резерв = Документ.Резервирование.ТекущийДокумент;
        |Группировка Резерв;
        |Группировка Заезд;
        |Условие(Выезд='20150124');
        |Условие(Заезд='20150111');
10 Ёпрст
 
27.01.15
14:28
(9) нет

Задать период в тексте запроса :

|Период с ... ПО ...

хотя, для документов (не помню ужо) он и не обязателен
11 Ёпрст
 
27.01.15
14:28
Запрос из (2), что возвращает ?
12 1С-ница
 
27.01.15
14:32
(10) Тогда будут выбираться документы  за выбранный промежуток. Даты их создания отличаются от ДатыС в табличной части
13 1С-ница
 
27.01.15
14:34
(11) ничего
14 Ёпрст
 
27.01.15
14:36
(13) значит нет документов, которые удовлетворяют условию:

ДатаС с первой строки табличной части = ДатаНач
И
ДатаПО с последней строки табличной части = ДатаКон
15 Ёпрст
 
27.01.15
14:40
если не веришь, можешь воткнуть тест на вшивость:

Функция ПроверитьДаты(Док)

  Если Док.ПолучитьСтрокуПоНомеру(1) =0 Тогда
     Сообщить(""+Док+" нет строк документа");
     Возврат 0;
  ЕначеЕсли Док.Заезд<>ДатаНач тогда
     Сообщить(""+Док+" дата с первой строки:"+Док.Заезд+" не равна "+ДатаНач);
     Возврат 0;
  КонецЕсли;
  Док.ПолучитьСтрокуПоНомеру(Док.КоличествоСтрок());
  Если Док.Выезд<>ДатаКон Тогда
       Сообщить(""+Док+" дата с последней строки:"+Док.Выезд+" не равна "+ДатаКон);
  КонецЕсли;

  Возврат ?(Док.Выезд=ДатаКон,1,0);
КонецФункции

"//{{ЗАПРОС(Сформировать)


        |ОбрабатыватьДокументы все;
        |Заезд = Документ.Резервирование.ДатаС;
        |Выезд = Документ.Резервирование.ДатаПо;
        |Резерв = Документ.Резервирование.ТекущийДокумент;
        |Группировка Резерв;
        |Условие(ПроверитьДаты(Резерв)=1);
16 1С-ница
 
27.01.15
15:06
Переписала так:
Функция ПроверитьДаты(Док)
  Док.ВыбратьСтроки();
// Пока Док.ПолучитьСтроку() = 1 Цикл
  Если Док.ПолучитьСтрокуПоНомеру(1) =0 Тогда
     Сообщить(""+Док+" нет строк документа");
     Возврат 0;
  ИначеЕсли Док.ДатаС<>ДатаНач тогда
     //Сообщить(""+Док+" дата с первой строки:"+Док.Заезд+" не равна "+ДатаНач);
     Сообщить(""+Док+" дата с первой строки:"+Док.ДатаС+" равна "+Док.ДатаС);
     Возврат 0;
  КонецЕсли;
  Док.ПолучитьСтрокуПоНомеру(Док.КоличествоСтрок());
  Если Док.ДатаПо<>ДатаКон Тогда
       Сообщить(""+Док+" дата с последней строки:"+Док.ДатаПо+" не равна "+ДатаКон);
  КонецЕсли;

  Возврат ?(Док.ДатаПо=ДатаКон,1,0);
//  КонецЦикла;
КонецФункции

Т к Док.Выезд - тип не дата. в Сообщить Док.ДатаС не выводится
17 SleepyHead
 
гуру
27.01.15
15:14
В запросе 1с77 в группировке должна быть СтрокаДокумента (предопределенная группировка).
18 Ёпрст
 
27.01.15
15:27
(17) зачем?
19 Ёпрст
 
27.01.15
15:28
(16) >>>>>Т к Док.Выезд  - тип не дата

?????????????????????

Че ?
И чего ты тогда хочешь, раз там не дата ?
:))))))))))))))))))
20 Ёпрст
 
27.01.15
15:30
И... почему ты пишешь Док.ДатаС, когда реквизит у тебя (судя по запросу из (0))  называется Заезд и Выезд..

Опять обманываешь ?
21 Ёпрст
 
27.01.15
15:30
+20 а блин, это я косоглазый..
22 Ёпрст
 
27.01.15
15:32
Надо так:

Функция ПроверитьДаты(Док)

  Если Док.ПолучитьСтрокуПоНомеру(1) =0 Тогда
     Сообщить(""+Док+" нет строк документа");
     Возврат 0;

  ЕначеЕсли Док.ДатаС<>ДатаНач тогда

     Сообщить(""+Док+" дата с первой строки:"+Док.ДатаС+" не равна "+ДатаНач);
     Возврат 0;
  КонецЕсли;
  Док.ПолучитьСтрокуПоНомеру(Док.КоличествоСтрок());
  Если Док.ДатаПО<>ДатаКон Тогда
       Сообщить(""+Док+" дата с последней строки:"+Док.ДатаПО+" не равна "+ДатаКон);
  КонецЕсли;

  Возврат ?(Док.ДатаПО=ДатаКон,1,0);
КонецФункции

"//{{ЗАПРОС(Сформировать)



        |ОбрабатыватьДокументы все;
        |Заезд = Документ.Резервирование.ДатаС;
        |Выезд = Документ.Резервирование.ДатаПо;
        |Резерв = Документ.Резервирование.ТекущийДокумент;
        |Группировка Резерв;
        |Условие(ПроверитьДаты(Резерв)=1);
23 Ёпрст
 
27.01.15
15:32
проверяй.
24 1С-ница
 
27.01.15
15:37
Док.ДатаС - пусто
25 Ёпрст
 
27.01.15
15:41
(24) и ?
26 Ёпрст
 
27.01.15
15:41
условие никогда не выполнится
27 Ёпрст
 
27.01.15
15:41
документов будет нема, разве тебе не этого надо было ?
28 1С-ница
 
27.01.15
15:48
Есть документы (как минимум один) с нужными датами!!!
29 1С-ница
 
27.01.15
15:49
Да и вопрос сейчас не в этом, ав том что в Сообщить пишет:
Док. 000364 (27.01.2015) дата с первой строки:  .  .   не равна 11.01.15
30 Ёпрст
 
27.01.15
15:52
(28) тест на вшивость его находит ?
Если нет - то таких документов просто нет!
31 Ёпрст
 
27.01.15
15:52
(29) и че ?
Открой документ и посмотри, че там в реквизита ДатаС в ПЕРВОЙ строке табличной части документа
32 1С-ница
 
27.01.15
15:57
11.01.2015
33 1С-ница
 
27.01.15
15:57
а сравнивает с 11.01.15. Может типы разные у 11.01.2015 и 11.01.15?
34 Ёпрст
 
27.01.15
15:57
(32) не верю
35 Ёпрст
 
27.01.15
15:58
Открой дерево метаданных и посмотри тип у реквизита многострочной части, какой он ?
36 1С-ница
 
27.01.15
15:59
Тип Дата
37 1С-ница
 
27.01.15
16:00
Вот что пишет про правильный документ:
Док. 004139 (18.11.2014) дата с первой строки:  .  .   не равна 11.01.15
Док. 004139 (18.11.2014) дата с первой строки:  .  .   не равна 11.01.15


но в нем 100% первая строка ДатаС 11.01.2015
38 1С-ница
 
27.01.15
16:01
Почему он пишет дата с первой строки:  .  .   ??
39 Ёпрст
 
27.01.15
16:02
(37) покажи весь свой код
40 Ёпрст
 
27.01.15
16:02
(38) потому, что ПолучитьСтрокуПоНомеру(ОДИН)
41 Ёпрст
 
27.01.15
16:03
тебе же ДатаС нужна была всегда с первой строки, разве нет ?
42 Ёпрст
 
27.01.15
16:03
вот у тебя она пустая, покажи скриншот этого документа
43 Ёпрст
 
27.01.15
16:06
ну и ..уверенна, что в документе от Ноября четырнадцатого года в табличной части писали дату 11 января Пятнадцатого года ?
44 1С-ница
 
27.01.15
16:07
(43) уверена
(41) да
45 Ёпрст
 
27.01.15
16:08
(44) ну и ?
ДатаС - какой тип в документе ?
В самом документе в Первой строке ДатаС чему равна ?
46 Масянька
 
27.01.15
16:08
(44) Короче, скриншот давай и код! Народ уже заждался :)
47 1С-ница
 
27.01.15
16:10
(45) написала же уже все
48 1С-ница
 
27.01.15
16:10
сейчас скину принтскрин
49 1С-ница
 
27.01.15
16:11
50 Ёпрст
 
27.01.15
16:14
(49) вот сюда помести и ссылку в форум
http://pics.rsh.ru/
51 1С-ница
 
27.01.15
16:15
Функция ПроверитьДаты(Док)

  Если Док.ПолучитьСтрокуПоНомеру(1) =0 Тогда
     Сообщить(""+Док+" нет строк документа");
     Возврат 0;

  ИначеЕсли Док.ДатаС<>ДатаНач тогда

     Сообщить(""+Док+" дата с первой строки:"+Док.ДатаС+" не равна "+ДатаНач);
     Возврат 0;
  КонецЕсли;
  Док.ПолучитьСтрокуПоНомеру(Док.КоличествоСтрок());
  Если Док.ДатаПО<>ДатаКон Тогда
       Сообщить(""+Док+" дата с последней строки:"+Док.ДатаПО+" не равна "+ДатаКон);
  КонецЕсли;

  Возврат ?(Док.ДатаПО=ДатаКон,1,0);
КонецФункции

//Ольга 27.01.15
Процедура Сформировать()
    
    АктДатаКон = ДатаКон;
    
    Если СформироватьПозициюДокумента(ДатаКон, 23, 59, 59, 1) > СформироватьПозициюДокумента(ПолучитьДокументТА()) Тогда
        АктДатаКон = ПолучитьДокументТА();
    КонецЕсли;
    //Если ВыбГруппаЗаезда.Выбран()=1 тогда
        Запрос2 = СоздатьОбъект("Запрос");
        ТекстЗапроса2 =
        "//{{ЗАПРОС(Сформировать)
        |ОбрабатыватьДокументы все;
    //    |Период с '01012014' по '25012015';
        //Ольга 20.01.15
        //|ГруппаЗаезда = Документ.Резервирование.Заезд.ГруппаЗаезда;
        |Заезд = Документ.Резервирование.ДатаС;
        |Выезд = Документ.Резервирование.ДатаПо;
        |Резерв = Документ.Резервирование.ТекущийДокумент;
        |Группировка Резерв;
        //|Группировка Заезд;
        |Группировка СтрокаДокумента;
        //|Условие(Выезд=ДатаКон);
        //|Условие(Заезд=ДатаНач);
        |Условие(ПроверитьДаты(Резерв)=1);
        |"//}}ЗАПРОС
        ;
        // Если ошибка в запросе, то выход из процедуры
        Если Запрос2.Выполнить(ТекстЗапроса2) = 0 Тогда
            Возврат;
        КонецЕсли;
        Т2 = СоздатьОбъект("ТаблицаЗначений");
        СЗ = СоздатьОбъект("СписокЗначений");
        Запрос2.Выгрузить(Т2,2,0);
        Т2.Выгрузить(СЗ,,,"Резерв");
        Запрос3 = СоздатьОбъект("Запрос");
        ТекстЗапроса3 =
        "//{{ЗАПРОС(Сформировать)
        |ОбрабатыватьДокументы все;
        |НаОсновании = Документ.Размещение.НаОсновании;
        |Размещение = Документ.Размещение.ТекущийДокумент;
        |Группировка Размещение;
        |Условие(НаОсновании в СЗ);
        |"//}}ЗАПРОС
        ;
        // Если ошибка в запросе, то выход из процедуры
        Если Запрос3.Выполнить(ТекстЗапроса3) = 0 Тогда
            Возврат;
        КонецЕсли;
        Запрос3.Выгрузить(Т2,2,0);
        Т2.ВыбратьСтроки() ;
        Пока Т2.ПолучитьСтроку()=1 Цикл
            СЗ.ДобавитьЗначение(Т2.Размещение);
        КонецЦикла ;
        //Т2.Выгрузить(СЗ,,,"Резерв");
        Если ПустоеЗначение(СЗ)=1 Тогда
            Сообщить("Нет документов по этому заезду!") ;
          Возврат
        КонецЕсли ;    
    //КонецЕсли;
    
    
    ПерСУ=Перечисление.ВидыВзаиморасчетов.СписаниеУслуги ;
    ПерЗ=Перечисление.ВидыВзаиморасчетов.Зачет ;
    ПерВозврАванса=Константа.УслугаДляВозврата;
    РегУслуг="Взаиморасчеты";
    
    ТекстЗапроса = "
    |Период с ДатаНач по АктДатаКон;
    |Разм = Регистр."+РегУслуг+".Размещение;
    |Контрагент = Регистр.Предоплата.Контрагент;
    |Бронь = Регистр."+РегУслуг+".Размещение.НаОсновании,Регистр.Предоплата.Бронь;
    //|Бронь = Регистр."+РегУслуг+".Размещение.НаОсновании;
    |Докум = Регистр."+РегУслуг+".ТекущийДокумент,Регистр.Предоплата.ТекущийДокумент;
    |Гость = Регистр."+РегУслуг+".ГостьИзм,Регистр.Предоплата.Гость;
    |ТипУслуги = Регистр."+РегУслуг+".ТипУслуги;
    |Услуга = Регистр."+РегУслуг+".Услуга;
    |ВидДвижения = Регистр."+РегУслуг+".ВидДвижения;
    |Сумма = Регистр."+РегУслуг+".Долг;
    |СуммаП = Регистр.Предоплата.СуммаБН, Регистр.Предоплата.Сумма;
    //|Функция ПрихСумма1 = Приход(Сумма)  Когда((ВидДвижения<>ПерСУ) и (ВидДвижения<>ПерЗ));
    //|Функция РасхСумма1 = Расход(Сумма)  Когда((ВидДвижения<>ПерСУ) и (ВидДвижения<>ПерЗ));
    |Функция ПрихСумма1 = Приход(Сумма)  Когда((ВидДвижения<>ПерСУ) и (ВидДвижения<>ПерЗ) и (Услуга<>ПерВозврАванса));
    |Функция РасхСумма1 = Расход(Сумма)  Когда((ВидДвижения<>ПерСУ) и (ВидДвижения<>ПерЗ) и (Услуга<>ПерВозврАванса));
    |Функция ПрихСуммаСУ = Приход(Сумма) Когда(ВидДвижения=ПерСУ);
    |Функция РасхСуммаСУ = Расход(Сумма) Когда(ВидДвижения=ПерСУ) ;
    |Функция ПрихСуммаЗ = Приход(Сумма)  Когда(ВидДвижения=ПерЗ);
    |Функция РасхСуммаЗ = Расход(Сумма)  Когда(ВидДвижения=ПерЗ);
    |Функция НачСумма = НачОст(Сумма);
    |Функция КонСумма = КонОст(Сумма);
    |Функция НачСуммаП = НачОст(СуммаП);
    |Функция ПрихСуммаП = Приход(СуммаП);
    |Функция РасхСуммаП = Расход(СуммаП);
    |Функция КонСуммаП = КонОст(СуммаП);
    |Условие(ПустоеЗначение(Гость)=0);
    |Условие(Бронь В СЗ);";
    
    
    спДет=СоздатьОбъект("СписокЗначений");
    //
    //
    Для ш=1 по Детализация.РазмерСписка() цикл
        Если Детализация.Пометка(ш)=0 тогда
            Продолжить;
        КонецЕсли;
        ТекстЗапроса=ТекстЗапроса+"Группировка "+Детализация.ПолучитьЗначение(ш);
        Если (Детализация.ПолучитьЗначение(ш)<>"Докум")  тогда
           //и (Детализация.ПолучитьЗначение(ш)<>"ДокОснование")    тогда
            ТекстЗапроса=ТекстЗапроса+" без групп";
        КонецЕсли;                                  
        ТекстЗапроса=ТекстЗапроса+";";
        
        спДет.ДобавитьЗначение(Детализация.ПолучитьЗначение(ш));
    //    
    КонецЦикла;
    
    Если ВыбГость.Выбран() = 1 Тогда
        Если ВыбГость.ЭтоГруппа() = 1 Тогда
            ТекстЗапроса = ТекстЗапроса + "Условие (Гость в ВыбГость);";
        Иначе
            ТекстЗапроса = ТекстЗапроса + "Условие (Гость = ВыбГость);";
        КонецЕсли;
    КонецЕсли;
    Если ВыбГруппаЗаезда.Выбран()=1 тогда
        ТекстЗапроса=ТекстЗапроса+"Условие (Бронь в СЗ);";
    КонецЕсли;
    Если ВыбТипУслуги.Выбран()=1 тогда
        ТекстЗапроса=ТекстЗапроса+"Условие (Запрос.ТипУслуги=ВыбТипУслуги);";
    КонецЕсли;
        
    Запрос = СоздатьОбъект("Запрос");
    Запрос.Выполнить(ТекстЗапроса);
    
    Т = СоздатьОбъект("ТаблицаЗначений");
    Запрос.Выгрузить(Т,2);
    
    ЗагПрих="Оплачено услуг";
    ЗагРасх="Оказано услуг";
    
    Таб = СоздатьОбъект("Таблица");
    Таб.Опции(0, 0);
    Таб.ВывестиСекцию("Шапка");
    
    НомВхода=0;
    ИтНачСумма=0;    ИтПрихСумма=0;    ИтРасхСумма=0;    ИтКонСумма=0;
    ВывестиГруппировки(Запрос, спДет, Таб, НомВхода);
    
    НачСумма=-Запрос.НачСумма+Запрос.НачСуммаП  ;
    КонСумма=-Запрос.КонСумма+Запрос.КонСуммаП  ;
    РасхСумма=Запрос.РасхСумма1-Запрос.ПрихСуммаСУ+Запрос.ПрихСуммаП-Запрос.РасхСуммаП  ;
    ПрихСумма=Запрос.ПрихСумма1-Запрос.РасхСуммаСУ ;
    ЗачетСумма=Запрос.РасхСуммаЗ-Запрос.ПрихСуммаЗ ;
    Таб.ВывестиСекцию("Подвал");
    Таб.ТолькоПросмотр(1);
    Таб.Показать();
КонецПроцедуры
52 1С-ница
 
27.01.15
16:16
53 Ёпрст
 
27.01.15
16:16
(51) выкинь группировка  СтрокаДокумента, это для начала
54 1С-ница
 
27.01.15
16:17
(53) выкидывала
55 1С-ница
 
27.01.15
16:18
Меня волнует ф-ция ПроверитьДаты(), почему Док.ДатаС пустая
56 Масянька
 
27.01.15
16:19
Мне интересно: а если тупо сделать выборку строк из данного дока и вывести НомерСтроки, ДатаС, ТипЗначения(ДатаС) - что покажет?
57 1С-ница
 
27.01.15
16:21
сделала такую проверку:
ИначеЕсли Док.ДатаС<>ДатаНач тогда
     Сообщить(""+ТипЗначенияСтр(Док)+" :"+ТипЗначенияСтр(Док.ДатаС)+"  "+ТипЗначенияСтр(ДатаНач));

Выводит Документ Дата  Дата
58 Масянька
 
27.01.15
16:22
(57) Добавь туда еще просто - Док.ДатаС (пусть значение реквизита покажет).
59 Масянька
 
27.01.15
16:22
+ (58) И НомерСтроки.
60 Salimbek
 
27.01.15
16:23
(0) ИМХА, логичнее было бы укладывать такие данные в регистр, а потом уже оттуда собирать.
З.Ы. Без SQL уже не могу инфу собирать, вот до чего хороший инстрУмент доводит.
61 1С-ница
 
27.01.15
16:28
(58) (59) Номер строки 0, ДатаС - пустая (2 точки)
62 Ёпрст
 
27.01.15
16:30
Короче, вот так поправь и усё заработает:

Функция ПроверитьДаты(Вася)
  Док = Вася.Текущийдокумент();
  Если Док.ПолучитьСтрокуПоНомеру(1) =0 Тогда
63 1С-ница
 
27.01.15
16:32
Вау))
64 1С-ница
 
27.01.15
16:34
Сообщить() Рулит))
65 Ёпрст
 
27.01.15
16:35
Работает ?
66 Масянька
 
27.01.15
16:35
(61) Я чёт не поняла - почему номер строки = 0?
67 Ёпрст
 
27.01.15
16:35
только про (53) не забудь, это там лишнее
68 1С-ница
 
27.01.15
16:39
(66) Не хватало ТекущийДокумент()
(67) выкинула
Спасибо!!
69 Масянька
 
27.01.15
17:02
(68) Двоешница :)))))))))))
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший