7.7 Подсчет количества повторений в запросе

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем Ktyf, 29 окт 2015.

  1. TopicStarter Overlay
    Ktyf
    Offline

    Ktyf Опытный в 1С

    Регистрация:
    16 янв 2013
    Сообщения:
    457
    Симпатии:
    12
    Баллы:
    29
    Задача: надо выбрать из документа РасходНакл водителя и грузополучателя, потом надо подсчитать сколько раз за период этот водитель ездил к этому к этому грузополучателю. Особенность в том, что он в одну поездку может вести несколько накладных, т.е простой подсчет количества не адекватно.
    Код:
    "//{{ЗАПРОС(Сформировать)
        |Период с ВыбНачПериода по ВыбКонПериода;
        |Агент = Документ.РасходнаяНакладнаяМяс.Водитель;
        |ДатаДок = Документ.РасходнаяНакладнаяМяс.ДатаДок;
        |Количество = Документ.РасходнаяНакладнаяМяс.Количество;
        |Всего = Документ.РасходнаяНакладнаяМяс.Всего;
        |Грузополучатель = Документ.РасходнаяНакладнаяМяс.Грузополучатель;
        |Функция КолПоезд = Счётчик(Грузополучатель);
        |Функция Кол = Сумма(Количество);
        |Функция КолПр = Сумма(Количество*?((Товар.Вес=0) или (СокрЛП(Товар.ЕдиницаИзмерения.Наименование)=""кг""),1,Товар.Вес));        
        |Функция Сумма = Сумма(Всего);
        |Группировка Агент без групп;
        |Группировка Грузополучатель;
        |Условие(Агент в ВыбАгент);
        |Условие(Грузополучатель в ВыбГрузополучатель);
        |"//}}ЗАПРОС
    
    вот такой код запроса выдает мне ,что за один день он ездил 5 (к примеру) раз к Иванову И.И. Хотя по факту он был там 1 раз и отвез 5 накладных
    --- Объединение сообщений, 29 окт 2015 ---
    можно в запросе в качестве аргумента функции использовать другую функцию? Что-то типа
    Код:
    | Функция КолВоВхождений = сумма(КолПоезд/КолПоезд)
    Последнее редактирование: 29 окт 2015
  2. TopicStarter Overlay
    Ktyf
    Offline

    Ktyf Опытный в 1С

    Регистрация:
    16 янв 2013
    Сообщения:
    457
    Симпатии:
    12
    Баллы:
    29
    Написала несколько вариантов
    1. |Функция КолВоВхождений = сумма(Запрос.КолПоезд/Запрос.КолПоезд) Когда (Запрос.КолПоезд>0); - выдает деление на 0;
    2. |Функция КолВоВхождений = сумма(Запрос.КолПоезд/?(Запрос.КолПоезд>0,Запрос.КолПоезд,1)); - выдает то же самое значение что и Запрос.КолПоезд
    3. |Функция КолВоВхождений = Запрос.КолПоезд/?(Запрос.КолПоезд>0,Запрос.КолПоезд,1); - программа вываливается вообще и в конфигураторе выдает ошибку Запрос[11] : Неожиданное выражение 'Запрос'
  3. Хряк
    Offline

    Хряк Профессионал в 1С

    Регистрация:
    26 сен 2007
    Сообщения:
    1.447
    Симпатии:
    37
    Баллы:
    54
    выгрузи в тз и сверни по дате, грузополучателю, накладным
  4. TopicStarter Overlay
    Ktyf
    Offline

    Ktyf Опытный в 1С

    Регистрация:
    16 янв 2013
    Сообщения:
    457
    Симпатии:
    12
    Баллы:
    29
    Способ построения такой ТЗ будет аналогичен 1с 8: т.е. сначала группировка - потом входящие в нее строки?. Просто я не могу запустить отладчик, пишу эмпирически так сказать
  5. Хряк
    Offline

    Хряк Профессионал в 1С

    Регистрация:
    26 сен 2007
    Сообщения:
    1.447
    Симпатии:
    37
    Баллы:
    54
    мда...

    может клиента отдать специалисту?
  6. TopicStarter Overlay
    Ktyf
    Offline

    Ktyf Опытный в 1С

    Регистрация:
    16 янв 2013
    Сообщения:
    457
    Симпатии:
    12
    Баллы:
    29
    рассмешили..... А если не клиент, а работодатель?
  7. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Ktyf у Свернуть() такой же синтаксис как в 8-ке, насколько помню.
  8. TopicStarter Overlay
    Ktyf
    Offline

    Ktyf Опытный в 1С

    Регистрация:
    16 янв 2013
    Сообщения:
    457
    Симпатии:
    12
    Баллы:
    29
    т.е. без ТЗ не вариант обойтись? Жалко..
    т.е. первый параметр- группирует, второй - складывает, не вошедшие выкидывает
    --- Объединение сообщений, 29 окт 2015 ---
    Пишу
    Код:
    Запрос = СоздатьОбъект("Запрос");
        ТекстЗапроса =
        "//{{ЗАПРОС(Сформировать)
        |Период с ВыбНачПериода по ВыбКонПериода;   
        |Договор1 = Документ.РасходнаяНакладнаяМяс.Договор1;
        |Агент = Документ.РасходнаяНакладнаяМяс.Водитель;
        |ДатаДок = Документ.РасходнаяНакладнаяМяс.ДатаДок;
        |Товар = Документ.РасходнаяНакладнаяМяс.Товар;
        |Количество = Документ.РасходнаяНакладнаяМяс.Количество;
        |Всего = Документ.РасходнаяНакладнаяМяс.Всего;
        |Грузополучатель = Документ.РасходнаяНакладнаяМяс.Грузополучатель;
        |Функция КолПоезд = Счётчик(Грузополучатель);
        |Функция КолВоВхождений = Максимум(Запрос.КолПоезд/?(Запрос.КолПоезд>0,Запрос.КолПоезд,1));
        |Функция Кол = Сумма(Количество);
        |Функция КолПр = Сумма(Количество*?((Товар.Вес=0) или (СокрЛП(Товар.ЕдиницаИзмерения.Наименование)=""кг""),1,Товар.Вес));         
        |Функция Сумма = Сумма(Всего);
        |Группировка Агент без групп;
        |Группировка Грузополучатель без групп;
        |Группировка Договор1 без групп;
        |Условие(Агент в ВыбАгент);
        |Условие(Грузополучатель в ВыбГрузополучатель);
        |"//}}ЗАПРОС
    
        ТЗ = СоздатьОБъект("ТаблицаЗначений");
        Запрос.Выгрузить(ТЗ);
        ТЗ.Свернуть("Агент, Грузополучатель, Договор1","КолВоВхождений");
        ТЗ.ВыбратьСтроки();
        Пока ТЗ.ПолучитьСтроку()=1 Цикл
            Сообщить(Строка(ТЗ.Агент)+" + "+Строка(ТЗ.грузополучатель) + " + "+Строка(ТЗ.Договор1) + " + "+Строка(ТЗ.КолВоВхождений));
        КонецЦикла;
    получаю
    Булатов Сергей Ильич + Аббасов И.Х г. Георгиевск + + 1
    Булатов Сергей Ильич + Аббасов И.Х г. Георгиевск + Основной договор + 1

    Почему после сворачивания с учетом Договора остаются строки, где Договор пустой??
    Последнее редактирование: 29 окт 2015
  9. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Потому что в какой-то накладной Договор1 не заполнен?
    Тогда надо:
    ТЗ.Свернуть("Агент, Грузополучатель","КолВоВхождений");
    Если договор не нужен.
  10. TopicStarter Overlay
    Ktyf
    Offline

    Ktyf Опытный в 1С

    Регистрация:
    16 янв 2013
    Сообщения:
    457
    Симпатии:
    12
    Баллы:
    29
    с этого и начала, и получала КолВоВхождений=2, ввела еще и договор и увидела задвоенность строк.
    Можно как-либо при выгрузке в ТЗ указывать что надо выгружать группировки, без строк
  11. Хряк
    Offline

    Хряк Профессионал в 1С

    Регистрация:
    26 сен 2007
    Сообщения:
    1.447
    Симпатии:
    37
    Баллы:
    54
    не пойму, синтаксис-помощник отключила? научи
  12. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Ой, я 77 уже не помню. Че там в запросе обязательно писать "Группировка Договор1 без групп;" ?
  13. TopicStarter Overlay
    Ktyf
    Offline

    Ktyf Опытный в 1С

    Регистрация:
    16 янв 2013
    Сообщения:
    457
    Симпатии:
    12
    Баллы:
    29
    Вот такая задвоенность строк идет по всем грузополучателям, это я просто одного показала.
  14. Хряк
    Offline

    Хряк Профессионал в 1С

    Регистрация:
    26 сен 2007
    Сообщения:
    1.447
    Симпатии:
    37
    Баллы:
    54
    см.помощь по выгрузитьзапрос
  15. TopicStarter Overlay
    Ktyf
    Offline

    Ktyf Опытный в 1С

    Регистрация:
    16 янв 2013
    Сообщения:
    457
    Симпатии:
    12
    Баллы:
    29
    ну справочник Договора, не имеет групп так что здесь это можно опустить. Но на результат это не влияет.
    и посмотрела и почитала и ничего не поняла
  16. TopicStarter Overlay
    Ktyf
    Offline

    Ktyf Опытный в 1С

    Регистрация:
    16 янв 2013
    Сообщения:
    457
    Симпатии:
    12
    Баллы:
    29
    Где считаются функции запроса: для каждой строки или для группировки?
    Уже нашла - для всех уровней.
    Последнее редактирование: 29 окт 2015
  17. TopicStarter Overlay
    Ktyf
    Offline

    Ktyf Опытный в 1С

    Регистрация:
    16 янв 2013
    Сообщения:
    457
    Симпатии:
    12
    Баллы:
    29
    Если один момент, который я не могу понять
    Код:
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
            Возврат;
        КонецЕсли;
        тзОсновная = СоздатьОбъект("ТаблицаЗначений");  
        Запрос.Выгрузить(тзОсновная);
        тзОсновная.УдалитьСтроки();
    
       
        ТЗ = СоздатьОБъект("ТаблицаЗначений");
        Запрос.Выгрузить(ТЗ);
    
        ТЗ.ВыбратьСтроки();
        Пока ТЗ.ПолучитьСтроку()=1 Цикл 
            Если Строка(ТЗ.Договор) <>"" Тогда
                Сообщить(Строка(ТЗ.Агент)+" + "+Строка(ТЗ.грузополучатель) + " + "+Строка(ТЗ.Договор) + " + "+Строка(ТЗ.КолВоВхождений)+ " + "+ТЗ.КолВоНакладных);
                тзОсновная.НоваяСтрока();
                тзОсновная.Агент = ТЗ.Агент;
                тзОсновная.Грузополучатель = ТЗ.Грузополучатель.наименование;
                тзОсновная.Договор = Строка(ТЗ.Договор);
              КонецЕсли;
        КонецЦикла;
    Выгружаю запрос в тзОсновная и удаляю ее строки для того, чтобы не создавать колонки и указывать их тип. (Я знаю, что это время - но мне сейчас не до того). Потом перебором по условию выбираю нужные строки и копирую их в тзОсновную. И там значений НЕТ!!!!! Пробовала 3 варианта - ни один не сработал!!!
  18. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Агент = Документ.РасходнаяНакладнаяМяс.Водитель;
    |Грузополучатель = Документ.РасходнаяНакладнаяМяс.Грузополучатель;
    |Функция КолПоезд = Счётчик(Грузополучатель);
    |Группировка Агент без групп;
    |Группировка Грузополучатель;
    |Условие(Агент в ВыбАгент);
    |Условие(Грузополучатель в ВыбГрузополучатель);
    |"//}}ЗАПРОС

    вот так посчитает количество "ездок"
  19. TopicStarter Overlay
    Ktyf
    Offline

    Ktyf Опытный в 1С

    Регистрация:
    16 янв 2013
    Сообщения:
    457
    Симпатии:
    12
    Баллы:
    29
    так посчитается количество накладных, в один день на одного грузополучателя их может быть выписано до 4-х шт.
  20. Хряк
    Offline

    Хряк Профессионал в 1С

    Регистрация:
    26 сен 2007
    Сообщения:
    1.447
    Симпатии:
    37
    Баллы:
    54
    Если СокрЛП(ТЗ.Договор)<>""
    ...

    и посмотри уже параметры для Выгрузить
    можно и без лишних строк получить тз

Поделиться этой страницей