Имя: Пароль:
1C
1С v8
Помогите с запросом
,
0 mihco
 
14.07.11
11:25
Как бы выбрать элементы справочника и их родителя верхнего уровня? Что-то не соображу...
1 butterbean
 
14.07.11
11:26
забудь
2 mihco
 
14.07.11
11:26
хотелось бы, но не могу...
3 qeos
 
14.07.11
11:32
через "выбрать" для всех уровней..
4 mihco
 
14.07.11
11:34
(3) Такие конструкции Родитель.Родитель.Родитель?
5 OldFornit
 
14.07.11
11:35
если отчет на СКД, то выбирать не надо. Достаточно для группировки по этому справочнику указать вид иерархии
6 mihco
 
14.07.11
11:38
(5) На СКД. Но не понял про что Вы.
7 Fram
 
14.07.11
11:40
(6) если кол-во уровней у справочника определенное кол-во, то условие на каждый уровень, иначе подготовь сначала ТЗ и закинь его в СКД
8 unregistered
 
14.07.11
11:43
Получение всех родителей элемента

В языке запросов не предусмотрено специальных средств для получения всех родителей элемента. Для выполнения задачи можно воспользоваться иерархическими итогами, однако получение иерархических итогов оптимизировано для построения итогов большого количества записей, и не вполне эффективно для получения родителей одного элемента. Для более эффективного получения всех родительских записей элемента, рекомендуется перебирать в цикле его родителей небольшими порциями. Пример:


ТекущийЭлементНоменклатуры = ЭлементНоменклатура;

Запрос = Новый Запрос("ВЫБРАТЬ
| Номенклатура.Родитель,
| Номенклатура.Родитель.Родитель,
| Номенклатура.Родитель.Родитель.Родитель,
| Номенклатура.Родитель.Родитель.Родитель.Родитель,
| Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|
|ГДЕ
| Номенклатура.Ссылка = &ТекущийЭлементНоменклатуры";

Пока Истина Цикл
  Запрос.УстановитьПараметр("ТекущийЭлементНоменклатуры", ТекущийЭлементНоменклатуры);
  Результат = Запрос.Выполнить();
  Если Результат.Пустой() Тогда
     Прервать;
  КонецЕсли;
  Выборка = Результат.Выбрать();
  Выборка.Следующий();
  Для НомерКолонки = 0 По Результат.Колонки.Количество() - 1 Цикл
     ТекущийЭлементНоменклатуры = Выборка[НомерКолонки];
     Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда
        Прервать;
     Иначе
        Сообщить(ТекущийЭлементНоменклатуры);
     КонецЕсли;
  КонецЦикла;

  Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда
     Прервать;
  КонецЕсли;
КонецЦикла;

В данном примере в окно служебных сообщений выводятся все родители для ссылки, записанной в переменную ЭлементНоменклатура. В цикле выбирается по 5 родителей ссылки.

Если число уровней в справочнике ограничено и невелико, то возможно получение всех родителей одним запросом без цикла.
9 OldFornit
 
14.07.11
11:44
(6) Вкладка "настройки". В этой вкладке настраиваются отображаемые поля и группировки отчета. Создаешь группировку по необходимому справочнику, два раза щелкаешь по ней и смотришь "тип иерархии".
10 Fram
 
14.07.11
11:46
(9) прочитал бы ты (0) внимательнее
11 mihco
 
14.07.11
11:46
(9) Так не получится, нужны только группы первого уровня, а не вся иерархия.
Видимо действительно придется готовить ТЗ и ее передавать...
12 unregistered
 
14.07.11
11:54
ИМХО, проще тогда использовать ИТОГИ ПО Ссылка ТОЛЬКО ИЕРАРХИЯ в запросе и получить первый элемент выборки по группировке с типом ИтогПоИерархии. Это и будет родитель самого верхнего уровня. Если тип первого элемента будет ДетальнаяЗапись, значит этот элемент лежит на самом верхнем уровне иерархии и не имеет родителей (родитель - пустая ссылка).

А вот мутить ради этого СКД, которая стопудово использует теже механизмы, что и ИТОГИ в обычном запросе, как-то излишне.

ИМХО.
13 OldFornit
 
14.07.11
11:56
(10) действительно, ступил. Редко встречался с задачей выборки иерархии именно первого уровня.
Но и тут можно сделать примерно так:
[code]
выбрать ссылка
из справочник как сп1
где ЭтоГруппа = истина
и ссылка.родитель = Значение(Справочники.Справочник.ПустаяСсылка())
левое соединение
....
[/code]
14 OldFornit
 
14.07.11
12:04
(13) не, гоню. Точно гоню
15 Sarmen
 
14.07.11
12:08
(8) подскажи, пожалуйста, как ты так код в спойлер выделил?
16 le_
 
14.07.11
12:12
(13), (15) Тут включен только один тег: 1С.
https://1cers.ru/about.php#newtopic
Большие листинги сворачиваются в спойлер автоматически.
17 Sarmen
 
14.07.11
12:25
Пробую использовать тэг:


&НаКлиенте
Процедура Команда1(Команда)
   // Вставить содержимое обработчика.
   Структура = Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение );
   Записать(Структура);
КонецПроцедуры
18 Sarmen
 
14.07.11
12:26
А это с тегом code:

[code]

&НаКлиенте
Процедура Команда1(Команда)
   // Вставить содержимое обработчика.
   Структура = Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение );
   Записать(Структура);
КонецПроцедуры


[/code]
19 Sarmen
 
14.07.11
12:27
тег 1C - работает, тег code - нет
20 OldFornit
 
14.07.11
13:11
(0) Всерьез озадачился, как же такое сделать на СКД и все-таки нашел. В книге Хрусталевой "Разработка сложных отчетов" смотри глава 4, пример 7.
21 OldFornit
 
14.07.11
14:13
22 Sereja
 
14.07.11
14:18
тема на мисте регулярно появляется.