Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Помогите понять принцип создания запросов в 1с 7.7 конф 7.7.00 3 страниц V   1 2 3 >          
ZUBR Подменю пользователя
сообщение 08.09.19, 22:14
Сообщение #1

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 3

И снова здравствуйте! Уважаемые гуру, помогите, пожалуйста, разобраться в создании запросов. Хочу понять основные принципы и закрепить на практике. Вопросов будет несколько, но все по запросам. И все практические. Уважаемые Модераторы, прошу разрешить обсудить эти вопросы в одной теме. Думаю, так будет лучше. Они все будут касаться процедуры формирования запросов. Но если администрация сайта посчитает, что, все же, нужно по каждому вопросу создавать отдельную тему, я беспрекословно подчинюсь. Итак.
У меня есть РасходныеНакладные по ремонтам техники. В табличной части этих накладных есть есть Товары с реквизитом ВидТовара = Товар, а есть различные виды выполняемых работ, которые в справочнике числятся как товар с реквизитом ВидТовара = Услуга. Мне нужно в отчете по всем проведенным накладным просуммировать все виды работ. Без, собственно, товаров. Например, есть товар с видом Услуга, который называется "Чистка бойлера". Или "ЗаменаНагревателя". Ясно, что это работа. Поэтому этот товар имеет ВидТовара = Услуга. Остальные же товары, например, Выключатель, Прокладка и т.д. имеет ВидТовара = Товар. После многих попыток я пришел к следующему коду, который работает:


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

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


"Константа.ВидТовараУм" у меня в пользовательской программе выбран вид Услуга.

Но в результате я получаю не сумму услуг по всем накладным, а сумму цен всех товаров вместе с услугами по всем расходным накладным. Получается, что условие написано неправильно, и при каждом прохождении цикла условие видит ВидТовара = Услуга.
Подскажите, пожалуйста, что я делаю неправильно и где ошибка? Спасибо!

andrew76 Подменю пользователя
сообщение 09.09.19, 5:42
Сообщение #2

Оратор
*****
Группа: Пользователи
Сообщений: 437
Из: Казахстан
Спасибо сказали: 43 раз
Рейтинг: 43

ZUBR @ Сегодня, 1:14 * ,

А ВидТовара
Цитата(ZUBR @ 09.09.19, 1:14) *
|Товар = Документ.РасходнаяНакладная.Товар; |ВидТовара = Справочник.Номенклатура.ВидТовара;


Наверное условие должно выглядеть как-то так :

|Товар = Документ.РасходнаяНакладная.Товар.ВидТовара;  //вместо  |ВидТовара = Справочник.Номенклатура.ВидТовара;
|Условие (ВидТовара = ВидТовараУм);";


В Вашем варианте получается,что обрабатываются все накладные,без учета условия.
Получается что СправочникНоменклатура и ДокументРасходнаяНакладная в этом запросе работают не в паре !

Попробуйте вот так :

Процедура Сформировать()   
    НужныйТовар = Константа.НужныйТовар;
    ВидТовараУм = Константа.ВидТовараУм;
    
    ЗапросСуммы = СоздатьОбъект("Запрос");

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

Сообщить("Сумма:"+СуммаУслуг);

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

Спасибо сказали: ZUBR,

ZUBR Подменю пользователя
сообщение 09.09.19, 18:03
Сообщение #3

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 3

andrew76 @ Сегодня, 6:42 * , да, так как Вы предложили, работает. Интересно, что я вчера примерно так же пробовал сделать, но, видимо, какую-то мелочь прописал неправильно. Спасибо!

ZUBR Подменю пользователя
сообщение 16.09.19, 23:05
Сообщение #4

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 3

Здравствуйте. Возникла необходимость посчитать стоимость услуг для отдельного инженера по выданным аппаратам. Для этого мне нужно ввести в текст запроса еще одно условие. Даже два. Не могу сформировать этот проклятущий запрос. Никак не въеду. Мне программа выдает ошибку, что агрегатное поле объекта ТекущийЭлемент не обнаружено. А, кроме того, я не могу вывести Сообщить, потому что выскакивает ошибка, что переменная Инженер не определена. Как это лучше сделать?(

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


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


Спасибо!

ZUBR @ Сегодня, 23:29 * , я с трудом разобрался. В общем, поставил дополнительное условие по статусам заказов, и запрос работает правильно. Но как сюда втулить инженера, не могу понять. Помогите посчитать эту сумму для инженера, который в документе и в справочнике. Спасибо.

Это работает. Что и как добавить для инженера?

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

                           Сообщить(СуммаУслуг);
                  
КонецПроцедуры

ZUBR Подменю пользователя
сообщение 17.09.19, 23:28
Сообщение #5

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 3

Все, решил. После долгих попыток код следующий:


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

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

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


Пока единственное, что я еще не понимаю в запросах - это Группировка. Где почитать? Что значит "Товар Без Групп".
Очевидно, что Группировка - мощный метод. Надо его знать! Если кто поможет - буду признателен. Ну, и о функциях тоже. Правила их создания. Вообще, конечно, запрос - мощная штука.

ZUBR Подменю пользователя
сообщение 18.09.19, 1:10
Сообщение #6

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 3

Нашел неплохую статью по запросам. Не знаю, можно ли дать ссылку.

Vofka Подменю пользователя
сообщение 18.09.19, 8:07
Сообщение #7

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13947
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3634.6

Цитата(ZUBR @ 18.09.19, 2:10) *
Нашел неплохую статью по запросам. Не знаю, можно ли дать ссылку.

Если это тематическая полезная информация, не реклама - то можно.

Спасибо сказали: ZUBR,

mut Подменю пользователя
сообщение 18.09.19, 12:26
Сообщение #8

Завсегдатай
****
Группа: Пользователи
Сообщений: 199
Из: Новая Каховка
Спасибо сказали: 203 раз
Рейтинг: 237.5

ZUBR @ Сегодня, 0:28 * ,

Представь результат выборки запроса в виде таблицы, потом эту таблицу свернули по полям, указанным в Группировка а по формулам Функция вычислили значения для этих группировок. Потом оператором Запрос.Группировка() мы перемещаемся по значениям группировок.
"Без Групп" работает для значений типа "Справочник", исключает из выборки элементы - группы, потому как по умолчанию если группировка делается по справочнику, то система собирает в выборку все элементы с иерархией и вычисляет функции и для групп, т.е. при переборе Запрос.Группировка() будем получать группу, элемент и т.д. Если нам группы не нужны, пишем "Без групп".

Спасибо сказали: ZUBR,

ZUBR Подменю пользователя
сообщение 18.09.19, 23:30
Сообщение #9

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 3

mut @ Вчера, 13:26 * , хочу уточнить - правильно ли я понял, что "Без групп" к собственно Группировке отношения не имеет. То есть, Группировка - это не группы в справочниках? И Без групп можно писать отдельно?


Информация по запросам. С разрешения модератора.

[необходимо зарегистрироваться для просмотра ссылки]

Еще по запросам. Это начало
[необходимо зарегистрироваться для просмотра ссылки]

ZUBR Подменю пользователя
сообщение 19.09.19, 1:11
Сообщение #10

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 3

Теперь я дополнил текст запроса функцией Счетчик для подсчета количества сделанных систем. Запрос не работает. Выскакивает ошибка "Неожиданное выражение Счетчик()" и "Ошибка условия" во всех условиях, хотя я в условиях ничего не менял. Как правильно использовать функцию Счетчик?
Процедура Сформировать()   

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


Че-то глюкануло и стала такая картинка. Не имею возможности исправить. Модератор, исправьте, пожалуйста...

Сообщение отредактировал Vofka - 19.09.19, 8:16

Макс1С Подменю пользователя
сообщение 19.09.19, 13:37
Сообщение #11

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 189
Из: Днепр
Спасибо сказали: 62 раз
Рейтинг: 58.6

ZUBR @ Сегодня, 2:11 * ,
Попробуйте
|Функция КолСис = Счетчик(Товар);


надо же сказать программе что мы будем считать )))

Макс1С @ Сегодня, 13:37 * ,
сорри, не досмотрел: через букву "ё"

|Функция КолСис = Счётчик(Товар);


В качестве примера предлагаю так переделать запрос:

Процедура Сформировать()    
    ЗапросСуммы = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "    
    |Период с НачДата по КонДата;
    |ОбрабатыватьДокументы Проведенные;
    |Инженер = Документ.РасходнаяНакладная.Инженер;
    |Товар = Документ.РасходнаяНакладная.Товар;
    |СтатусЗаказа = Документ.РасходнаяНакладная.СтатусЗаказа;
    |ВидТовара = Документ.РасходнаяНакладная.Товар.ВидТовара;
    |СуммаСНДС = Документ.РасходнаяНакладная.СуммаСНДС;
    |Функция Сум = Сумма(СуммаСНДС);
    |Функция КолСис = Счётчик(Товар);
    |Группировка Инженер;
    |Группировка Товар Без Групп;
    |Условие ((СтатусЗаказа = Перечисление.Статусы.Выдан)или(СтатусЗаказа = Перечисление.Статусы.Выезд));
    |Условие (ВидТовара = Перечисление.ВидыТоваров.Услуга);";
          
    Если ЗапросСуммы.Выполнить(ТекстЗапроса) <> 1 Тогда
        // если по какой-то причине запрос не выполнился
        Сообщить("Ошибка выполнения запроса");
        Возврат;
    КонецЕсли;
    
    Пока ЗапросСуммы.Группировка(1) = 1 Цикл    // обходим первую по порядку группировку "Инженер"
        Сотрудник = ЗапросСуммы.Инженер;
        // на этом этапе выражение ЗапросСуммы.Сум будет равна сумме всех услуг оказанных данным инженером    
        
        Пока ЗапросСуммы.Группировка(2) = 1 Цикл   // для каждого инженера обходим группировку "Товар"
            СуммаУслуг = ЗапросСуммы.Сум;
            КолСис = ЗапросСуммы.КолСис;
            
            Услуга = ЗапросСуммы.Товар;
            
            Сообщить(Сотрудник);
            Сообщить(Услуга);
            Сообщить(СуммаУслуг);
            Сообщить(КолСис);
        КонецЦикла;    
    КонецЦикла;  
КонецПроцедуры


По группировкам хочу добавить:
результат запроса больше будет похож на дерево, т.е. в первом цикле мы обойдем только одну группировку - Инженеров, во вложенном цикле для каждого инженера мы обойдем все услуги которые он указывал и т.д.

и таких группировок и вложенных циклов может быть сколько угодно.
к тому же такое исполнение (всё что можно выбрать в запросе, выбираем в запросе) является более "правильным" с точки зрения методологии разработки, да и работать должно быстрее чем выполнение запроса внутри цикла.

Спасибо сказали: ZUBR,

ZUBR Подменю пользователя
сообщение 19.09.19, 23:49
Сообщение #12

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 3

Даааа, ребята. Я в скобках Счетчика указывал и Товар, и Документ, и все равно запрос не работал, а то, что в слове Счётчик должна быть буква ЙО, а не Е, в голову не пришло! В этом моя основная ошибка. 32541510.gif 32541510.gif Тем не менее я вам всем благодарен за предложения по оптимизации запроса. Ваши критические советы очень мне помогают в изучении и освоении этого раздела! Очень интересно. Спасибо!

ZUBR Подменю пользователя
сообщение 20.09.19, 0:54
Сообщение #13

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 3

Макс1С @ Вчера, 14:37 * , Ваш вариант более профессионален, чем мой. Но и в моем, и в Вашем варианте есть проблема. Для меня. Функция КолСис считает количество сделанных аппаратов по товарам с типом Услуга. Но в одном аппарате в расходной накладной может присутствовать несколько типов товаров вида Услуга. Например, инженер сделал 1 аппарат. Сделал Ремонт и Чистку. И функция КолСис выдает 2. А нужно, чтобы она выдала 1 - он сделал 1 аппарат. Я пробовал считать по документам. Все равно запрос 2 раза проходит документ и КолСис выдает 2. Как можно решить эту проблему? Можно ли поставить функции КолСис условие товар = ремонт, например? Хотя, в некоторых документах может быть чистка и не быть ремонта. Как заставить функцию считать даный аппарат только раз, не зависимо от количества проходов?

Макс1С Подменю пользователя
сообщение 20.09.19, 8:29
Сообщение #14

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 189
Из: Днепр
Спасибо сказали: 62 раз
Рейтинг: 58.6

ZUBR @ Сегодня, 1:54 * ,
Верно, условия для функции есть, просто вы не писали о таком условии раньше )))) Зато хороший опыт получился с разными примерами .

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

Условие перенес в функцию, убрал группировку по товару - теперь он нам ни к чему, добавил переменную запроса "ТекДок" и счётчик именно по ней, т.е. считаем количество документов в которых есть услуги.
Остался нюанс с функцией Сум - если оставить так - будет выводить всю сумму документа, можно добавить такое же условие по услуге или так:
 |Функция СуммаУслуг = Сумма(СуммаСНДС)  когда (ВидТовара = Перечисление.ВидыТоваров.Услуга);
|Функция СуммаСистемы = Сумма(СуммаСНДС)  когда (ВидТовара = Перечисление.ВидыТоваров.Товар);




ZUBR Подменю пользователя
сообщение 20.09.19, 23:58
Сообщение #15

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 3

Макс1С @ Вчера, 9:29 * , нет, результат такой же. Текущий документ считает столько раз, сколько товара с видом Услуга. Думаю, для подсчета количества надо делать отдельный запрос.

andrew76 Подменю пользователя
сообщение 21.09.19, 16:52
Сообщение #16

Оратор
*****
Группа: Пользователи
Сообщений: 437
Из: Казахстан
Спасибо сказали: 43 раз
Рейтинг: 43

ZUBR @ Сегодня, 2:58 * ,
Цитата(ZUBR @ 21.09.19, 2:58) *
Например, инженер сделал 1 аппарат. Сделал Ремонт и Чистку. И функция КолСис выдает 2. А нужно, чтобы она выдала 1 - он сделал 1 аппарат.


Группировка в запросе по реквизиту Инженер.Вот и "склеивается" результат запроса.

Макс1С Подменю пользователя
сообщение 22.09.19, 23:34
Сообщение #17

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 189
Из: Днепр
Спасибо сказали: 62 раз
Рейтинг: 58.6

ZUBR @ 21.09.19, 0:58 * ,
Тогда так:
Добавим группировку по документу
 
|Группировка Инженер;
|Группировка ТекДок;

и посчитаем их не в запросе
    Пока ЗапросСуммы.Группировка(1) = 1 Цикл    // обходим первую по порядку группировку "Инженер"
        Сотрудник = ЗапросСуммы.Инженер;

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

andrew76 Подменю пользователя
сообщение 23.09.19, 4:58
Сообщение #18

Оратор
*****
Группа: Пользователи
Сообщений: 437
Из: Казахстан
Спасибо сказали: 43 раз
Рейтинг: 43

Может проще будет выгрузить весь запрос в Таблицу Значений, и далее свернуть (и просуммировать) по нужным колонкам ?

Макс1С Подменю пользователя
сообщение 23.09.19, 8:41
Сообщение #19

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 189
Из: Днепр
Спасибо сказали: 62 раз
Рейтинг: 58.6

andrew76 @ Сегодня, 5:58 * ,
Может и проще, но ТС в каждой новой теме добавляет вводные по частям для этой задачи, поэтому на этом этапе трудно сказать как лучше ))

ZUBR Подменю пользователя
сообщение 23.09.19, 23:48
Сообщение #20

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 3

ТС решил сделать так:


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

Спр.ВыбратьЭлементы();
      
      Пока Спр.ПолучитьЭлемент()=1 Цикл
        
          ТЗ.НоваяСтрока();
          ТЗ.Сотрудник = Спр.Наименование;
          ....................................................
                ....................................................
        К = 0;
        ОР = 0;
              
        Расх.ВыбратьДокументы(НачДата,КонДата);
          
      Пока Расх.ПолучитьДокумент()=1 Цикл  
          
          Если (ТЗ.Сотрудник = Расх.Инженер.Наименование) и
          ((Расх.СтатусЗаказа = Перечисление.Статусы.Выдан)
          или(Расх.СтатусЗаказа = Перечисление.Статусы.Выезд)или(Расх.СтатусЗаказа = Перечисление.Статусы.ВыдОтказ)) Тогда
                К=К+1;
              КонецЕсли;
              
      КонецЦикла;
      
      Сотрудник = Спр.ТекущийЭлемент();
      
    ЗапросСуммыУслуг.Выполнить(ТекстЗапроса);
                         Пока ЗапросСуммыУслуг.Группировка() = 1 Цикл
                            СуммаУслуг = ЗапросСуммыУслуг.Сум;
                                                    КонецЦикла;
                      // Сообщить(ТЗ.Сотрудник);
                      // Сообщить(СуммаУслуг);
                      
                       
      
      
      
      
       ТЗ.КолСис = К;
       ТЗ.ОР = СуммаУслуг;
       ................................
           ................................
    
     КонецЦикла;

     ТЗ.ВыбратьСтроку();

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

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


3 страниц V   1 2 3 >
Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 19.03.24, 5:32
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!