Имя: Пароль:
1C
1C 7.7
v7: 1С 7.7 запрос "выбор когда..."
, ,
0 Mary01
 
25.08.15
08:40
Добрый день!
Подскажите, есть ли в запросах 7.7 аналог функции Выбор..когда?
У контрагента есть реквизит "ЮрФизЛицо", тип "справочник", в этом реквизите выбирается либо юр.лицо, либо физ. лицо, либо сотрудник (все это отдельные справочники).
Мне в отчет нужно вывести запросом группировку: "юр.лица" или "физ. лица"  в зависимости о вида контрагента, и в "физ. лица" должны попасть физлица и сотрудники.
Нужно сделать в запросе что-то вроде
ВидКонтрагента =
Выбор Когда Контрагент.ЮрФизЛицо.Вид() = "Физлица" Или Контрагент.ЮрФизЛицо.Вид() = "Сотрудники" тогда ""Физ. лица""
Иначе "Юр. лица";
Конец;

А потом еще сделать группировку по ВидКонтрагента.
1 JeyRico
 
25.08.15
08:47
Наверно только прямые запросы спасут.
2 Джинн
 
25.08.15
08:49
Есть Когда в функциях.
3 Остап Сулейманович
 
25.08.15
08:51
(2) Ей в группировках нужно.
4 Остап Сулейманович
 
25.08.15
08:55
+ (3) В запрос нужно выбрать признак ЮрФизЛицо и потом уже по нему группировать Контрагентов.
5 bigdenis22
 
25.08.15
08:58
запрос по докам или по регитстру ?
в принципе в обоих случаях
переменная
ВидКонтрагента = Контрагент.ЮрФизЛицо;
группировка ВидКонтрагента;
6 bigdenis22
 
25.08.15
09:00
или ещё нужны отборы по конкретным значениям или спискам значений этого ВидКонтрагента ?
7 Mary01
 
25.08.15
09:01
(2) пробую Функция ВидКонтрагента = ""Физ. лица"" Когда ((Контрагент.ЮрФизЛицо.Вид() = "Физлица") Или (Контрагент.ЮрФизЛицо.Вид() = "Сотрудники"))  

но на этом выдается ошибка:
Ожидается имя переменной или ее составляющая перед '"Физ. лица"'
8 Mary01
 
25.08.15
09:02
(5) по регистру
9 bigdenis22
 
25.08.15
09:03
(5) сори, разумеется в переменной док или регистр надо указать
ВидКонтрагента = (объект).Контрагент.ЮрФизЛицо;
10 Mary01
 
25.08.15
09:03
(5) да, но среди видов контрагентов есть не только физ и юр лица, но ещеи  сотрудники, а по сотрудникам мне отдельную группировку не надо, их надо включать в физлица
11 Mary01
 
25.08.15
09:03
(5) да, но среди видов контрагентов есть не только физ и юр лица, но еще и  сотрудники, а по сотрудникам мне отдельную группировку не надо, их надо включать в физлица
12 bigdenis22
 
25.08.15
09:04
задачу конкретизировать можно?
и параметры имеющегося регистра
13 bigdenis22
 
25.08.15
09:05
физлица и сотрудники - это ОДИН справочник?
14 Mary01
 
25.08.15
09:16
(13) нет
15 DCKiller
 
25.08.15
09:26
Попробуй так

В запросе добавь функции

"...
Функция СчФизЛицо = Счётчик() когда (Контрагент.ЮрФизЛицо.Вид() = "Физлица") Или (Контрагент.ЮрФизЛицо.Вид() = "Сотрудники");
Функция СчЮрЛицо = Счётчик() когда Контрагент.ЮрФизЛицо.Вид() = "Юрлица";
Группировка Контрагент;
<другие группировки>
";

Запрос.Выполнить(ТекстЗапроса);
//выгружаем результат запроса в ТЗ
Запрос.Выгрузить(ТЗ, , 0);
ТЗ.Свернуть("Контрагент", "СчФизЛицо, СчЮрЛицо");
ТЗ.Сортировать("СчФизЛицо-, Контрагент+");
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
// выводим физ. и юр. лица
Запрос.Получить(ТЗ.Контрагент);
Пока Запрос.Группировка(2) = 1 Цикл
// выводим другие группировки запроса
КонецЦикла;
КонецЦикла;

Как-то так, короче...
16 bigdenis22
 
25.08.15
09:39
итоги по юрам и по физам нужны?
если нет - то:
Контр = (объект).Контрагент;
ВидКонтр = (объект).Контрагент.ЮрФизЛицо.Вид();
Сумма = (объект).БазоваяСумма;
Функция Долг = КонОст(Сумма);
Группировка Контр;

Запрос.Выполнить.(ТекЗап);

Запрос.Выгрузить(ТЗ);
ТЗ.Сортировать("ВидКонтр");
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
  Если ТЗ.ВидКоннтр="ЮрЛица" Тогда
        Таб.ВывестиСекцию("строкаЗеленая");
  Иначе
        Таб.ВывестиСекцию("строкаСиняя");
  КонецЕсли;
КонецЦикла;
17 Mary01
 
25.08.15
11:45
а еще когда пишу в запросе:
|ВидКонтрагента = Регистр.Продажи.Покупатель.ЮрфизЛицо.Вид();
то такая ошибка возникает:
Неверно заданный путь 'Вид'
почему так?
18 aka AMIGO
 
25.08.15
11:52
(17) иногда бывает проблема: "много точек"
у тебя их 4 штуки
19 ДенисЧ
 
25.08.15
11:57
(17) "Регистр.Продажи.Покупатель.ЮрфизЛицо.Вид(); "
Это кто тебе такое в запросе в клюшках разрешил писать?
20 Mary01
 
25.08.15
12:02
(19) вначале написала так
|Контрагент = Регистр.Продажи.Покупатель;
|ВидКонтрагента = Контрагент.ЮрфизЛицо.Вид();
но не прокатило: ругалось на вторую строку, т.к. не понимает кто такой контрагент
21 Остап Сулейманович
 
25.08.15
12:04
(20) Каша.
Контрагент = Регистр.Продажи.Покупатель;
ВидКонтрагента = Регистр.Продажи.Покупатель.ЮрфизЛицо;

ЗЫ. начните запрос конструктором. Когда наступит просветление - пишите ручками.
22 aka AMIGO
 
25.08.15
12:05
В Описании языка стр 811-816 как раз про "Когда" при применении Функций в запросе.
|Функция ПрихКолТов = Приход(Количество) Когда (Док.ФлагТовара=1);
23 Масянька
 
25.08.15
12:07
(21) Поддерживаю. В конструкторе довольно просто, зато потом более понятно.
(18) А разве Вид() можно в запросе?
24 Остап Сулейманович
 
25.08.15
12:07
(22) Ей не нужен расчет в функциях. Ей нужна группировка по виду контрагента.
25 Остап Сулейманович
 
25.08.15
12:10
(23) Можно. Только сам вид нужно указывать в двойных кавычках.
Типа такого :
Функция СчФизЛицо = Счётчик() когда (Контрагент.ЮрФизЛицо.Вид() = ""Физлица"") Или (Контрагент.ЮрФизЛицо.Вид() = ""Сотрудники"");

Текст запроса - это все же строка. И правило для кавычек никто не отменял.
26 aka AMIGO
 
25.08.15
12:13
(24) - вопрос-то у неё в топике..
27 Масянька
 
25.08.15
12:13
(25) Это уже в функциях, а в выборке?
ВидКонтрагента = ...
28 palpetrovich
 
25.08.15
12:20
имхо вынести во внешнюю функцию будет попроще

Функция ПроверкаВида(Контрагент)
    Если (Контрагент.ЮрФизЛицо.Вид() = "Физлица") или (Контрагент.ЮрФизЛицо.Вид() = "Сотрудники") Тогда
        Возврат 1;
    КонецЕсли;
    Возврат 0;
КонецФункции
// в запросе
|Контрагент = Регистр.Продажи.Покупатель;
|Условие(ПроверкаВида(Контрагент)=1)
29 Масянька
 
25.08.15
12:28
А можно узнать задание (что, зачем и почему)?
30 Mary01
 
25.08.15
12:33
(23) когда я писала Вид() в условии, то работало корректно - отбиралось по нужному виду. а вот в Функции почему-то не работает.
31 Mary01
 
25.08.15
12:33
(25) в двойных кавычках тоже делала, но все равно не работает
32 aka AMIGO
 
25.08.15
12:34
(30) в (28) правильное решение
33 Mary01
 
25.08.15
12:37
(29) есть отчет по регистру, там группировки: организация, номенклатура, контрагент. В разрезе этих группировок выводятся данные регистра (кол-во, сумма). Задание - добавить еще одну группировку по виду контрагента.
То есть, должны выводиться итоги по организациям, внутри них по номенклатуре, потом по видам контрагентов, и уже потом внутри видов - по контрагентам. то есть, например, в подгруппе "физлица" - итоги по контрагентам-физлицам и по сотрудникам, и в подгруппе "юрлица" - по контрагентам-юрлицам.
34 Mary01
 
25.08.15
12:40
(28) принцип поняла, но в задаче не стоит условие отобрать по видам. нужны все виды, но в разбивке физ/юр. попробую сделать функцию, которая будет возвращать вид контрагента.
35 palpetrovich
 
25.08.15
12:41
(33) вот с этого и надо было начинать :)
36 Масянька
 
25.08.15
12:45
(35) Так, блин, спрашивать надо, а не умничать :)))))
37 Ёпрст
 
25.08.15
12:46
(33) В чорном запросе группировку не слепишь. Либо пиши прямой запрос, либо добавляй реквизит в регистр и обнови все записи в нём.
38 bigdenis22
 
25.08.15
12:58
мдя... я тоже промахнулся, вот здесь v.7.7: Как получить вид справочника в запросе? пишут, что внешнюю функцию можно вызвать только в условие запроса...
наверно, остается только один выход - крутить ТЗ...
39 Масянька
 
25.08.15
12:59
Ёще вариант - индексированная таблица.
40 Mary01
 
25.08.15
13:40
(21) В запросе нельзя сделать Вид().
А просто ЮрФизЛицо не нужно, нужен именно вид
41 Mary01
 
25.08.15
14:01
(38) то есть запрос выгразить в ТЗ, а дальше? делать отдельные ТЗ по каждой группировке что ли?
42 Mary01
 
25.08.15
14:02
(39) а есть какой-то мануал по этим таблицам? с примером?
43 DCKiller
 
25.08.15
14:03
(41) тебе же в (15) (16) все уже написали
44 Mary01
 
25.08.15
14:05
(43) мне нужны итоги по физлицам и по юр.лицам.
45 DCKiller
 
25.08.15
14:10
(44) Ну и в чем проблема? Берешь из (15) строчку, там где ТЗ.Свернуть(), и добавляешь туда во 2-й параметр свои колонки, по которым у тебя вычисляются суммы.
46 Mary01
 
25.08.15
14:12
(45) ок поняла, попробую
47 Mary01
 
25.08.15
14:19
(45) и тут же возникает вопрос ))
дело в том, что вид контрагента - это у меня не первая группировка должна быть, а вторая. Первая - это организации, потом идет номенклатура, и уже потом должны быть виды контрагентов.
48 Ёпрст
 
25.08.15
15:10
(47) Покажи текст запроса
49 Mary01
 
25.08.15
15:23
(48) пытаюсь сюда его скопировать, но какими-то кракозябрами пишет...
50 Mary01
 
26.08.15
09:46
(48) Вот он:
ТекстЗапроса = "
    |Период с НачДата По КонДата;
    |Фирма            = Регистр.Продажи.Фирма;
    |Контрагент         = Регистр.Продажи.Покупатель;
    |ВидКонтрагента         = Регистр.Продажи.Покупатель.ЮрФизЛицо;
    |Номенклатура            = Регистр.Продажи.Номенклатура;
    |Док            = Регистр.Продажи.Док;
    |Кол1            = Регистр.Продажи.Количество;
    |Сум1            = Регистр.Продажи.ПродСтоимость;
    |Функция Кол = Сумма(Кол1);
    |Функция Сум = Сумма(Сум1);
    |Функция СчЮрЛицо  = Счётчик() Когда (Контрагент.ЮрФизЛицо.Вид() = ""Юрлица"");
    |Функция СчФизЛицо = Счётчик() Когда ((Контрагент.ЮрФизЛицо.Вид() = ""Физлица"") Или (Контрагент.ЮрФизЛицо.Вид() = ""Сотрудники""));
    |Группировка Фирма Без Групп;
    |Группировка Номенклатура Без Групп;
    |Группировка Контрагент Без Групп;
51 DCKiller
 
26.08.15
10:13
(50)

Пока Запрос.Группировка(1) = 1 Цикл
// выводим фирмы
Пока Запрос.Группировка(2) = 1 Цикл
// выводим товары
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
// выводим физиков и юриков
Если Запрос.Получить(Запрос.Фирма, Запрос.Номенклатура, ТЗ.Контрагент) = 1 Тогда
Если (Тз.НомерСтроки = 1) ИЛИ ((ТЗ.НомерСтроки > 1) И (ТЗ.СчФизЛицо <> ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки-1, "СчФизЛицо"))) Тогда
// выводим группировку по виду контрагентов
КонецЕсли;
// выводим группировку по контрагентам
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
52 Остап Сулейманович
 
26.08.15
10:19
(50) Где группировка по ВидКонтрагента?
Описание группировок должно быть примерно таким:
|Группировка Фирма Без Групп;
|//Вот ОНО
|Группировка ВидКонтрагента;
|//Конец вот ОНО
|Группировка Номенклатура Без Групп;
|Группировка Контрагент Без Групп;
53 Остап Сулейманович
 
26.08.15
10:22
+ (52) Обход будет примерно таким:
Пока Запрос.Группировка("Фирма") = 1 Цикл
    //Рисуем раздел фирма
    Пока Запрос.Группировка("ВидКонтрагента") = 1 Цикл
        //Рисуем раздел ВидКонтрагента
        Пока Запрос.Группировка("Номенклатура") = 1 Цикл
            //Вложенные группировки
        КонецЦикла;
    КонецЦикла;
КонецЦикла;
54 DCKiller
 
26.08.15
10:22
(52) Как она в запросе вид контрагента получит?
55 Остап Сулейманович
 
26.08.15
10:23
(54) В запросе ОНО уже есть :
|ВидКонтрагента         = Регистр.Продажи.Покупатель.ЮрФизЛицо;
56 DCKiller
 
26.08.15
10:24
(55) Этот реквизит содержит значение справочника юридические или физ. лица, но не их вид.
57 Остап Сулейманович
 
26.08.15
10:27
(56) Что есть "значение справочника юридические или физ. лица"? Ссылка на элемент справочника соответсвующего вида? Так она вот : "Контрагент         = Регистр.Продажи.Покупатель".
А в реквизите "ЮрФизЛицо" именно вид.
58 DCKiller
 
26.08.15
10:28
Покупатель - это контрагент (вид "Справочник.Контрагенты"), ЮрФизЛицо  у покупателя - это значение справочника "ЮрЛица" или "ФизЛица" в зависимости от того, что там выбрано.
59 Остап Сулейманович
 
26.08.15
10:35
(58) Классика жанра : в реквизите ЮрФизЛицо хранится значение перечисления, которое и обозначает вид контрагента. И группировка по этому реквизиту и даст то, что нужно ТС.
60 DCKiller
 
26.08.15
10:37
(59) Может быть. Не помню, забыл уже, как оно там в семерке. а перед глазами нет.

Ну, если так, тогда вообще все просто. Но что-то мне подсказывает, что нет...
61 Mary01
 
26.08.15
10:38
(52) нет ее. потому что вот эта строка:
|ВидКонтрагента         = Регистр.Продажи.Покупатель.ЮрФизЛицо
- это не вид контрагента, а ссылка на справочник контрагенты. чтобы получить вид, надо так:
|ВидКонтрагента         = Регистр.Продажи.Покупатель.ЮрФизЛицо.Вид() - но в запросе Вид() не работает.
62 Mary01
 
26.08.15
10:39
(56) да, именно так
63 Масянька
 
26.08.15
10:39
(59) В ТиС : справочник Контрагенты - ЮрФизЛицо = справочник.
64 DCKiller
 
26.08.15
10:40
(62) Тады - (51)
65 Остап Сулейманович
 
26.08.15
10:40
(61) А ну-ка скрин из конфигуратора со свойствами реквизита - в студию.
66 Mary01
 
26.08.15
10:41
(57) Нет. Допустим, у нас есть контрагент Иванов А.А., у него в реквизите ЮрФизЛицо содержится ссылка на элемент справочника ФизЛица с таким же наименованием - Иванов А.А..
Или, например, есть контрагент ООО Сфера, у этого контрагента в реквизите ЮрФизЛицо - ссылка на элемент справочника ЮрЛица с наименованием ООО Сфера.
67 Провинциальный 1сник
 
26.08.15
10:42
Черный запрос черной ночью придет за тобой, одинесник. Не связывайся с ними. Прямые запросы - это православно.
68 Остап Сулейманович
 
26.08.15
10:54
(66) Тогда выполнить запрос без сортировки. Выгрузить в таблицу значений. Добавить туда колонку "видКонтрагента". Заполнить ее. посортировать по ней. И тогда уже выводить в отчет.
69 Остап Сулейманович
 
26.08.15
10:54
+(68) В запросе вид справочника не получить.
70 Mary01
 
26.08.15
12:32
(67)  )))
71 Mary01
 
26.08.15
12:32
(67) в цитаты ))
72 Mary01
 
26.08.15
12:40
(65) сюда скрин не вставляется. В свойствах реквизита ЮрФизЛицо указан тип "справочник" - т.е. конкретный справочник не указан
73 Ёпрст
 
26.08.15
12:45
В Чорном запросе можно только сделать упорядочивание по виду, группировку не сделаешь. Т.е при обходе группировки по клиентосу, будут к примеру, в начале "клиентосы", потом "сотруднички и физ лица", так тебе покатит ?
74 Ёпрст
 
26.08.15
12:46
ну и признак можно получить в переменной, что это. Но группировку не слепишь.
75 Mary01
 
26.08.15
13:28
(73) да, пусть они будут вначале, а те в конце - без разницы, но группировка должна быть, и она должна быть сверху. т.е. - написано: юр.лица , тут же сумма общая по ним, а уже ниже список этих самых юр.лиц. а ниже: физ.лица - и общая сумма по ним, а уже ниже сами физлица.
76 Duke1C
 
27.08.15
10:14
(75) "т.е. - написано: юр.лица , тут же сумма общая по ним" - ну дык сумму можно при выводе контров посчитать, а потом, как вид контрагента изменится, поставить в нужную ячейку таблицы - дешево и сердито. Если итоговых сумм несколько используй массив.
77 Ёпрст
 
27.08.15
10:44
Функция Вася(Клиентос)
  Если Клиентос.ЮрФизЛицо.Вид() = "Юрлица" Тогда
     Возврат 0;
  КонецЕсли;
  Возврат 1;
КонецФункции

ТекстЗапроса = "
    |Период с НачДата По КонДата;
    |Фирма            = Регистр.Продажи.Фирма;
    |Контрагент         = Регистр.Продажи.Покупатель;
    |ВидКонтрагента         = Регистр.Продажи.Покупатель.ЮрФизЛицо;
    |Номенклатура            = Регистр.Продажи.Номенклатура;
    |Док            = Регистр.Продажи.Док;
    |Кол1            = Регистр.Продажи.Количество;
    |Сум1            = Регистр.Продажи.ПродСтоимость;
    |Функция Кол = Сумма(Кол1);
    |Функция Сум = Сумма(Сум1);
    |Функция Вася = Максимум(Вася(Контрагент));
    |Группировка Фирма Без Групп;
    |Группировка Номенклатура Без Групп;
    |Группировка Контрагент Без Групп Упорядочить По Вася;
78 Mary01
 
28.08.15
10:58
(76) можно, но как я пойму что за ячейка?
79 Ёпрст
 
28.08.15
11:01
(78)  Просто запоминай адрес области при выводе секции.
Потом, через текст подставишь итоговые значения
80 Mary01
 
28.08.15
11:36
(79) а как определить имя текущей (или только что выведенной) области
81 Ёпрст
 
28.08.15
11:45
(80) запоминай Таб.ВысотаТаблицы() в переменной..
82 Ёпрст
 
28.08.15
11:46
потом через Таб.Область(СохраненнаяВысота,НужныйСтолбец,СохраненнаяВысота,НужныйСтолбец).Текст = "<Итоговые показатели>";

присвоишь значения
83 Масянька
 
28.08.15
11:47
(81) Уже бы не мучал человека :( Дал бы примерчик с индексированной таблицей. ИМХО, то, что нужно.