Как получить количество документов в результате запроса?

Внимание! Тема закрыта. Добавлять сообщения в закрытую тему запрещено.
1. Kaijsu 11.03.16 16:26 Сейчас в теме
Запрос=СоздатьОбъект("Запрос");
ТекстЗапроса=
"
|Период с (РабочаяДата()) по (РабочаяДата());
|Обрабатывать НеПомеченныеНаУдаление;
|ОбрабатыватьДокументы Проведенные;
|Док = Документ.РасходнаяНакладная.ТекущийДокумент;
|Контрагент = Документ.РасходнаяНакладная.Клиент;
|ТовСумм = Документ.РасходнаяНакладная.Сумма;
|Функция ДокИтог = Сумма(ТовСумм);
|Функция КолДок = Счётчик();
|Группировка Контрагент без упорядочивания без групп;
|Условие(Контрагент = Клиент);
|";
Запрос.Выполнить(ТекстЗапроса);
Сумма=Запрос.ДокИтог;
Сообщить(Запрос.КолДок);

Функция Счётчик сейчас подсчитывает кол-во товаров во всех документах вошедших в запрос. Если убираю переменную ТовСумм - начинает считать кол-во документов, но тогда соответственно не могу сумму по накладным получить. Как сделать так чтобы Суммы получать и Счётчиком кол-во документов подсчитывать?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. DJDUH 17 11.03.16 16:33 Сейчас в теме
(1) Kaijsu,
|Функция КолДок = Количество(Док);


Нет
Счётчик()
- кажись все строки выборки считает!
4. CheBurator 2712 11.03.16 22:50 Сейчас в теме
(2) счетчик считает правильно в зависимости от сделанной группировки. Так что все что надо - подумать над правильным выбором группировки, что и было приведено на мисте
3. CheBurator 2712 11.03.16 22:48 Сейчас в теме
(1) то есть ты по-прежнему упорствуешь ;-)
Чем не понравился код, который дает количество документов, который я тебе дал в последнем посте в ветке на мисте? Или тебя по прежнему ломает тупо скопипастить и проверить? Или тебе нужно мультик записать в видео который продемонстрирует что приведенный в последнем потсте на мисте код дает правильный результат?
8. Kaijsu 12.03.16 00:49 Сейчас в теме
(3) CheBurator, то как там написано (в плане счётчика) я уже пробовал и до и после того как ты это написал. Не считает он кол-во документов - считает только кол-во товаров в табличной части. Кстати в твоём коде группировка - документ, а переменной такой нету. В остальном группировки тут не причём, я пробовал кроме группировки по контрагенту добавлять группировку по документам - результат тот же. Счётчик начинал считать не товары а документы только когда я удалял переменную ТовСумм (в твоём коде - Печеньки), а мне её удалять не надо, мне нужно чтобы одновременно считались общая сумма и количество документов, если такое вообще возможно в одном запросе.
9. chel-new 12.03.16 00:58 Сейчас в теме
(8) Kaijsu, вот ты упертый, один в один скопируй его код к себе, выполни посмотри результат, а потом смотри что в твоем коде не так как в его...

Кстати в твоём коде группировка - документ, а переменной такой нету


это стандартная группировка, почитай СП
14. Kaijsu 12.03.16 01:29 Сейчас в теме
(3) CheBurator, да, действительно, всё работает. Здесь я и правда тупанул - не обратил внимания сначала на то как обработка запроса происходит (о счётчике думал)). Спасибо за совет.
19. Kaijsu 12.03.16 01:58 Сейчас в теме
Да всё, уже получилось - группировку сделал без групп - теперь правильно считает:

ПриВыборе()
Запрос=СоздатьОбъект("Запрос");
ТекстЗапроса=
"
|Период С (РабочаяДата()) По (РабочаяДата());
|Печеньки = Документ.РасходнаяНакладная.Сумма;
|Док = Документ.РасходнаяНакладная.ТекущийДокумент;
|Контрагент = Документ.РасходнаяНакладная.Клиент;
|Функция ИтогоПеченьки = Сумма(Печеньки);
|Функция СколькоПеченек = Счётчик();
|Группировка Док без упорядочивания без групп;
|Условие (Контрагент = Клиент);
|";
Запрос.Выполнить(ТекстЗапроса);
Сообщить("Итого печенек за дату: "+Запрос.ИтогоПеченьки);
Запрос.Группировка(1);
Сообщить("Итого печенек в кучке: "+Запрос.СколькоПеченек);
Запрос.Выгрузить(Таблица);
КонецПроцедуры
21. chel-new 12.03.16 02:04 Сейчас в теме
(19) Kaijsu, классно что получилось все, но прикольно - откель у документов группы? :)
23. Kaijsu 12.03.16 02:09 Сейчас в теме
(21) chel-new, я так понимаю в выборке группы формируются. Тем не менее после "без групп" счётчик выдал уже 3, а не 4.
25. CheBurator 2712 12.03.16 02:23 Сейчас в теме
(19) не, запрос считает неправильно, и выдает количество строк в первом документе, попавшем в выборку - что по случайности совпало с количеством документов в выборке. Мой запрос - тоже неправильный по той же причине.
надо подумать
27. CheBurator 2712 12.03.16 02:52 Сейчас в теме
ага, получилось.
вариант (19) - неправильный, Запрос.Группировка(1) - позиционируется на первом значении группировки, то есть возвращает итоги для первого документа в выборке.

правильный вариант: http://screencast.com/t/ZaoFnJAdSjh
неправильный вариант из (19), по барабану с группами или без групп: http://screencast.com/t/vjIohGLkNXE

//НЕПРАВИЛЬНО
Процедура ПриВыбореКлиента1()
	
	Сообщить("вариант автора");
	Запрос=СоздатьОбъект("Запрос"); 
	ТекстЗапроса= 
	" 
	|Период С ДатаДок По ДатаДок; 
	|Печеньки = Документ.Реализация.Сумма; 
	|Док = Документ.Реализация.ТекущийДокумент; 
	|Контрагент = Документ.Реализация.Контрагент ; 
	|Функция ИтогоПеченьки = Сумма(Печеньки); 
	|Функция СколькоПеченек = Счётчик(); 
	|Группировка Док без упорядочивания без групп; 
	|Условие (Контрагент = Клиент); 
	|"; 
	Запрос.Выполнить(ТекстЗапроса); 
	ТЗ = ""; Запрос.Выгрузить(ТЗ,1,1);
	ПечатьТЗ(ТЗ);

	Сообщить("Итого печенек за дату: "+Запрос.ИтогоПеченьки); 
	Запрос.Группировка(1); 
	Сообщить("Итого печенек в кучке: "+Запрос.СколькоПеченек); 

КонецПроцедуры

//ПРАВИЛЬНО
Процедура ПриВыбореКлиента()
	Сообщить("вариант Чебура");
	
	Запрос=СоздатьОбъект("Запрос");
    ТекстЗапроса=
    "
    |Период С ДатаДок По ДатаДок;
    |Печеньки = Документ.Реализация.Сумма;
    |Контрагент = Документ.Реализация.Контрагент;
	|РейтингПеченьки = Документ.Реализация.НомерСтроки;
    |Функция ИтогоПеченьки = Сумма(Печеньки);
	|Функция СколькоПеченек = Счётчик() Когда(РейтингПеченьки<2);
    |Группировка Документ;
    |Условие (Контрагент = Клиент);
    |";
    
	Запрос.Выполнить(ТекстЗапроса);
	ТЗ = ""; Запрос.Выгрузить(ТЗ,1,1);
	ПечатьТЗ(ТЗ);
    
	Сообщить("Итого печенек за дату: "+Запрос.ИтогоПеченьки);
	Сообщить("Итого печенек в кучке: "+Запрос.СколькоПеченек);
	
  КонецПроцедуры
Показать
28. chel-new 12.03.16 02:57 Сейчас в теме
(27) CheBurator, опоздал :) см. (26)
5. Chameleon1980 11.03.16 23:02 Сейчас в теме
На мисте не видел ребят. дайте ссылку. но счас в голову пришло запрос выгрузить в тз свернуть как надо - накрайняк
только после выгрузить добавить колонку наверное и единички туда впихнуть

там можно вообще по любому полю посчитать уникальное колво

или я засыпаю ужее?
6. Chameleon1980 11.03.16 23:05 Сейчас в теме
7. CheBurator 2712 11.03.16 23:44 Сейчас в теме
(6) пост 88 в упомянутой ветке
меня даже не заломает - в отличие от автора тупо скопипастить сюда

Процедура ПриВыбореКлиента()
    Запрос=СоздатьОбъект("Запрос");
    ТекстЗапроса=
    "
    |Период С ДатаДок По ДатаДок;
    |Печеньки = Документ.Реализация.Сумма;
    |Контрагент = Документ.Реализация.Контрагент;
    |Функция ИтогоПеченьки = Сумма(Печеньки);
    |Функция СколькоПеченек = Счётчик();
    |Группировка Документ;
    |Условие (Контрагент = Клиент);
    |";
    Запрос.Выполнить(ТекстЗапроса);
    Сообщить("Итого печенек за дату: "+Запрос.ИтогоПеченьки);
    Запрос.Группировка(1);
    Сообщить("Итого печенек в кучке: "+Запрос.СколькоПеченек); 
  КонецПроцедуры
Показать

.
10. Kaijsu 12.03.16 01:15 Сейчас в теме
Если тупо скопипастить один в один и попробовать выполнить - выдаёт целый огород ошибок: https://yadi.sk/d/KEFeb8fyq6YDW
11. chel-new 12.03.16 01:18 Сейчас в теме
(10) Kaijsu, блин ну у тебя документа реализация в конфе вероятно нету
12. chel-new 12.03.16 01:19 Сейчас в теме
и переменные ДатаДок и Клиент инициализируй
13. Kaijsu 12.03.16 01:25 Сейчас в теме
(12) chel-new, я знаю, уже подправил - сейчас всё считает. Я Запрос.Группировка не пробовал использовать, вот чего чего оказывается не хватало. Теперь правда не совсем правильно - количество на 1 больше выдаёт.
15. chel-new 12.03.16 01:30 Сейчас в теме
(13) Kaijsu, сделай запрос.выгрузить и посмотри что в ТЗ будет
17. Kaijsu 12.03.16 01:44 Сейчас в теме
(15) chel-new, выгружает 3 накладных, а в окне сообщения показывает 4
18. chel-new 12.03.16 01:52 Сейчас в теме
(17) Kaijsu, покажи структуру твоего документа и текст кода который в итоге модификации используешь, как предположение: в запросе обрабатываешь не "шапку" а "многострочную часть" документа, отсюда если строк в документе 2, то в выгрузке сгруппируются в 3, а Счетчик насчитает 4
16. Kaijsu 12.03.16 01:31 Сейчас в теме
А то я уже тремя запросами задачу решил - но это слишком громоздко конечно...
20. CheBurator 2712 12.03.16 01:59 Сейчас в теме
22. Kaijsu 12.03.16 02:06 Сейчас в теме
А нет, всё равно неправильно - это просто совпало. Сейчас проверил на другом контрагенте по которому одна накладная - действительно считает кол-во строк табличной части, а не документы.
24. Kaijsu 12.03.16 02:11 Сейчас в теме
Ладно, это уже завтра на свежую голову разбираться буду, сейчас чё-то уже совсем мозг кипит.
26. chel-new 12.03.16 02:46 Сейчас в теме
(24) Kaijsu, (25) CheBurator, Счетчику сделать отбор только когда НомерСтроки = 1 :)
Прикрепленные файлы:
000.ert
30. CheBurator 2712 12.03.16 03:38 Сейчас в теме
(26) это ты успел написать когда я тестил сразу после 25 поста, так что твой пост я не видел (страницу не обновлял) - вставил и опубликовал свой...
29. try2016 12.03.16 03:25 Сейчас в теме
Для этого требуется Номер строки документа если там есть многострочная часть.

|Функция КолФактур = Счётчик() когда (НомСтроки = 1);

Определяет Количество документов.

"//Текст запроса
					|Период с НачДата по КонДата;
					|Обрабатывать НеПомеченныеНаУдаление;
					|ОбрабатыватьДокументы Проведенные;
					|Сборщик = Документ.Реализация.Сборщик;
					|Ошибок = Документ.Реализация.ОшибкаСборки;
					|НомСтроки = Документ.Реализация.НомерСтроки;
					|Вес = Документ.Реализация.Единица.Вес;
					|Количество = Документ.Реализация.Количество;
					|Функция КолФактур = Счётчик() когда (НомСтроки = 1);
					|Функция КолОшибок = Счётчик() когда ((НомСтроки = 1) И (Ошибок = 1));
					|Функция КолПозиций = Счётчик();
					|Функция Тоннаж = Сумма(Вес * Количество);
					|Группировка Сборщик Без Групп;
					|Условие(Сборщик <> ПустойСборщик);";
Показать
31. CheBurator 2712 12.03.16 03:40 Сейчас в теме
(29) твоя функция будет криво считать если попадется документ с пустой табличной частью. Сумма сумм посчитается правильно, а количество документов - налажает. Мой код - посчитает правильно даже если документ с пустой табличной частью.
33. try2016 12.03.16 04:08 Сейчас в теме
(31) CheBurator,
Нет не будет, вставь проверку на НомерСтроки <> 0.

Это рабочий код, и давно работает. К тому-же проведенные документы без табличной части...не имееют смысла и к тому-же не проводятся)
По запросу там используются только проведенные документы...и такая поверка избыточна сама по себе. Смысл проверки по нуль нужна если выбираются все документы

К тому-же смысл в документах без табличной части, сам подумай. Не какого! Поэтому они просто отсекаются как не нужные)
34. CheBurator 2712 12.03.16 04:33 Сейчас в теме
(33) фигня.в общем случаем запросто могут быть документы с пустой табличной частью. и несущие вполне вменяемый функционал - самое тупое: корректировочная заявка с пустой табличной частью в ТИС - порождает туеву хучу движений.

так что у тебя - в общем случае считает криво - не учитыывает доки с пустой табличной частью.
а условие НомерСтроки <2 - как раз посчитает все верно.

а проведенные/непроведенные- это уже тонкости. Впрочем и документ с пустой ТЧ можно тоже рассматривать как тонкость.
36. try2016 12.03.16 04:39 Сейчас в теме
(34) CheBurator,
Насчет в реализации повторное проведение это да. Но не я это делал в свое время такой механизм, а они так уже привыкли. Я делал всего-лишь отчет по тому что есть)
Еще раз повторюсь криво нечего не работает, работает все по моему умыслу) В данном случае такая проверка излишняя , так как документы которые с пустой табличной частью не учитываются вообще. ТАК и НУЖНО!
37. CheBurator 2712 12.03.16 04:49 Сейчас в теме
(36) "ТАК и НУЖНО!" - в твоем запросе да. в задаче автора - искуственно занижаются исходные данные. Но это уже не суть, потому что понятно как это разрулить в запросе.
38. try2016 12.03.16 05:06 Сейчас в теме
(37) CheBurator,

В таких случаях добавляется всего лишь чуток

Функция Счётчик = Счётчик() когда ((НомСтроки=1)или(ТекущийДокумент.КоличествоСтрок()=0));
39. CheBurator 2712 12.03.16 05:09 Сейчас в теме
(38) ты не поверишь, но достаточно очень короткого услвоия вместо твоего длинного
когда (НомСтроки<2)
- всё, этого - достаточно.
41. try2016 12.03.16 05:52 Сейчас в теме
(39) CheBurator,
В принципе и так можно, но лучше не надо. Я посмотрел его задание у него то-же проведенные, получится такая-же фигня количество документов с пустой табличной частью подсчитывать, а они нужны, а в твоем случае будут считаться такие документы. Документы с пустой табличной частью, это ошибка оператора. И их учитывать не надо. Поэтому НомерСтроки = 1 достаточно то-же. И правильней.

Я отвечал на его вопрос, твоего не видел ответа. Но приятно, что есть еще люди которые понимают в ТиС)
42. CheBurator 2712 12.03.16 06:43 Сейчас в теме
(41) Что достаточно и правильней - определяется условиями задачи. При неполном обозначении исходных условий в наилучшем случае надо исходить по возможности из самых общих условий. закладываясь сразу на НомСтроки=1 - мы сразу потенциально заужаем область исходных данных, хотя права на это не имеем. зауженные исходные данные оставляют "за боротом" массу инфы - нужна она или нет - НЕ ВИДЯ ЭТОЙ ИНФЫ - ВЫВОД СДЕЛАТЬ НЕВОЗМОЖНО. В итоге - получаем недостоверные данные.

Решая общую задачу - получаем полный набор данных. Видя что в нем есть несущественные данные - вводим поправку в исходные данные и ТОЛЬКО ПОТОМ заужаем решение.

Это - принципиальный подход.
При выборе решать общую задачу с предсказуемым набором данных или частную задачу с зауженными - определяем стоимость решения. если стоимость высокая - не потянем - решаем узкую сразу по принципу "правильные данные получим - получим!" и втайне надеясь что оставшиеся за бортом невыявленные "неправильные" данные не БАБАХНУТ в самый неподходящий момент.

В данном случае стоимость общего решения - мизерная. Поэтому - если обратишь внимание - у меня в запросе - нет ни проверко на проведенные, удаленные - общая задача.

Заузить можно всегда (палку напополам разрубить не проблема) - это чистая технология. А вот с зауженной перейти к общей (из двух половинок сделать целую палку) - это уже искусство (могут получитьяс нунчаик, которые в лобешник лепят будь здоров самому себе ;-)

Попутно выясняя - что у на операторы часто косячат (все что делают руками все плохо), поэтому внедряем "защиты от дураков" (у меня такими защитам туева хуча мест обвешана).

Я тут понаписал конечно много - и хотелось бы и самому так работать как написал - но не всегда получается (хотя я и юзаю разработку "сверху вниз").

так что - всем нам успехов!
43. try2016 12.03.16 07:21 Сейчас в теме
(42) CheBurator,

мы сразу потенциально заужаем область исходных данных, хотя права на это не имеем

Ну сколько я работаю...всегда накладные с пустой табличной частью игнорирую. Это оператор либо забыл либо затупил и создал новый закрыв этот. И не какой полезной нагрузки этот документ не несет, а только портит статистику своим присутствием, если он попадет в запрос. Канечно не спорю есть фирмы которые возможно как-то иначе введут учет, но это скорее исключение, чем правило. А под такие правила, сам разработчик должен приспосабливать то что ему дают как исходный код для примера.

Тебе то-же успехов!
32. CheBurator 2712 12.03.16 03:44 Сейчас в теме
Я еще успел за это время публикацию забабахать, модераторы одобрят - прения можно будет туда перенести. Бо задачка оказалась полезной. ссылка (пока неактивная) http://infostart.ru/public/485039/
35. CheBurator 2712 12.03.16 04:39 Сейчас в теме
самое тупое: корректировочная заявка с пустой табличной частью в ТИС - порождает туеву хучу движений.

и такой документ, например, тоже надо считать - потому что это может быть вполне себе легитимная хозоперация которую надо учесть. В рамках постановки задачи "Как сделать так чтобы Суммы получать и Счётчиком кол-во документов подсчитывать" (даже с учетом условий на проведенность документа в исходном запросе) - пустые доки надо учитывать, потому как это не протворечит возможностям системы - а на какой автор работает - хз (думал ли автор про пустые доки или нет - нам неведомо ;-)

ну, в любом случае задачка получилась полезной.
40. CheBurator 2712 12.03.16 05:13 Сейчас в теме
в плане осмысления неосмысленного:
кстати, очень было бы интересно посмотреть как отработает что получится в итоге в тексте скульного запроса на такую твою конструкцию
в когда: ТекущийДокумент.КоличествоСтрок()
- думаю (но неуверен) что будет сгенерено какое-то соединение с таблицей скуля для табличной части документа для подсчета количества строк документа.. что утяжеляет запрос.

это мое примечание несущественно - просто не сильно рублю в скулях.
44. CheBurator 2712 12.03.16 08:08 Сейчас в теме
У меня, например, часть торг12 и счф выписываются в бухбазе по каким-либо неосновным (не)торговым операциям. Под эти буховские документы в торгбазе тупо резервируются документы-болванки. Это проще, чем тянуть в торговую прогу бухгалтерские заморочки.

А так да - особенностей учета - везде хватает. И зачастую это даже не особенности, а костыльки.
45. Kaijsu 12.03.16 13:49 Сейчас в теме
Ого, сколько тут за ночь полезного понаписали... Спасибо большое всем, теперь очень многое для меня прояснилось. Вопрос решён.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот