Имя: Пароль:
1C
1C 7.7
v7: Отобрать товары, которых было продано =10 шт за месяц
0 Umka2008
 
23.12.17
21:39
Коллеги, прошу не пинать - затупил под вечер ))
Есть простой запрос - по регистру ОстаткиТМЦ. В последней строчке его условие

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

Ставлю условие в последнюю строку - ругается на КоличествоРасход
типа нет такой переменной!
А как можно иначе сделать? Чтобы в отборе было всегда 10 шт
3 Бертыш
 
23.12.17
22:44
Где группировка по документу стесняюсь спросить
4 Umka2008
 
24.12.17
13:52
(3) зачем по документу? Нужно отобрать номенклатуру, которой за месяц было продано (не перемещено) ровно 10 шт. Документов продаж  при этом может быть сколько угодно, главное суммарно должно быть 10
5 Vladal
 
24.12.17
15:04
6 opus70
 
24.12.17
15:30
у 7.7 нет heving можно эмулировать функцией вызываемой из запроса тогда дикие тормаза будут
поэтому проще запросить все продажи из Регистра.Продажи(оборотный регистр в ТИС) и потом уже в цикле выбрать что тебе нужно
7 Umka2008
 
24.12.17
15:46
(5) - мне по виду документа отбирать не надо, ссылка не помогла
(6) - циклом конечно некошерно, так как итоги по группам будут неверные
8 opus70
 
24.12.17
16:25
Функция ААА(Кол)
    если Кол<10 тогда
        возврат Кол
иначе
Возврат 0
Конецесли;
КонецФункции


    |с НачДата по КонДата1;
    |Док = Регистр.ОстаткиТМЦ.ТекущийДокумент;    
    |Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура;
    |Количество = Регистр.ОстаткиТМЦ.Количество;
    |Функция КоличествоРасход = сумма(ААА(Количество)) когда ((Док.Вид() = ""Реализация"") "+Условие+ ");
    |Группировка Номенклатура;
    |Условие(Номенклатура в СН);

точно не помню лень искать но примерно вот в такой парадигме
9 opus70
 
24.12.17
16:26
но быстрей будет как я писал тем более что у тебя уже есть ограничивающее условие |Условие(Номенклатура в СН);
10 opus70
 
24.12.17
16:31
Функция ААА(Кол)
    если Кол<10 тогда
        возврат 1
иначе
Возврат 0
Конецесли;
КонецФункции

    |с НачДата по КонДата1;
    |Док = Регистр.ОстаткиТМЦ.ТекущийДокумент;    
    |Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура;
    |Количество = Регистр.ОстаткиТМЦ.Количество;
    |Функция КоличествоРасход = Расход(Количество) когда ((Док.Вид() = ""Реализация"") "+Условие+ ");
    |Группировка Номенклатура;
    |Условие(Номенклатура в СН);
    |Условие(ААА(Количество)=1)


//
вот так должно быть правильно
смысл нужно в условие загнуть фукнцию которая будет проверять то что тебе нужно
11 Umka2008
 
24.12.17
16:48
(10) - как ты написал работает, но отбирает все товары, которые в документе продавались <10 штук
В итоге получается результат за месяц
Товар1 = 10
Товар2 = 30
Товар3 = 20
А надо чтобы вышли товары у которых
Товар1 = 10
Товар2 = 10
Товар3 = 10
12 Vladal
 
24.12.17
17:26
(11) Так в условии и написано "меньше 10". Поставь условие "равно 10".
13 Umka2008
 
24.12.17
17:51
(12) как раз и поставил - и выводит все товары, которых в месяц продали 10,20,100 - то есть кратно 10
14 opus70
 
24.12.17
17:54
чтоб получить правильный ответ нужно знать 70% ответа а в 30% сомневаться
вроде дал ответ согласно вопроса даже (6) пояснил что нет having в запросах 7.7 можно его с эмулировать но результат плох
я бы выбрал все что мне нужно
применил бы фильтр ккокой мне нужен
затем полученные данные загнал бы втаблицузначений
а дальше используя любимый 1c++ и класс "ТаблицаГруппировок"
получил бы свои итоги и по группам и по иерархи справочника
15 Остап Сулейманович
 
24.12.17
17:55
(13) Нифига у тебя не получится. В семерочном запросе условие можно ставить НА ЗАПИСЬ. А не на ИТОГ. Посему сначала нужно выбрать все итоги. И только потом фильтровать ту выборку, которая получилось.
16 opus70
 
24.12.17
17:59
ну или если близок к душе sql разбирайся с классом
http://www.1cpp.ru/forum/YaBB.pl?num=1273512019
17 Остап Сулейманович
 
24.12.17
18:00
+ (15) В SQL это выглядело бы примерно так :
Select * from select summ(varname) as fieldname from datasource where fieldname = 10
18 opus70
 
24.12.17
18:09
|с НачДата по КонДата1;
    |Док = Регистр.ОстаткиТМЦ.ТекущийДокумент;    
    |Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура;
    |Количество = Регистр.ОстаткиТМЦ.Количество;
    |Функция КоличествоРасход = Расход(Количество) когда ((Док.Вид() = ""Реализация"") "+Условие+ ");
    |Группировка Номенклатура;
    |Условие(Номенклатура в СН);

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

ТзнИтог = СоздатьОбъект("ТаблицаГруппировок");
        Тзн1.Выгрузить(ТЗИтог.ПолучитьБазовыйКласс());


ТзнИтог.Сгруппировать("Номенклатура","..,..");

Пока ТзнИтог.ВНачалоВыборки()
Пока ТзнИтог.Группировка(1)=1 Цикл
    .... вывод в отчет
Конеццикла;
19 Umka2008
 
24.12.17
18:37
С 1cpp нет времени разбираться )))
Ок, раз нельзя Условие на Итоги  - сделал так
1.Выбрал все продажи в разрезе
Номенклатура, КолвоМесяц
2.Отобрал в СписокЗначений все товары = 10 шт из п.1
3.Наложил фильтр на свой отчет = |Условие(Номенклатура в СписокЗначений);
В итоге получился запрос с нужной Номенклатурой и правильными итогами по иерархии