|
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) Уже бы не мучал человека :( Дал бы примерчик с индексированной таблицей. ИМХО, то, что нужно.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |