[ПОЛЕЗНЯШКА, 7.7] Как посчитать итоги по документам черным запросом с изподвывертом?

12.03.16

Разработка - Запросы

Мелкая полезняшка, считает запросом итоговую сумму документов и количество документов.

Дано: Документ, в котором в строках ТЧ есть реквизит "Сумма" (то есть суммы введены только в строках ТЧ).

Требуется: получить черным запросом по документам за период для заданного клиента сумму всех сумм и количество документов.

Исходные даные:

  • период: ДатаН, ДатаК
  • ВыбКонтрагент: заданный клиент

Решение:

Исполнять будем на типовой ТиС 9.2 на примере документа "Реализация". ПРИМЕР УПРОЩЕННЫЙ (это не значит, что мы должны учесть все тонкости, типа, что разные документы одного вида могут быть оформлены в разных валютах или что надо обрабатывать только проведенные)

 //*******************************************************************

//
Процедура Сформировать()

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

Запрос.Выполнить(ТекстЗапроса);
//отладка
//ТЗ = ""; Запрос.Выгрузить(ТЗ,1,1);
//ПечатьТЗ(ТЗ);

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

КонецПроцедуры // Сформировать

Может, кому-то и пригодится.
Возможно, я туплю  и есть более простой и красивый вариант черным запросом? - тогда поделитесь...

Черный запрос Чорный запрос. Как получить количество документов

См. также

Запросы Программист Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

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

09.03.2016    38731    Serginio    22    

44

Универсальные функции Запросы Программист Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

На эту тему уже есть статьи, но этот способ нигде не описан. Хотя я его использую с тех пор, как занимаюсь программированием. Его преимущество в простоте и универсальности: можно применять на 1С, SQL, а также в любом другом языке программирования.

05.07.2015    22178    json    3    

22

Запросы Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Пример получения остатков по складу по запросу по почте из программы 1С 7.7. Для получения остатков необходимо пользователю с любого почтовика (с любого "мыла") отправить текст сообщения GiveMyStockBalance_ForAnalize на почтовый адрес определенный в Константа.СерверПолучения. Программа выдаст остатки (можно переписать функцию для выдачи любых данных) в формате xls на почту указанную в константе Константа.СерверОтправки. Программа может быть полезна в тех организациях где трудно или невозможно осуществить прямой доступ к 1С сотрудников для просмотра необходимых данных. Также можно организовать некий почтамт - запрос для клиентов - при посылке определенного логина клиентом на его почту будет автоматически выслана информация, например, акт сверки с клиентов, или процент выполнения его заказа и т.д.

3 стартмани

25.03.2014    25440    5    protexprotex    3    

5

Зарплата Запросы Программист Расчет 7.7 1С:Зарплата и кадры 7.7 Абонемент ($m)

Обзор методов реализации условий и функций с условиями в обращениях к журналу расчетов при помощи прямого запроса.

1 стартмани

06.12.2012    14308    nicotin    5    

9

Запросы Платформа 1С v7.7 Оперативный учет 7.7 Бухгалтерский учет 7.7 Расчет 7.7 Конфигурации 1cv7 Абонемент ($m)

Универсальный отчет для конфигураций на платформе 1С 7.7. Умеет обращатся к справочникам, документам, регистрам и журналам расчетов. Удобен для быстрого получения каких либо данных, которые можно получить посредствам запроса. Предусмотренна возможность сохранения настроек.

1 стартмани

14.04.2012    34303    309    set2333    16    

11

Запросы Программист Оперативный учет 7.7 1С:Комплексная 7.7 1С:Торговля и склад 7.7 Россия Бесплатно (free)

Первая статья из цикла статей "Прямые запросы:...". Рассказывается о применении класса ПрямойЗапрос и компоненты 1С++ для ускорения функции глВернутьЦену() в типовой конфигурации Торговля и склад. Платформа 7.7.

15.11.2011    16692    leshik    21    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Djelf 254 12.03.16 21:53 Сейчас в теме
Для 1sqlite как то так это выглядит

SELECT sum(S.Сумма) AS Сумма, count(*) AS Счетчик
FROM
(SELECT sum(ДР.Сумма) AS Сумма
FROM Журнал AS Ж
JOIN [ДокументСтроки.Реализация] AS ДР ON ДР.IDDOC=Ж.IDDOC
WHERE Ж.IDDOCDEF=:ВидДокумента.Реализация AND Ж.DATE BETWEEN :НачДата AND :КонДата
GROUP BY Ж.IDDOC) AS S
16. AlexO 135 19.07.17 11:05 Сейчас в теме
Немножко корявый запрос )
И нужно уж тогда
|ОбрабатыватьДокументы ВСЕ;

иначе по умолчанию - учитываются только проведенные. Также, если понадобится сортировка - обязательно нужно получить поле
|Док = Документ.Айфономания.ТекущийДокумент;

И функция СЧЁТЧИК() - далеко не универсальная и кривая: работает не всегда так, как ожидается, и только при наличии поля выбора хотя бы по одному реквизиту.
А их у документов общих может и не быть вовсе.
Если нужен действительно универсальный запрос - то использовать СУММА():
	ТекстЗапроса="
|ОбрабатыватьДокументы ВСЕ;
|Период С НачДата По КонДата;
|Рейтинг = Документ.Реализация.НомерСтроки;
|Функция КоличествоДокументов = Сумма(1) Когда(Рейтинг<2);
|Группировка Документ;
//|Условие (Контрагент = ВыбКонтрагент);
|";

В остальном - идея с рейтингом хорошая, но не совсем верная: если у документа вообще нет ТЧ - происходит ошибка и аварийное завершение работы при попытке получения НомерСтроки.
nad0_hto; +1 Ответить
19. CheBurator 2696 13.07.23 12:39 Сейчас в теме
(16)
если у документа вообще нет ТЧ - происходит ошибка и аварийное завершение работы при попытке получения НомерСтроки.

- Действительно. Однако идея считать итог ТЧ по документам у которых нет ТЧ - так себе ;-), разве только в каком-нибудь универсальном инструменте
.
Обрабатывать проведенные все - в постановке задачи описано ;-)
Счетчик() и Сумма() - ту не понял в части "..только при наличии поля выбора хотя бы по одному реквизиту. А их у документов общих может и не быть вовсе."
2. Djelf 254 12.03.16 22:13 Сейчас в теме
А 1с`запросом красиво получилось. Не видал пока такого! Спасибо.
4. CheBurator 2696 12.03.16 22:27 Сейчас в теме
(2) спасибо на добром слове
Тут фишка над которой я малость поломал голову в условии когда - в результате получилось красиво потому что получается типа

Документ1 номерстроки0
Или
Документ2 номерстроки1
Документ2 номерстроки2
5. CheBurator 2696 12.03.16 22:29 Сейчас в теме
(2) у меня вот просьба если можно
Можешь ли ты посмотреть в какой скульный запрос транслируется этот черный запрос - интересно мне. А у меня в округе нет скульных баз семерочных да и со скулем чтобы посмотреть во что это превратилось - я не дружу
??
6. Djelf 254 12.03.16 23:08 Сейчас в теме
(5) MS SQL не использую ;(
И я не верю что превратится в то же самое...
На дбф 1с переваривает такой запрос перебором, т.е. сначала дергает документы, а потом по каждому дергает табличную часть.
Это видно в строке состояния. Красиво, но по скорости - гадость!

А тут четкое попадание в яблочко!
первый этап WHERE Ж.IDDOCDEF=:ВидДокумента.Реализация AND Ж.DATE BETWEEN :НачДата AND :КонДата
попадает в индекс DOCTYPE - IDDOCDEF,DATE,TIME,IDDOC, по трем первым позициям
второй этап JOIN [ДокументСтроки.Реализация] AS ДР ON ДР.IDDOC=Ж.IDDOC
попадает в индекс IDLINE - IDDOC,LINENO, по 1й позиции
дальше 2 свертки, а 1sqlite делает это безумно быстро

Ха... 1С делает то же самое, судя по виду выполнения, но почему то значительно медленнее ;)

имхо, быстрее выдумать уже некуда!

З.Ы. Этот запрос и для MS SQL должен сработать с минимальными изменениями.
7. CheBurator 2696 12.03.16 23:28 Сейчас в теме
(6) а на чем у тебя клюшки крутятся псли не на скуле?
9. Djelf 254 12.03.16 23:51 Сейчас в теме
(7) А у меня 1C на Ubuntu в основной конторе ;) И терминальный доступ.
Дисковые операции отдыхают по нагрузке, правда formex грузит не слабо, но ресурс проца еще есть т.е. не критично.
MSSQL на отдельном сервере был, Selta@etersoft на PostgreSQL пробовался, но видимо dbf мое все!

И 1sqlite не работает с таблицами mssql, починить то можно, но нет стимула ;)
8. CheBurator 2696 12.03.16 23:29 Сейчас в теме
10. Il 30 13.03.16 06:24 Сейчас в теме
(6) Djelf, можно использовать класс http://infostart.ru/public/20823/, так вообще будет универсально под скуль и 1sqlite, вот только под связку постгри и этерсофт не пробовал.
11. chel-new 13.03.16 10:02 Сейчас в теме
(5) если еще интересно:
declare @p1 int
set @p1=180150017
declare @p3 int
set @p3=2
declare @p4 int
set @p4=1
declare @p5 int
set @p5=-1
exec sp_cursoropen @p1 output,N'sel ect convert(datetime, substring(_1SJOURN.DATE_TIME_IDDOC, 1, 8)), substring(_1SJOURN.DATE_TIME_IDDOC, 9, 6),
 _1SJOURN.IDDOCDEF, _1SJOURN.IDDOC,DT1611.SP1604 ,0,DT1611.SP1604,DH1611.SP1583,DT1611.LINENO_ 
fr om  _1SJOURN(NOLOCK) left outer join DT1611(NOLOCK) on _1SJOURN.IDDOC=DT1611.IDDOC join DH1611(NOLOCK) on _1SJOURN.IDDOC=DH1611.IDDOC 
where _1SJOURN.IDDOCDEF = 1611 and _1SJOURN.DATE_TIME_IDDOC >= ''20160201     0     0   '' and _1SJOURN.DATE_TIME_IDDOC <= ''20160229FHML6O     0   ''
 and _1SJOURN.CLOSED&1 = 1 and (((DH1611.SP1583 =''   4NG   '')))',@p3 output,@p4 output,@p5 output
select @p1, @p3, @p4, @p5
Показать


если честно нифига не нашел где Счётчик и где проверка на номер строки, похоже это уже 1Ска сама делает...
17. AlexO 135 19.07.17 11:08 Сейчас в теме
(2) потому и не видал, что идея из 8-шного пришла )))
18. CheBurator 2696 20.07.17 16:04 Сейчас в теме
(17) с учетом того, что я внутрь восьмерки заглядывал всего пару раз и вообще неа 8-ке не программлю - то какие там идеи внутрях - мне не особо ведомо.. ;-)
3. CheBurator 2696 12.03.16 22:19 Сейчас в теме
Спасибо
Потестю на досуге если соображу как этот текст всунуть в 1sqlite
12. premierex 204 13.03.16 14:50 Сейчас в теме
(0) а во такое условие Функция КоличествоДокументов = Счётчик() Когда(Рейтинг<2); зачем? Если в документе нет строк, то он тоже скорее всего, попадёт в результат и увеличит количество документов, хотя по сумме ни в какой результат не попадет.
P.S. Так, мелкая придирка, давно на 7.7 не писал, но код, как ни странно, ошеломления не вызвал )))
13. CheBurator 2696 13.03.16 14:54 Сейчас в теме
(12) Да, все верно. Запрос считает максимально "широко" - без ограничений на проведенность/непроведенность/удаление документа. В т.ч. и без ограничений по товароному составу (количеству строк документа). Если надо считать ТОЛЬКО ДОК С ЗАПОЛНЕННОЙ ТЧ (подробно обсасывали на форуме, по следам которого и сделал эту минипубликашку), то Функция КоличествоДокументов = Счётчик() Когда(Рейтинг=1);

14. CheBurator 2696 13.03.16 14:57 Сейчас в теме
(12) Опять же - это как пример. Кто-то захочет посчитать количество документов, где нет ТЧ (например, ПКО) - поправит реквизиты выборки и все. А если НомерСтроки=1 - то ничего и не посчитает. А с исходным условием - посчитается норм.
15. leov-001 25 16.03.16 14:36 Сейчас в теме
SET NOCOUNT ON
SELECT
  SUM($docsReal.Сумма) as Сумма 
, COUNT(j.IDDOC) КоличествоДокументов
FROM
  _1SJOURN as j WITH (NOLOCK)
  LEFT JOIN $Документ.Реализация as docReal WITH (NOLOCK) on docReal.IDDOC = j.IDDOC AND $docReal.Контрагент = :ВыбКонтрагент
  INNER JOIN $ДокументСтроки.Реализация as docsReal WITH (NOLOCK) on docsReal.IDDOC = docReal.IDDOC
WHERE
  j.IDDOCDEF=$ВидДокумента.Реализация 
  AND j.DATE BETWEEN :ДатаН AND :ДатаК 
  AND j.CLOSED&1 = 1 
GROUP BY j.IDDOC
Показать
20. CheBurator 2696 13.09.24 15:13 Сейчас в теме
Вот и самому себе пригодилось...
Оставьте свое сообщение