Версия для печати темы (https://pro1c.org.ua/index.php?s=f74405b53b286ee2f5535adfebb686a0&showtopic=26196)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Система компоновки данных _ Оптимизировать запрос в СКД - извлечение 4х уровневой групп справочника
Автор: drug_com 08.11.15, 18:06
Привет, форумчане!
Я не программист, а только учусь.
8.2 УТП (1.2.19.1)
Был у меня СКД отчет.
Извлекал он мне 2х уровневую группировку справочника ПодразделенияОрганихзации в разные колонки размещая их в обратном порядке:
Строка если 2 уровня группировки: Группа 2, Группа 1, Элемент
Строка если 1 уровень группировки: Группа 1, Элемент.
Мне понадобилось добавить еще один уровень справочника, в связи с чем решил скорректировать отчет.
Добавил конструкцию в первые 25 строк и добавил количество родителей в каждой конструкции "НЕ" ниже:
Код ВЫБОР
КОГДА НЕ ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель.Родитель ЕСТЬ NULL
И ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель.Родитель <> ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)
И ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель.Родитель <> ""
ТОГДА ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель.Родитель
ИНАЧЕ ВЫБОР
КОГДА НЕ ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель ЕСТЬ NULL
И ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель <> ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)
И ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель <> ""
ТОГДА ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель
ИНАЧЕ ВЫБОР
КОГДА НЕ ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель ЕСТЬ NULL
И ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель <> ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)
И ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель <> ""
ТОГДА ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель
ИНАЧЕ ВЫБОР
КОГДА НЕ ОборотЗатратыДоходы.ПодразделениеОрганизации ЕСТЬ NULL
И ОборотЗатратыДоходы.ПодразделениеОрганизации <> ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)
И ОборотЗатратыДоходы.ПодразделениеОрганизации <> ""
ТОГДА ОборотЗатратыДоходы.ПодразделениеОрганизации
ИНАЧЕ ""
КОНЕЦ
КОНЕЦ
КОНЕЦ
КОНЕЦ КАК ПодрОргЛевел1,
ВЫБОР
КОГДА НЕ ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель.Родитель ЕСТЬ NULL
И ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель.Родитель <> ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)
И ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель.Родитель <> ""
ТОГДА ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель
ИНАЧЕ ВЫБОР
КОГДА НЕ ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель ЕСТЬ NULL
И ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель <> ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)
И ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель <> ""
ТОГДА ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель
ИНАЧЕ ВЫБОР
КОГДА НЕ ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель ЕСТЬ NULL
И ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель <> ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)
И ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель <> ""
ТОГДА ОборотЗатратыДоходы.ПодразделениеОрганизации
ИНАЧЕ ""
КОНЕЦ
КОНЕЦ
КОНЕЦ КАК ПодрОргЛевел2,
ВЫБОР
КОГДА НЕ ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель.Родитель ЕСТЬ NULL
И ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель.Родитель <> ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)
И ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель.Родитель <> ""
ТОГДА ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель
ИНАЧЕ ВЫБОР
КОГДА НЕ ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель ЕСТЬ NULL
И ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель <> ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)
И ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель <> ""
ТОГДА ОборотЗатратыДоходы.ПодразделениеОрганизации
ИНАЧЕ ""
КОНЕЦ
КОНЕЦ КАК ПодрОргЛевел3,
ВЫБОР
КОГДА НЕ ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель.Родитель ЕСТЬ NULL
И ОборотЗатратыДоходы.ПодразделениеОрганизации.Родитель.Родитель.Родитель <> ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)
ТОГДА ОборотЗатратыДоходы.ПодразделениеОрганизации
ИНАЧЕ ""
КОНЕЦ КАК ПодразделениеОрганизации,
После чего SQL сказал, что не в состоянии это обработать, и что нужно упростить запрос.
Цитата
Внутренняя ошибка: был достигнут предел служб выражений. Проверьте потенциально сложные выражения в запросе и постарайтесь их упростить.
SQLSrvr: SQLSTATE=42000, state=2, Severity=11, native=8632, line=1
Прошу подсказки как упростить запрос, чтобы SQL не ругался?
Что конкретно не понравилось SQL в моем запросе?
Автор: Petre 09.11.15, 9:23
Здесь не надо делать вложенный выбор - только линейный. Т. е.
не так:
ВЫБОР
КОГДА ... ТОГДА
ИНАЧЕ
ВЫБОР
КОГДА ... ТОГДА
ИНАЧЕ
ВЫБОР
КОГДА ... ТОГДА
ИНАЧЕ
КОНЕЦ
КОНЕЦ
КОНЕЦ
а так:
ВЫБОР
КОГДА ... ТОГДА
КОГДА ... ТОГДА
КОГДА ... ТОГДА
ИНАЧЕ
КОНЕЦ
Автор: drug_com 20.11.15, 0:59
Цитата(Petre @ 09.11.15, 9:23)
а так:
ВЫБОР
КОГДА ... ТОГДА
КОГДА ... ТОГДА
КОГДА ... ТОГДА
ИНАЧЕ
КОНЕЦ
не помогло - прежняя ошибка - скл не справляется ...
Автор: drug_com 01.12.15, 12:15
На другом форуме, для решения вышеописанной задачи, предложили воспользоваться логикой такой конструкеции:
Функция ГлубинаИерархии(ИмяСправочника, МаксимальнаяДлинаПути) Экспорт
Пролог = "ВЫБРАТЬ Родитель НачалоДуги, Ссылка КонецДуги ПОМЕСТИТЬ ЗамыканияДлины1 ИЗ Справочник.Номенклатура
| ГДЕ Родитель <> Значение(Справочник.Номенклатура.ПустаяСсылка)
| ОБЪЕДИНИТЬ ВЫБРАТЬ Ссылка, Ссылка ИЗ Справочник.Номенклатура;";
Рефрен = "ВЫБРАТЬ РАЗЛИЧНЫЕ ПерваяДуга.НачалоДуги, ВтораяДуга.КонецДуги ПОМЕСТИТЬ ЗамыканияДлины#2 ИЗ ЗамыканияДлины#1 КАК ПерваяДуга
| СОЕДИНЕНИЕ ЗамыканияДлины#1 КАК ВтораяДуга ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги;
| УНИЧТОЖИТЬ ЗамыканияДлины#1;";
Эпилог = "ВЫБРАТЬ ПЕРВЫЕ 1 КОЛИЧЕСТВО(НачалоДуги) - 1 Глубина, КонецДуги Потомок ИЗ ЗамыканияДлины#2 СГРУППИРОВАТЬ ПО КонецДуги УПОРЯДОЧИТЬ ПО КОЛИЧЕСТВО(НачалоДуги) - 1 УБЫВ";
Запрос = Новый Запрос(СтрЗаменить(Пролог, "Номенклатура", ИмяСправочника));
МаксимальнаяДлинаЗамыканий = 1;
Пока МаксимальнаяДлинаЗамыканий < МаксимальнаяДлинаПути Цикл
Запрос.Текст = Запрос.Текст + СтрЗаменить(СтрЗаменить(Рефрен, "#1", Формат(МаксимальнаяДлинаЗамыканий, "ЧГ=0")), "#2", Формат(2 * МаксимальнаяДлинаЗамыканий, "ЧГ=0"));
МаксимальнаяДлинаЗамыканий = 2 * МаксимальнаяДлинаЗамыканий
КонецЦикла;
Запрос.Текст = Запрос.Текст + СтрЗаменить(Эпилог, "#2", Формат(МаксимальнаяДлинаЗамыканий, "ЧГ=0"));
Возврат Запрос.Выполнить().Выгрузить()[0].Глубина
КонецФункции
http://pro1c.org.ua/redirect.php?http://infostart.ru/public/160707/
Но у меня проблема по неопытности: Можно ли вставить это в СКД запрос? (прошу прощения за тупые вопросы)
Автор: Petre 01.12.15, 12:22
Это не код запроса. Это код встроенного языка.
Автор: sava1 01.12.15, 13:52
НЕ надо там никаких Выборов - 1Ска нормально пережевывает конструкцию типа
ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Родитель,
Номенклатура.Родитель.Родитель,
Номенклатура.Родитель.Родитель.Родитель
ИЗ
Справочник.Номенклатура КАК Номенклатура
Автор: drug_com 01.12.15, 14:32
Цитата(sava1 @ 01.12.15, 13:52)
НЕ надо там никаких Выборов - 1Ска нормально пережевывает конструкцию типа
ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Родитель,
Номенклатура.Родитель.Родитель,
Номенклатура.Родитель.Родитель.Родитель
ИЗ
Справочник.Номенклатура КАК Номенклатура
Просто взять данные - это понятно, но мне нужно записать их в определенном порядке:
Строка если 2 уровня группировки:
Столбец 1, Столбец 2, Столбец 3;
Группа 2, Группа 1, Элемент;
Строка если 1 уровень группировки:
Столбец 1, Столбец 2, Столбец 3;
Группа 1, Элемент;
Для этого я преверяю "кто кому родитель", но проблема описана в первом посте темы.
Сначала надо написать
Номенклатура.Родитель.Родитель.Родитель
, если он есть,
Если его нет, надо написать
Номенклатура.Родитель.Родитель
, если он есть .... и т.д.
Автор: Petre 01.12.15, 14:39
Попробуйте сначала выбрать как советует sava1 во временную таблицу, а потом построить ВЫБОР к ней.
Автор: sava1 01.12.15, 15:09
Чтобы было проще - пишем простой запрос. Поля ЛевелХ лепим в вычисляемые - а там простор фантазии
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua