Я не программист, а только учусь. 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 в моем запросе?
На другом форуме, для решения вышеописанной задачи, предложили воспользоваться логикой такой конструкеции:
Функция ГлубинаИерархии(ИмяСправочника, МаксимальнаяДлинаПути) Экспорт
Пролог = "ВЫБРАТЬ Родитель НачалоДуги, Ссылка КонецДуги ПОМЕСТИТЬ ЗамыканияДлины1 ИЗ Справочник.Номенклатура | ГДЕ Родитель <> Значение(Справочник.Номенклатура.ПустаяСсылка) | ОБЪЕДИНИТЬ ВЫБРАТЬ Ссылка, Ссылка ИЗ Справочник.Номенклатура;";
Рефрен = "ВЫБРАТЬ РАЗЛИЧНЫЕ ПерваяДуга.НачалоДуги, ВтораяДуга.КонецДуги ПОМЕСТИТЬ ЗамыканияДлины#2 ИЗ ЗамыканияДлины#1 КАК ПерваяДуга | СОЕДИНЕНИЕ ЗамыканияДлины#1 КАК ВтораяДуга ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги; | УНИЧТОЖИТЬ ЗамыканияДлины#1;";
Эпилог = "ВЫБРАТЬ ПЕРВЫЕ 1 КОЛИЧЕСТВО(НачалоДуги) - 1 Глубина, КонецДуги Потомок ИЗ ЗамыканияДлины#2 СГРУППИРОВАТЬ ПО КонецДуги УПОРЯДОЧИТЬ ПО КОЛИЧЕСТВО(НачалоДуги) - 1 УБЫВ";
Запрос = Новый Запрос(СтрЗаменить(Пролог, "Номенклатура", ИмяСправочника));
МаксимальнаяДлинаЗамыканий = 1;
Пока МаксимальнаяДлинаЗамыканий < МаксимальнаяДлинаПути Цикл
НЕ надо там никаких Выборов - 1Ска нормально пережевывает конструкцию типа
ВЫБРАТЬ Номенклатура.Ссылка, Номенклатура.Родитель, Номенклатура.Родитель.Родитель, Номенклатура.Родитель.Родитель.Родитель ИЗ Справочник.Номенклатура КАК Номенклатура
НЕ надо там никаких Выборов - 1Ска нормально пережевывает конструкцию типа
ВЫБРАТЬ Номенклатура.Ссылка, Номенклатура.Родитель, Номенклатура.Родитель.Родитель, Номенклатура.Родитель.Родитель.Родитель ИЗ Справочник.Номенклатура КАК Номенклатура
Просто взять данные - это понятно, но мне нужно записать их в определенном порядке: Строка если 2 уровня группировки:
Столбец 1, Столбец 2, Столбец 3; Группа 2, Группа 1, Элемент;
Строка если 1 уровень группировки: Столбец 1, Столбец 2, Столбец 3; Группа 1, Элемент;
Для этого я преверяю "кто кому родитель", но проблема описана в первом посте темы.
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!