Запрос. Как получить сумму по группе справочника
Здравствуйте уважаемые знатоки!
Помогите пожалуйста с написанием запроса.
Хочу получить позиции товара из отчета ККМ, его остатки по регистру ОстаткиТМЦ,
потом получаем закупочную цену из справочника цен.
Потом рассчитываем цену (кол-во умножаем на цену), но вот как получить сумму по группе, не могу добиться. Т.е. чтобы в отчет выводилась группа и сумма.
Пните пожалуйста в нужном направлении =)
Текст запроса:
Помогите пожалуйста с написанием запроса.
Хочу получить позиции товара из отчета ККМ, его остатки по регистру ОстаткиТМЦ,
потом получаем закупочную цену из справочника цен.
Потом рассчитываем цену (кол-во умножаем на цену), но вот как получить сумму по группе, не могу добиться. Т.е. чтобы в отчет выводилась группа и сумма.
Пните пожалуйста в нужном направлении =)
Текст запроса:
Перем Запрос, ТекстЗапроса, Таб, ПечЦенаНач, ПечЦенаКон, ТовЦена;
//*******************************************
// Процедура генерации запроса Сформировать.
//
Процедура Сформировать();
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с ВыбНачПериода по ВыбКонПериода;
|Обрабатывать НеПомеченныеНаУдаление;
|Товар = Документ.ОтчетККМ.Номенклатура, Регистр.ОстаткиТМЦ.Номенклатура;
|ОстатокКол = Регистр.ОстаткиТМЦ.Количество;
|Функция КолОстатокНач = НачОст (ОстатокКол);
|Функция КолОстатокКон = КонОст (ОстатокКол);
|Группировка Товар упорядочить по Товар.Наименование;
|"//}}ЗАПРОС
;
//
Если ВыбТовар.Выбран() = 1 Тогда
//
Если ВыбТовар.ЭтоГруппа() = 1 Тогда
ТекстЗапроса = ТекстЗапроса+ "
|Условие (Товар в ВыбТовар);";
Иначе
ТекстЗапроса = ТекстЗапроса+ "
|Условие (Товар = ВыбТовар);";
КонецЕсли;
//
КонецЕсли;
//
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
//**************************************************************
// Подготовка к заполнению выходных форм данными запроса
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Сформировать");
// Заполнение полей "Заголовок"
Таб.ВывестиСекцию("Заголовок");
Состояние("Заполнение выходной таблицы...");
Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
//
Пока Запрос.Группировка("Товар") = 1 Цикл
ПечНаименование = Запрос.Товар;
ПечКолНач = Запрос.КолОстатокНач;
ПечКолКон = Запрос.КолОстатокКон;
глВернутьЦену(Запрос.Товар, Константа.ЗакупочныйТипЦен, РабочаяДата(), ТовЦена);
ПечЦенаНач = ТовЦена * ПечКолНач;
ПечЦенаКон = ТовЦена * ПечКолКон;
//
Если ПечНаименование.ЭтоГруппа() = 1 Тогда
Таб.ВывестиСекцию("Группа");
//
ИначеЕсли ТолькоГруппы = 0 Тогда
Таб.ВывестиСекцию("Номенклатура");
КонецЕсли;
//
КонецЦикла;
//
// Вывод заполненной формы
Таб.ТолькоПросмотр(1);
Таб.Показать("Сформировать", "");
КонецПроцедуры
ПоказатьПо теме из базы знаний
- Всякие полезности
- Как сделать запрос на изменение данных
- Пример переноса справочников, документов и движений через Эксель и "Конвертацию данных 2" из оптовой учетной системы 1С 7.7 Комплексной 4.2 и розничной учетной системы Рарус Торговый комплекс -> в 1С 8.3 ЕРП 2.4 (расширение и дополнительные реквизиты)
- Обзор полезных методов БСП 3.1.4
- Бренд-менеджер - как много в этом звуке на складе нашем завелось. Простой контроль денег
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Я вот пробую:
Регистр ОстаткиТоваров: измерения(Фирма, Товар, Склад), ресурсы(ОстатокТовара).
Вот пишу:
//*******************************************
Процедура Сформировать()
Перем Запрос, ТекстЗапроса, Таб;
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"
|Период с ВыбНачПериода по ВыбКонПериода;
|Фирма = Регистр.ОстаткиТоваров.Фирма;
|Товар = Регистр.ОстаткиТоваров.Товар;
|ОстатокТовара = Регистр.ОстаткиТоваров.ОстатокТовара;
|Функция КолОстатокНач = НачОст(ОстатокТовара);
|Функция КолОстатокКон = КонОст(ОстатокТовара);
|Функция СуммаКолОстатокНач = Сумма(Запрос.НачОст*глВернутьЦену(Товар,Константа.РозничнаяКатегорияЦен));
|Функция СуммаКолОстатокКон = Сумма(Запрос.КонОст*глВернутьЦену(Товар,Константа.РозничнаяКатегорияЦен));
|Группировка Товар;
|Условие (Товар в ВыбТовар);
|"
;
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Сообщить("Не выполнен запрос.","!");
Возврат;
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Сформировать");
Таб.ВывестиСекцию("Заголовок");
Состояние("Заполнение выходной таблицы...");
Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
Пока Запрос.Группировка(1) = 1 Цикл
Таб.ВывестиСекцию("Товар");
КонецЦикла;
Таб.ВывестиСекцию("Итого");
Таб.ТолькоПросмотр(1);
Таб.Показать("Остатки", "");
КонецПроцедуры
//*******************************************
Результат:
Куча подобных окошок во время выполнения запроса:
Ну и сумму не считает.
Регистр ОстаткиТоваров: измерения(Фирма, Товар, Склад), ресурсы(ОстатокТовара).
Вот пишу:
//*******************************************
Процедура Сформировать()
Перем Запрос, ТекстЗапроса, Таб;
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"
|Период с ВыбНачПериода по ВыбКонПериода;
|Фирма = Регистр.ОстаткиТоваров.Фирма;
|Товар = Регистр.ОстаткиТоваров.Товар;
|ОстатокТовара = Регистр.ОстаткиТоваров.ОстатокТовара;
|Функция КолОстатокНач = НачОст(ОстатокТовара);
|Функция КолОстатокКон = КонОст(ОстатокТовара);
|Функция СуммаКолОстатокНач = Сумма(Запрос.НачОст*глВернутьЦену(Товар,Константа.РозничнаяКатегорияЦен));
|Функция СуммаКолОстатокКон = Сумма(Запрос.КонОст*глВернутьЦену(Товар,Константа.РозничнаяКатегорияЦен));
|Группировка Товар;
|Условие (Товар в ВыбТовар);
|"
;
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Сообщить("Не выполнен запрос.","!");
Возврат;
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Сформировать");
Таб.ВывестиСекцию("Заголовок");
Состояние("Заполнение выходной таблицы...");
Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
Пока Запрос.Группировка(1) = 1 Цикл
Таб.ВывестиСекцию("Товар");
КонецЦикла;
Таб.ВывестиСекцию("Итого");
Таб.ТолькоПросмотр(1);
Таб.Показать("Остатки", "");
КонецПроцедуры
//*******************************************
Результат:
Куча подобных окошок во время выполнения запроса:
Ну и сумму не считает.
По порядочку... :-)
Это лишнее
оставь только и то, прямо в тексте запроса
Это лишнее
Если ВыбТовар.Выбран() = 1 Тогда
//
Если ВыбТовар.ЭтоГруппа() = 1 Тогда
ТекстЗапроса = ТекстЗапроса+ "
|Условие (Товар в ВыбТовар);";
Иначе
ТекстЗапроса = ТекстЗапроса+ "
|Условие (Товар = ВыбТовар);";
КонецЕсли;
//
КонецЕсли;
Показатьоставь только
|Условие (Товар в ВыбТовар);
Цикл замени на
Примерно так, свои детали сам вставь. И совет: не давай переменным дурацкие имена :-)
ФлагНачало=1;
Пока Запрос.Группировка("Товар") = 1 Цикл
Если Запрос.Товар.ЭтоГруппа()=1 Тогда
Если ФлагНачало=1 Тогда
Таб.ВывестиСекцию("Группа");
ФлагНачало=0;
Иначе
Таб.ВывестиСекцию("ГруппаИтог");
Таб.ВывестиСекцию("Группа");
СуммаНач = 0;
СуммаКон = 0;
КонецЕсли;
Иначе
глВернутьЦену(Запрос.Товар, Константа.ЗакупочныйТипЦен, РабочаяДата(), ТовЦена);
Таб.ВывестиСекцию("Номенклатура");
СуммаНач = СуммаНач + ТовЦена*Запрос.КолОстатокНач;
СуммаКон = СуммаКон + ТовЦена*Запрос.КолОстатокКон;
КонецЕсли;
КонецЦикла;
Таб.ВывестиСекцию("ГруппаИтог");
ПоказатьПримерно так, свои детали сам вставь. И совет: не давай переменным дурацкие имена :-)
(4)
Можешь про ФлагНачало поподробней? Если можно на пальцах... =)
Мы ему до выборки присваиваем 1, потом в цикле присваиваем 0, мы же потом в рамках этой выборки и работаем, т.е. первый раз присвоив ФлагНачала = 0, он в течении всей выборки запроса и останется равным 0.
Пожалуйста, помогите...
Что интересно когда удаляешь все эти расчеты сумм, все отлично работает, т.е. показывает количество по позициям, и общее кол-во по группе.
Альтаир пишет:
ФлагНачало=1;
Пока Запрос.Группировка("Товар") = 1 Цикл
Если Запрос.Товар.ЭтоГруппа()=1 Тогда
Если ФлагНачало=1 Тогда
Таб.ВывестиСекцию("Группа");
ФлагНачало=0;
Иначе ....
ПоказатьФлагНачало=1;
Пока Запрос.Группировка("Товар") = 1 Цикл
Если Запрос.Товар.ЭтоГруппа()=1 Тогда
Если ФлагНачало=1 Тогда
Таб.ВывестиСекцию("Группа");
ФлагНачало=0;
Иначе ....
Можешь про ФлагНачало поподробней? Если можно на пальцах... =)
Мы ему до выборки присваиваем 1, потом в цикле присваиваем 0, мы же потом в рамках этой выборки и работаем, т.е. первый раз присвоив ФлагНачала = 0, он в течении всей выборки запроса и останется равным 0.
Пожалуйста, помогите...
Что интересно когда удаляешь все эти расчеты сумм, все отлично работает, т.е. показывает количество по позициям, и общее кол-во по группе.
ПечЦенаНач = ТовЦена * ПечКолНач;
ПечЦенаКон = ТовЦена * ПечКолКон;
мы же из регистра получаем количество, а потом из справочника закупочную цену,
а таким образом расчитываем сумму =)
=) разводите нибось на соц опрос? =)))
Просто как то зашёл 2,5 года назад, скачал пару обработок, так и остался.
Я понимаю, что за 2,5 года можно эгегей сколько научиться, но вот не складывалось =(
до сих пор бывает, что упрешься и всё, вот тока на форуме и могу спросить, так что прошу не пинайте ;)
И совсем не дурацкие у меня имена переменных!
вот интересно, а код в тегах code теперь не подсвечивается? Жаль, мелочь, а приятно.
Что то не выходит каменный цветок =(
В секции Группа показывает какие то не понятный цифры, которы не сходятся с реальными,
а секция ГруппаИтог равна секции Группа.
Переписал Цикл:
По позициям ТМЦ показывает правильно остатки и сумму в закупочных ценах, а вот по группам ... =(
Объясните пожалуйста, вот запрос выбрал нам ТМЦ, начинаем перебирать их в цикле, цикл их перебирает по группам??? Т.е. встречает первую группу, входит в неё и перебирает все товары принадлежащие только данной группе? А потом собирает итог по данной группе. Я правильно понимаю?
В секции Группа показывает какие то не понятный цифры, которы не сходятся с реальными,
а секция ГруппаИтог равна секции Группа.
Переписал Цикл:
ФлагНачало = 1;
//
Пока Запрос.Группировка("Товар") = 1 Цикл
ПечНаименование = Запрос.Товар;
ПечКолНач = Запрос.КолОстатокНач;
ПечКолКон = Запрос.КолОстатокКон;
//
Если Запрос.Товар.ЭтоГруппа() = 1 Тогда
//
Если ФлагНачало = 1 Тогда
Таб.ВывестиСекцию("Группа");
ФлагНачало=0;
Иначе
Таб.ВывестиСекцию("ГруппаИтог");
Таб.ВывестиСекцию("Группа");
СуммаНач = 0;
СуммаКон = 0;
КонецЕсли;
//
Иначе
глВернутьЦену(Запрос.Товар, Константа.ЗакупочныйТипЦен, РабочаяДата(), ТовЦена);
ПечСумТМЦНач = ТовЦена * Запрос.КолОстатокНач;
ПечСумТМЦКон = ТовЦена * Запрос.КолОстатокКон;
Таб.ВывестиСекцию("Номенклатура");
СуммаНач = СуммаНач + ПечСумТМЦНач;
СуммаКон = СуммаКон + ПечСумТМЦКон;
КонецЕсли;
//
КонецЦикла;
//
Таб.ВывестиСекцию("ГруппаИтог");
ПоказатьПо позициям ТМЦ показывает правильно остатки и сумму в закупочных ценах, а вот по группам ... =(
Объясните пожалуйста, вот запрос выбрал нам ТМЦ, начинаем перебирать их в цикле, цикл их перебирает по группам??? Т.е. встречает первую группу, входит в неё и перебирает все товары принадлежащие только данной группе? А потом собирает итог по данной группе. Я правильно понимаю?
Встречает первую группу, выводит секцию "Группа", в которой только Название потом идет перебор элементов с накоплением Сумм.
Когда натыкаемся на следующую группу, выводим итог по предыдушей и название текущей.
И после цикла итог по последней группе. Я так вижу :-)
Когда натыкаемся на следующую группу, выводим итог по предыдушей и название текущей.
И после цикла итог по последней группе. Я так вижу :-)
вот хотелось бы сделать:
Группа А сумма по А и Б
Группа Б сумма
Группа Б сумма
Как такое реализовать?
Ну по идее закупочные цены ведь не меняются
Группа А сумма по А и Б
Группа Б сумма
Группа Б сумма
Как такое реализовать?
Альтаир пишет:
и вообще логично и цены расчитывать для остатков не на РабочуюДату(), а на начало и конец запроса :-)
и вообще логично и цены расчитывать для остатков не на РабочуюДату(), а на начало и конец запроса :-)
Ну по идее закупочные цены ведь не меняются
|Период с ВыбНачПериода по ВыбКонПериода;
|Обрабатывать НеПомеченныеНаУдаление;
|Товар = Регистр.ОстаткиТМЦ.Номенклатура;
|ОстатокКол = Регистр.ОстаткиТМЦ.Количество;
|Функция КолОстатокНач = НачОст (ОстатокКол);
|Функция КолОстатокКон = КонОст (ОстатокКол);
|Функция СуммаНач = Сумма(Запрос.НачОст*глПолучитьЦену(Товар,Константа.ЗакупочныйТипЦен,ВыбКонПериода));
//аналогично еще сумма для КонОст
|Группировка Товар ;
|"//}}ЗАПРОС
Показать
Блин, работает!!!!! =)))))
Поменять на
Так же сделать и остатками на конец
СПАСИБО!!!!! Ёпрст!!! =))))
И всем принимающим участие, я ваш должник....
|Функция СуммаНач = Сумма(Запрос.НачОст*глПолучитьЦену(Товар,Константа.ЗакупочныйТипЦен,ВыбКонПериода));
Поменять на
|Функция СуммаНач = Сумма(Запрос.КолОстатокНач *глВернутьЦену(Товар,Константа.РозничнаяКатегорияЦен));
Так же сделать и остатками на конец
СПАСИБО!!!!! Ёпрст!!! =))))
И всем принимающим участие, я ваш должник....
Не пойму почему округляет
К примеру из отчета получаем
остаток 0,56кг.
цена 84.00р.
а вот эта Функция показывает сумму 47.00р., вместо положенных 47,04р.
Округляет копейки!
Если убрать явное преобразование в число ... = Сумма (Число (....
То вообще получаем сумму 84,00р.,при остатке 0,56, цене 84,00р.
А вот такая конструкция вываливается с ошибкой
... = Сумма (Число (Формат (Запрос.....), "Ч5.2")));
|Функция СуммаНач = Сумма (Число(Запрос.КолОстатокНач * глПолучитьЦену (Запрос. Товар, Константа.ЗакупочныйТипЦен, ВыбНачПериода)));
К примеру из отчета получаем
остаток 0,56кг.
цена 84.00р.
а вот эта Функция показывает сумму 47.00р., вместо положенных 47,04р.
Округляет копейки!
Если убрать явное преобразование в число ... = Сумма (Число (....
То вообще получаем сумму 84,00р.,при остатке 0,56, цене 84,00р.
А вот такая конструкция вываливается с ошибкой
... = Сумма (Число (Формат (Запрос.....), "Ч5.2")));
(46) Это очевидно...
Функция Сумма берет точность из переменной запроса.. в данном случае, переменной нет, ибо используется арифм. выражение... Следовательно запрос не знает, какая точность должна быть, вот 0 и
лепит.
Решение проблемы - в Запросе умножать на 1000, в обработке итогов - делить на 1000...
Ну или на бооольшее/меньшее число, смотря какая точность нужна.
Функция Сумма берет точность из переменной запроса.. в данном случае, переменной нет, ибо используется арифм. выражение... Следовательно запрос не знает, какая точность должна быть, вот 0 и
лепит.
Решение проблемы - в Запросе умножать на 1000, в обработке итогов - делить на 1000...
Ну или на бооольшее/меньшее число, смотря какая точность нужна.
А вот такая конструкция вываливается с ошибкой
... = Сумма (Число (Формат (Запрос.....), "Ч5.2")));
Еще бы ! Ты предлагаешь запросу СТРОКИ суммировать!
Естесственно , что он посылает тебя в пешее путешествие с эротическим уклоном.
:)
... = Сумма (Число (Формат (Запрос.....), "Ч5.2")));
Еще бы ! Ты предлагаешь запросу СТРОКИ суммировать!
Естесственно , что он посылает тебя в пешее путешествие с эротическим уклоном.
:)
т.е. примерно так:
т.е. если нам достаточно точность 0,00, то умножаем/делим на 100?
Ну да =)
|Функция СуммаНач = Сумма (Запрос.КолОстатокНач * глПолучитьЦену (Запрос. Товар, Константа.ЗакупочныйТипЦен, ВыбНачПериода)*100);
...
ПечСумНач = Запрос.СуммаНач/100;
т.е. если нам достаточно точность 0,00, то умножаем/делим на 100?
Альтаир пишет:
похоже, 0,56 округляется до 1
похоже, 0,56 округляется до 1
Ну да =)
О! Вот это работает, не перестаю благодарить, спасибо! =)
|Функция СуммаНач = Сумма (Число((Запрос.КолОстатокНач*100) * (глПолучитьЦену (Запрос.Товар,Константа.ЗакупочныйТипЦен,ВыбНачПериода)*100)));
...
ПечСумНач = Запрос.СуммаНач/10000;
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот