Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0
И снова здравствуйте! Уважаемые гуру, помогите, пожалуйста, разобраться в создании запросов. Хочу понять основные принципы и закрепить на практике. Вопросов будет несколько, но все по запросам. И все практические. Уважаемые Модераторы, прошу разрешить обсудить эти вопросы в одной теме. Думаю, так будет лучше. Они все будут касаться процедуры формирования запросов. Но если администрация сайта посчитает, что, все же, нужно по каждому вопросу создавать отдельную тему, я беспрекословно подчинюсь. Итак. У меня есть РасходныеНакладные по ремонтам техники. В табличной части этих накладных есть есть Товары с реквизитом ВидТовара = Товар, а есть различные виды выполняемых работ, которые в справочнике числятся как товар с реквизитом ВидТовара = Услуга. Мне нужно в отчете по всем проведенным накладным просуммировать все виды работ. Без, собственно, товаров. Например, есть товар с видом Услуга, который называется "Чистка бойлера". Или "ЗаменаНагревателя". Ясно, что это работа. Поэтому этот товар имеет ВидТовара = Услуга. Остальные же товары, например, Выключатель, Прокладка и т.д. имеет ВидТовара = Товар. После многих попыток я пришел к следующему коду, который работает:
ЗапросСуммы = СоздатьОбъект("Запрос"); ТекстЗапроса = " |Период с НачДата по КонДата; |ОбрабатыватьДокументы Проведенные;
|Товар = Документ.РасходнаяНакладная.Товар; |ВидТовара = Справочник.Номенклатура.ВидТовара; |СуммаСНДС = Документ.РасходнаяНакладная.СуммаСНДС; |Функция Сум = Сумма(СуммаСНДС); |Группировка Товар Без Групп; |Условие (ВидТовара = ВидТовараУм);"; ЗапросСуммы.Выполнить(ТекстЗапроса); Пока ЗапросСуммы.Группировка() = 1 Цикл СуммаУслуг = ЗапросСуммы.Сум;
КонецЦикла; Сообщить("Сумма:"+СуммаУслуг);
КонецПроцедуры
"Константа.ВидТовараУм" у меня в пользовательской программе выбран вид Услуга.
Но в результате я получаю не сумму услуг по всем накладным, а сумму цен всех товаров вместе с услугами по всем расходным накладным. Получается, что условие написано неправильно, и при каждом прохождении цикла условие видит ВидТовара = Услуга. Подскажите, пожалуйста, что я делаю неправильно и где ошибка? Спасибо!
В Вашем варианте получается,что обрабатываются все накладные,без учета условия. Получается что СправочникНоменклатура и ДокументРасходнаяНакладная в этом запросе работают не в паре !
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0
andrew76 @ Сегодня, 6:42
, да, так как Вы предложили, работает. Интересно, что я вчера примерно так же пробовал сделать, но, видимо, какую-то мелочь прописал неправильно. Спасибо!
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0
Здравствуйте. Возникла необходимость посчитать стоимость услуг для отдельного инженера по выданным аппаратам. Для этого мне нужно ввести в текст запроса еще одно условие. Даже два. Не могу сформировать этот проклятущий запрос. Никак не въеду. Мне программа выдает ошибку, что агрегатное поле объекта ТекущийЭлемент не обнаружено. А, кроме того, я не могу вывести Сообщить, потому что выскакивает ошибка, что переменная Инженер не определена. Как это лучше сделать?(
ZUBR @ Сегодня, 23:29
, я с трудом разобрался. В общем, поставил дополнительное условие по статусам заказов, и запрос работает правильно. Но как сюда втулить инженера, не могу понять. Помогите посчитать эту сумму для инженера, который в документе и в справочнике. Спасибо.
ЗапросСуммы.Выполнить(ТекстЗапроса); Пока ЗапросСуммы.Группировка() = 1 Цикл СуммаУслуг = ЗапросСуммы.Сум; КонецЦикла; Сообщить(Сотрудник); Сообщить(СуммаУслуг);
КонецЦикла;
КонецПроцедуры
Пока единственное, что я еще не понимаю в запросах - это Группировка. Где почитать? Что значит "Товар Без Групп". Очевидно, что Группировка - мощный метод. Надо его знать! Если кто поможет - буду признателен. Ну, и о функциях тоже. Правила их создания. Вообще, конечно, запрос - мощная штука.
Группа: Пользователи
Сообщений: 200
Из: Новая Каховка
Спасибо сказали: 203 раз
Рейтинг: 237.5
ZUBR @ Сегодня, 0:28
,
Представь результат выборки запроса в виде таблицы, потом эту таблицу свернули по полям, указанным в Группировка а по формулам Функция вычислили значения для этих группировок. Потом оператором Запрос.Группировка() мы перемещаемся по значениям группировок. "Без Групп" работает для значений типа "Справочник", исключает из выборки элементы - группы, потому как по умолчанию если группировка делается по справочнику, то система собирает в выборку все элементы с иерархией и вычисляет функции и для групп, т.е. при переборе Запрос.Группировка() будем получать группу, элемент и т.д. Если нам группы не нужны, пишем "Без групп".
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0
mut @ Вчера, 13:26
, хочу уточнить - правильно ли я понял, что "Без групп" к собственно Группировке отношения не имеет. То есть, Группировка - это не группы в справочниках? И Без групп можно писать отдельно?
Информация по запросам. С разрешения модератора.
[необходимо зарегистрироваться для просмотра ссылки]
Еще по запросам. Это начало [необходимо зарегистрироваться для просмотра ссылки]
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0
Теперь я дополнил текст запроса функцией Счетчик для подсчета количества сделанных систем. Запрос не работает. Выскакивает ошибка "Неожиданное выражение Счетчик()" и "Ошибка условия" во всех условиях, хотя я в условиях ничего не менял. Как правильно использовать функцию Счетчик?
Если ЗапросСуммы.Выполнить(ТекстЗапроса) <> 1 Тогда // если по какой-то причине запрос не выполнился Сообщить("Ошибка выполнения запроса"); Возврат; КонецЕсли;
Пока ЗапросСуммы.Группировка(1) = 1 Цикл // обходим первую по порядку группировку "Инженер" Сотрудник = ЗапросСуммы.Инженер; // на этом этапе выражение ЗапросСуммы.Сум будет равна сумме всех услуг оказанных данным инженером
Пока ЗапросСуммы.Группировка(2) = 1 Цикл // для каждого инженера обходим группировку "Товар" СуммаУслуг = ЗапросСуммы.Сум; КолСис = ЗапросСуммы.КолСис;
По группировкам хочу добавить: результат запроса больше будет похож на дерево, т.е. в первом цикле мы обойдем только одну группировку - Инженеров, во вложенном цикле для каждого инженера мы обойдем все услуги которые он указывал и т.д.
и таких группировок и вложенных циклов может быть сколько угодно. к тому же такое исполнение (всё что можно выбрать в запросе, выбираем в запросе) является более "правильным" с точки зрения методологии разработки, да и работать должно быстрее чем выполнение запроса внутри цикла.
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0
Даааа, ребята. Я в скобках Счетчика указывал и Товар, и Документ, и все равно запрос не работал, а то, что в слове Счётчик должна быть буква ЙО, а не Е, в голову не пришло! В этом моя основная ошибка. Тем не менее я вам всем благодарен за предложения по оптимизации запроса. Ваши критические советы очень мне помогают в изучении и освоении этого раздела! Очень интересно. Спасибо!
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0
Макс1С @ Вчера, 14:37
, Ваш вариант более профессионален, чем мой. Но и в моем, и в Вашем варианте есть проблема. Для меня. Функция КолСис считает количество сделанных аппаратов по товарам с типом Услуга. Но в одном аппарате в расходной накладной может присутствовать несколько типов товаров вида Услуга. Например, инженер сделал 1 аппарат. Сделал Ремонт и Чистку. И функция КолСис выдает 2. А нужно, чтобы она выдала 1 - он сделал 1 аппарат. Я пробовал считать по документам. Все равно запрос 2 раза проходит документ и КолСис выдает 2. Как можно решить эту проблему? Можно ли поставить функции КолСис условие товар = ремонт, например? Хотя, в некоторых документах может быть чистка и не быть ремонта. Как заставить функцию считать даный аппарат только раз, не зависимо от количества проходов?
ZUBR @ Сегодня, 1:54
, Верно, условия для функции есть, просто вы не писали о таком условии раньше )))) Зато хороший опыт получился с разными примерами .
Условие перенес в функцию, убрал группировку по товару - теперь он нам ни к чему, добавил переменную запроса "ТекДок" и счётчик именно по ней, т.е. считаем количество документов в которых есть услуги. Остался нюанс с функцией Сум - если оставить так - будет выводить всю сумму документа, можно добавить такое же условие по услуге или так:
|Функция СуммаУслуг = Сумма(СуммаСНДС) когда (ВидТовара = Перечисление.ВидыТоваров.Услуга); |Функция СуммаСистемы = Сумма(СуммаСНДС) когда (ВидТовара = Перечисление.ВидыТоваров.Товар);
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0
Макс1С @ Вчера, 9:29
, нет, результат такой же. Текущий документ считает столько раз, сколько товара с видом Услуга. Думаю, для подсчета количества надо делать отдельный запрос.
andrew76 @ Сегодня, 5:58
, Может и проще, но ТС в каждой новой теме добавляет вводные по частям для этой задачи, поэтому на этом этапе трудно сказать как лучше ))
ТЗ.НоваяКолонка ("Сотрудник"); ТЗ.НоваяКолонка ("КолСис"); // количество систем ТЗ.НоваяКолонка ("ОР"); // стоимость основной работы .................................................................................... ....................................................................................
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!