Привет.Знаю, название темы завернул
ТИС 7.7
Стоит задача видеть количество категорий товаров торговых точек торговых агентов с возможностью развернуть контрагентами.
Из того, что мне пришло в голову и я пробовал:
Запросом к Расходной выбирал, Торгового агента, Контрагента и Товар.
Потом в группировке по товару выбирал его категории.
Потом по каждому Торговому в ТЗ сворачивал его категории.
В другой ТЗ считал количество-торговых точек торгового.
В общем получлось сложно и геморно.Может кто подскажет более оптимальное решение.
И пока что не представляю каким макаром можно посчитать кол-во торговых точек по категориям.
Видеть нужно такое на выходе.
Делаем одну ТЗ с колонками:
Агент|Товар|Категория|Контрагент|КвоКонтрагентов
Вася1|Това1|Категори1|Контраген1|1
Вася2|Това2|Категори2|Контраген2|1
Вася6|Това4|Категори4|Контраген3|1
А потом из этой ТЗ путем свёртки получаем любые варианты.
А как свернуть тз по колонке Категория для каждого Торгового?
Ага, затупил.По ходу ТЗ.Свернуть("Торговый","Категория").
ТЗ.Свернуть("Агент,Категория","КвоКонтрагентов")
Что-то не вяжется.Как увидеть сколько продаж было по каждой категории?
в описании темы нету никаких прдаж.
ТЗ.Свернуть("Агент,Категория","КвоКонтрагентов")
Блин.Не получается.Быть может что-то еще не так делаю?
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с ВыбНачПериода по ВыбКонПериода;
|Обрабатывать НеПомеченныеНаУдаление;
|ТорговыйАгент = Документ.РасходнаяНакладная.Контрагент.ТорговыйАгент;
|Контрагент = Документ.РасходнаяНакладная.Контрагент;
|Товар = Документ.РасходнаяНакладная.Товар;
|Группировка ТорговыйАгент без групп;
|Группировка Контрагент без групп;
|Группировка Товар без групп;
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
// Подготовка к заполнению выходных форм данными запроса
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Сформировать");
// Заполнение полей "Заголовок"
Таб.ВывестиСекцию("Заголовок");
Состояние("Заполнение выходной таблицы...");
Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
Пока Запрос.Группировка(1) = 1 Цикл
// Заполнение полей ТорговыйАгент
ТЗ.НоваяСтрока();
ТЗ.ТорговыйАгент = Запрос.ТорговыйАгент;
КвоКатегорий = 0;
Пока Запрос.Группировка(2) = 1 Цикл
// Заполнение полей Контрагент
ТЗ.Контрагент = Запрос.Контрагент;
КоличествоКонтрагентов = КоличествоКонтрагентов+1;
Пока Запрос.Группировка(3) = 1 Цикл
// Заполнение полей Товар
ТЗ.НоваяСтрока();
ТЗ.Товар = Запрос.Товар;
СпрКатегорий.ИспользоватьВладельца(Запрос.Товар);
СпрКатегорий.ВыбратьЭлементы();
Пока СпрКатегорий.ПолучитьЭлемент() = 1 Цикл
Если СпрКатегорий.Категория.ПометкаУдаления() = 1 Тогда
Продолжить;
Иначе
ТЗ.НоваяСтрока();
ТЗ.Категория = СпрКатегорий.Категория;
ТЗ.КвоКатегорий = КвоКатегорий + 1;
КонецЕсли;
КонецЦикла
КонецЦикла;
ТЗ.КвоКонтрагентов = КоличествоКонтрагентов;
КонецЦикла;
КоличествоКонтрагентов = 0;
КонецЦикла;
// Вывод заполненной формы
ТЗ.Свернуть("ТорговыйАгент,Категория","КвоКонтрагентов");
ТЗ.ВыбратьСтроку();
КонецПроцедуры
Flexy, в тему я еще широко и глубоко не вникла. Бросилось в глаза, что функции в запросе не используете, а все суммируете при обходе запроса. Посмотрите через конструктор запроса - там есть функция счетчик - кажется так. и то что вижу, можно сделать только запросом + при обходе присоединять вертикальную секцию (категория) (недавно подобную структуру делала, даже тема была заведена).
Функция счетчик считает только те значения, у которых тип = число.Хотя в СП написано, что она должна считать количество записей в выборке.
У меня нет проблемы в том, что бы присоединить секцию.
Проблема в том, что я не могу посчитать Количество Торговых Точек торгового агента в разрезе категорий товаров.
Еще раз объясню популярно:
Надо видеть что у Торгового Агента Васи Отработано По Категории А1 - 20 точек, по категории Б1 - 5 точек и т.д.
ТЗ как писали выше я уже имею.Но она не сворачивается, как мне надо.
тз на форме обработки создавали? что там заполнено? можно для контроля тз оставить и смотреть рез свертки по кнопке
"сворачиваете" вроде верно
еще вы плюсуюте при обходе, а нужно просто единицу - новая строка(); квоконтрагентов=1;
счетчик можно заменить таким или похожим способом.(нулевстрока="") в верхних группировках - плюсуюет, т е показывает итоговые суммы.
все бы хорошо, если бы еще группировкой сделать категорию. но это подчиненный справочник к Товару ...
|контраг = Документ.РасходнаяНакладная.Контрагент.Наименование;
|Контрагент = Документ.РасходнаяНакладная.Контрагент;
|Функция Ксчетчик = Сумма(1) когда(контраг <> нулевстрока);
Еще, если не по ЗАпросу, а по коду обхода Запроса. То привести таблицу к виду, кот указал Ardi, можно где-то так
Пока Запрос.Группировка(1) = 1 Цикл
Пока Запрос.Группировка(2) = 1 Цикл
Пока Запрос.Группировка(3) = 1 Цикл
СпрКатегорий.ИспользоватьВладельца(Запрос.Товар);
СпрКатегорий.ВыбратьЭлементы();
Пока СпрКатегорий.ПолучитьЭлемент() = 1 Цикл
Если СпрКатегорий.Категория.ПометкаУдаления() = 1 Тогда
Продолжить;
Иначе
ТЗ.НоваяСтрока();
ТЗ.ТорговыйАгент = Запрос.ТорговыйАгент;
ТЗ.Контрагент = Запрос.Контрагент;
ТЗ.Товар = Запрос.Товар;
ТЗ.Категория = СпрКатегорий.Категория;
ТЗ.КвоКонтрагентов= 1;
КонецЕсли;
КонецЦикла
КонецЦикла;
КонецЦикла;
КонецЦикла;
Спасибо.Получилось.Но только ТЗ надо было свернуть 2 раза.
ТЗ.Свернуть("ТорговыйАгент,Категория, Контрагент", "КвоКонтрагентов");
ТЗ.Свернуть("ТорговыйАгент,Категория","КвоКонтрагентов");
Flexy, а я уже подумала, что Вы меня флудером засчитали. )
про поэтапное сворачивание верно заметили. да. есть такое.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua