|
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) Двоешница :)))))))))))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |