Имя: Пароль:
1C
1C 7.7
v7: Функция КонОст(...) КОГДА(......); Что за "когда"?
0 live in sky dreams
 
01.09.17
08:21
В некоторых вопросах разработчиков встречается это самое "КОГДА" используемое в функциях.. Мне подумалось, что функция срабатывает, если выполняется условие после "КОГДА". Проверил на сборе остатков из регистра.

...
...
Количество = Регистр.ОстаткиТМЦ.Количество;
Склад      = Регистр.ОстаткиТМЦ.Склад;
...
...
Функция Остаток1 = КонОст(Количество) КОГДА (Склад В СписокСкладов1);
Функция Остаток2 = КонОст(Количество) КОГДА (Склад В СписокСкладов2);

...
Группировка Номенклатура;


Он мне просто вываливает остаток по всем имеющимся складам и в "Остаток1" и в "Остаток2". Я же думал, что остаток по складам из "списка1" будет в Остаток1 а остаток по складам из "списка2" будет в "Остаток2". Ну логично было так предположить..


В СП по функции молчок.
Перерыл интернету - там про "Когда" мало кто пишет, а если пишет - то просто в части вопроса этого самого "когда" не касающегося.
Что это за звэр? Как его готовить? Где можно почитать?
1 mishaPH
 
модератор
01.09.17
08:25
(0) а что не так? КОгда используется в запросе, когда надо получить цифру с условием котороне нельзя применять к другим переменным или функциям.

например в одном запросе надо получить цифры по разным складам тогда Условие() применяется ко всем.

Функция Остаток1 = КонОст(Количество) КОГДА (Склад В СписокСкладов1);
Функция Остаток2 = КонОст(Количество) КОГДА (Склад В СписокСкладов2);

1 запрос но данные по суммам из разных условий. чтобы не городить разные запросы или склады выводитьв группировки а потом отсеивать не нужное
2 aka AMIGO
 
01.09.17
08:28
"Когда" - увидишь, когда запустишь конструктор запроса, на вкладке "Функция"

У меня есть только одно применение
|Функция КолвоМонт = Расход(Колво) когда(((ТекДок.ПоСчету.Вид()=""Счет"") ИЛИ (ТекДок.ПоСчету.Вид()=""КомерческоеПредолжение"")) И (ТекДок.ПоСчету.Монт=1));
3 aka AMIGO
 
01.09.17
08:32
+2 функция КолвоМонт отбирает из документов по условию значения реквизита Монт=1
Всё остальное она не затрагивает, это-не-условие
4 Злопчинский
 
01.09.17
08:37
Или я туплю
Или в ответах нет по существу вопроса ТС
5 aka AMIGO
 
01.09.17
08:37
Копипаст из СП:
Функция <?> = ();
Function <?> = ();
Синтаксис:
Функция <ИмяФункции> = <ТипФункции>(<Параметр>|<УточненныйПараметр>) [Когда(<Условие>)];
Англоязычный синоним:
Function <ИмяФункции> = <ТипФункции>(<Параметр>|<УточненныйПараметр>) [When(<Условие>)];
Назначение:
Вычислить функцию и включить ее результат в запрос.
Параметры:
<ИмяФункции> - имя, присваиваемое функции;
<ТипФункции> - ключевое слово одной из встроенных функций языка;
<Параметр> - имя внутренней переменной, параметр вызова функции;
<УточненныйПараметр> - конкретизация внутренней переменной, параметр вызова функции.
<Условие> - условие вычисления функции (необязательно).
6 aka AMIGO
 
01.09.17
08:38
(4) ты не тупишь. Ответа нет
7 aka AMIGO
 
01.09.17
08:41
кстати, в ЖКК стр 812 про функцию и "когда" кой-что есть, но составители, видимо, не посчитали важным это слово, только и написали несколько строк
8 live in sky dreams
 
01.09.17
08:49
(1) Спасибо за ответ, но из него я не понял механику.. :(
(2) Построитель запроса в клюшках сути КОГДА не раскрывает, более того, считаю, что построитель больше с толку сбивает, чем помогает.
(5) Читал СП, знаю, что функция "документированная" и не тайная.. Но не понял как пользоваться.

В контексте моего вопроса как использовать КОГДА правильно?
Есть 2 списка значений с разными наборами складов в них.

Как мне получить остатки по ГруппаСкладов1 и ГруппаСкладов2 используя КОГДА? Вообще это реально или в обходе группировок основного запроса уже отдельными "запросиками" собирать остатки просаживая "FPS"?
9 aka AMIGO
 
01.09.17
08:49
Если лень лезть в ЖКК, или под рукой его нет:
https://i.paste.pics/d9e7778d29f0b88112050b2f2492d8aa.png
10 aka AMIGO
 
01.09.17
08:52
Как мне получить остатки по ГруппаСкладов1 и ГруппаСкладов2 используя КОГДА?
:(
увы, не знаю..
По-идее, твой код должен работать
11 live in sky dreams
 
01.09.17
08:56
(9) Я читал в электронном виде и оттуда был уверен что мой код должен работать, но увы, в 2 колонках показатели остатков идентичный, хотя склады в списках значений разные
12 пипец
 
01.09.17
08:59
(11) и чо ? ты весь запрос покажи и проверь универсальным отчетом по регистру - ты уверен что они у тебя разные ?
13 пипец
 
01.09.17
09:00
навеяло
- доктор я весь больной, ткну пальцем в ногу больно, ткну в голову, больно ...
14 Ёпрст
 
01.09.17
09:01
И ниже, видать еще в коде
Условие(Склад в Выбсклад);
:)))))))))))))))))))))))))))))
15 live in sky dreams
 
01.09.17
09:13
(12) кто разные? Остатки по складам? Конечно уверен.
(13) странный ты ))

(14) Угу, естественно, а еще ниже ТекстЗапроса = ""; А еще ниже: //Я вас любил. Любовь, еще, быть может..
))))))))
16 Масянька
 
01.09.17
09:16
(15) Совсем внизу напиши:
Но пусть она Вас больше не тревожит.
И отпустит.
17 live in sky dreams
 
01.09.17
09:17
(16)Не.. Нет объявлено таких переменных ))
18 linoblack
 
01.09.17
09:17
имхо, когда относится только к переменной в функции, т.е.

Функция Остаток1 = КонОст(Количество) КОГДА (Количество что то там);
19 live in sky dreams
 
01.09.17
09:19
(18) Это противоречит выражению в (2), которое автор, по всей видимости, использует в продакшне и оно работает. Ну мне так показалось..
20 Масянька
 
01.09.17
09:23
(19) Из типовой:
|Функция АвансУсловный=         Приход(ПокупателиСуммаРуб)  Когда ((ВидДолга = Перечисление.ВидыДолга.Аванс) ИЛИ (ВидДолга = Перечисление.ВидыДолга.АвансВал));
|Функция ОстатокЗаказаПок   = КонОст(КолЗаказаПок);
|Функция ПолученоПок        = Расход(КолЗаказаПок) Когда ((ТекДок.Вид() <> ""ЗаказПоставщику"")
21 linoblack
 
01.09.17
09:23
(19) оно не работает скорее всего. а так, как я написал - работает 100%

я так обороты разделяю двумя функциями на, например, продажи и возвраты. без "когда" будет общее количество, т.к. возврат это   тоже как бы продажа но с отрицательным количеством.
22 linoblack
 
01.09.17
09:25
|Функция РасходКвоСумма = Сумма(РасходКво) когда(РасходКво>0);
    |Функция РасходКвоСуммаВозврат = Сумма(РасходКво) когда(РасходКво<0);
23 live in sky dreams
 
01.09.17
09:27
Формирование текста запроса:


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

"ГруппыСкладов" - список значений, тип значения: текст. Содержит список наименований групп складов. Так же используется как условие отбора из таблицы значений ("ГрцппаСклада", "Склад").
Каждой группе соответствует 1 или более складов.
функция ВернутьСписокСкладовГруппы(ИмяГруппыСклада) как раз и возвращает список значений со складами, соответствующими указанной группе. Отладчиком проверял - да, возвращает верно, в зависимости от указанной группы.

Должно же С#КА работать!!!! :(
24 live in sky dreams
 
01.09.17
09:28
("ГрцппаСклада", "Склад") = ("ГруппаСклада", "Склад")
В коде нет этой ошибки, просто сюда руками писал
25 Масянька
 
01.09.17
09:39
(23) ВернутьСписокСкладовГруппы - что возвращает: строку или ссылку?
26 aka AMIGO
 
01.09.17
09:44
(20) Отличие есть у типовой и у ТС, такое:
в типовой функции подсчитывают 3 разные суммы: расход, приход, КонОст
в коде тс - дважды: КонОст
ИМХО - видимо, в этом засада..
27 live in sky dreams
 
01.09.17
09:50
(25) СписокЗначений();
(26) хм... попробую убрать расчет резерва, посмотрим
28 aka AMIGO
 
01.09.17
09:52
Внешняя функция для подсчета остатков по двум группам складов, вставленная в Запрос - может решить задачу.
Запрос тупо подсчитывает конОст общий..
29 FIXXXL
 
01.09.17
09:54
семерошный язык запросов писал видимо чувак, который или не слышал про скуль или скуль ему чем-то насолил
надо же такую хрень навертеть...
30 aka AMIGO
 
01.09.17
09:55
Ну, что делать.. приходится пользоваться тем, что есть, раз больше 7-ка не поддерживается
31 aka AMIGO
 
01.09.17
10:02
(0) посмотри тут пример применения внешней функции, её имя - ВернутьСумму(...)
v7: Проблемы с "внешней" функцией в запросе
32 aka AMIGO
 
01.09.17
10:04
+31 а здесь вообще круть неимоверная:
запрос, условие, функция в фукнции 1с 7.7
33 Ёпрст
 
01.09.17
10:06
(27) Не надо ничего убирать.

Выведи сюда ТекстЗапроса.
34 Ёпрст
 
01.09.17
10:19
Хотя не надо. У тя вся проблема в функции ВернутьСписокСкладовГруппы. в Тексте запроса всегда один и тот же список значений будет.
35 Ёпрст
 
01.09.17
10:20
отсюда, результат запроса для этих функций - одинаковый.
36 Ёпрст
 
01.09.17
10:22
>>>Содержит список наименований групп складов.
Это тоже пять!
Список должен, как минимум, содержать список Элементов справочника, а не наименований.
37 Ёпрст
 
01.09.17
10:23
ну и сз должны быть видимы извне, т.е явно объявлены , как внешние переменные модуля.
38 Масянька
 
01.09.17
10:37
(36) Я бы сказала, что это пять с плюсом :)
(23) С#КА - это про тебя запрос думает :)
39 aka AMIGO
 
01.09.17
10:39
(36) (38) Может-же человек оговориться?
ЗЫ. два с минусом! Вот! :)
40 Масянька
 
01.09.17
10:40
(39) Не мелочись - кол :)
41 aka AMIGO
 
01.09.17
10:40
+39 но не проверить СЗ при первом запуске - это промах..
42 Злопчинский
 
01.09.17
10:52
Нет - я не плачу!
И - не рыдаю!
Я всем доступно объясняю...
43 Масянька
 
01.09.17
11:04
(42) Поэт в России больше, чем поэт (С)
Поэт в России - одинэсник :))))
44 Builder
 
01.09.17
11:30
Не поленился, накидал запрос.
    "//{{ЗАПРОС(Сформировать)
    |Склад = Регистр.ОстаткиТоваров.Склад;
    |Товар = Регистр.ОстаткиТоваров.Товар;
    |Количество = Регистр.ОстаткиТоваров.Количество;
    |Функция КоличествоКонОст = КонОст(Количество) когда(Склад в ВыбСклад1);
    |Функция КоличествоКонОст1 = КонОст(Количество) когда(Склад в ВыбСклад2);
    |Группировка Товар без групп;
    |Условие(Товар В ВыбТовар);
    |"//}}ЗАПРОС

Все работает, выдает разные остатки.
Так что у ТС явно что то не то с запросом и с логикой построения групп складов.
45 Злопчинский
 
01.09.17
12:08
46 Builder
 
01.09.17
12:09
(45) У ТС?
47 Злопчинский
 
01.09.17
12:16
(46) не факт. иногда ткань пространства-времени переклинивает и любого может выбросить в параллельную реальность с немного другими законами.. а у себя, здесь, мы отражаемся именно в таком качестве... ;-)
48 Builder
 
01.09.17
12:20
(47) Заметно....
49 Масянька
 
01.09.17
12:20
(47) Бегемотик! Миленький! Выдыхай! (С)
50 Злопчинский
 
01.09.17
12:48
(48) Первый признак сумашсетвия - что сумашедший не видит своего сумашествия... так что ты это.. внимательнее ... к себе.. ;-)
51 Масянька
 
01.09.17
12:50
(50) Это - если смотреть с одной стороны.
А если смотреть в параллельной реальности - кто из вас псих? А вполне вероятно, что и оба нормальны. Просто параллельные реальности не пересекаются.
52 toypaul
 
гуру
01.09.17
13:34
"ГруппыСкладов" - список значений, тип значения: текст. Содержит список наименований групп складов.

схрена ли тогда Склад, который элемент справочника должен быть в списке строк?

это вопрос раз

и два - коли такой охренительный запрос на 7ке пишешь - не удивляйся если что-то работать не будет.
53 live in sky dreams
 
01.09.17
15:37
Спасибо всем :)
И тем, кто реально старался помочь и вангам :)

Особенно улыбнули вангования про строки вместо элементов, хотя вроде текст запроса и логику работы функций расписал, хотя, это ж читать нужно..... Пятница, да ну нах еще читать что-то )))

А кроме шуток - админ по надобности ребутнул серв и циферки заиграли достоверностью. В запросе ошибок не было(кто не увидел в (23) был текст запроса с описанием что там откуда куда). Вот я и думаю, а могли быть глюки из-за утечки памяти или чего-то в этом роде?
P.S.: Аптайм серва виндового (терминал, базы локально файловые) 16 дней.
54 Злопчинский
 
01.09.17
15:47
(53) хм.. на файловых с таким вроде не сталкивался
55 Ёпрст
 
01.09.17
15:48
(53) брехня
56 Ёпрст
 
01.09.17
15:49
сервант тут не причем, максимум, нужно было жуколов закрыть к едрени фени и табло в нём
57 live in sky dreams
 
01.09.17
17:17
(56) а жуколов то каким боком?
58 пипец
 
01.09.17
17:38
+ ну как вариант запускался не тот отчет, который правился в конфигураторе , то есть его более ранняя версия, чудес не бывает (с)
ЗЫ а то в продолжение темы анекдотов про выбор жены )))
- сколько дважды два ?
* а сколько нужно (с)
59 Злопчинский
 
01.09.17
18:13
(57) жуколов через вычисленяи в табло может поменять ...