Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Оптимизировать запрос в СКД - извлечение 4х уровневой групп справочника          
drug_com Подменю пользователя
сообщение 08.11.15, 18:06
Сообщение #1

Говорящий
***
Группа: Пользователи
Сообщений: 59
Из: Киев
Спасибо сказали: 3 раз
Рейтинг: 0

Привет, форумчане!

Я не программист, а только учусь.
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
Сообщение #2

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2905
Из: Київ, Україна
Спасибо сказали: 1147 раз
Рейтинг: 1228.9

Здесь не надо делать вложенный выбор - только линейный. Т. е.
не так:
ВЫБОР
    КОГДА ... ТОГДА
    ИНАЧЕ
    ВЫБОР
        КОГДА ... ТОГДА
        ИНАЧЕ
        ВЫБОР
            КОГДА ... ТОГДА
            ИНАЧЕ
        КОНЕЦ
    КОНЕЦ
КОНЕЦ

а так:
ВЫБОР
    КОГДА ... ТОГДА
    КОГДА ... ТОГДА
    КОГДА ... ТОГДА
    ИНАЧЕ
КОНЕЦ



Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

drug_com Подменю пользователя
сообщение 20.11.15, 0:59
Сообщение #3

Говорящий
***
Группа: Пользователи
Сообщений: 59
Из: Киев
Спасибо сказали: 3 раз
Рейтинг: 0

Цитата(Petre @ 09.11.15, 9:23) *
а так:
ВЫБОР
    КОГДА ... ТОГДА
    КОГДА ... ТОГДА
    КОГДА ... ТОГДА
    ИНАЧЕ
КОНЕЦ

не помогло - прежняя ошибка - скл не справляется ...

drug_com Подменю пользователя
сообщение 01.12.15, 12:15
Сообщение #4

Говорящий
***
Группа: Пользователи
Сообщений: 59
Из: Киев
Спасибо сказали: 3 раз
Рейтинг: 0

На другом форуме, для решения вышеописанной задачи, предложили воспользоваться логикой такой конструкеции:

Функция ГлубинаИерархии(ИмяСправочника, МаксимальнаяДлинаПути) Экспорт

    Пролог = "ВЫБРАТЬ Родитель НачалоДуги, Ссылка КонецДуги ПОМЕСТИТЬ ЗамыканияДлины1 ИЗ Справочник.Номенклатура
            | ГДЕ Родитель <> Значение(Справочник.Номенклатура.ПустаяСсылка)
            | ОБЪЕДИНИТЬ ВЫБРАТЬ Ссылка, Ссылка ИЗ Справочник.Номенклатура;";

    Рефрен = "ВЫБРАТЬ РАЗЛИЧНЫЕ ПерваяДуга.НачалоДуги, ВтораяДуга.КонецДуги ПОМЕСТИТЬ ЗамыканияДлины#2 ИЗ ЗамыканияДлины#1 КАК ПерваяДуга
            | СОЕДИНЕНИЕ ЗамыканияДлины#1 КАК ВтораяДуга ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги;
            | УНИЧТОЖИТЬ ЗамыканияДлины#1;";

    Эпилог = "ВЫБРАТЬ ПЕРВЫЕ 1 КОЛИЧЕСТВО(НачалоДуги) - 1 Глубина, КонецДуги Потомок ИЗ ЗамыканияДлины#2 СГРУППИРОВАТЬ ПО КонецДуги УПОРЯДОЧИТЬ ПО КОЛИЧЕСТВО(НачалоДуги) - 1 УБЫВ";

    Запрос = Новый Запрос(СтрЗаменить(Пролог, "Номенклатура", ИмяСправочника));

    МаксимальнаяДлинаЗамыканий = 1;

    Пока МаксимальнаяДлинаЗамыканий < МаксимальнаяДлинаПути Цикл

        Запрос.Текст = Запрос.Текст + СтрЗаменить(СтрЗаменить(Рефрен, "#1", Формат(МаксимальнаяДлинаЗамыканий, "ЧГ=0")), "#2", Формат(2 * МаксимальнаяДлинаЗамыканий, "ЧГ=0"));

        МаксимальнаяДлинаЗамыканий = 2 * МаксимальнаяДлинаЗамыканий

    КонецЦикла;

    Запрос.Текст = Запрос.Текст + СтрЗаменить(Эпилог, "#2", Формат(МаксимальнаяДлинаЗамыканий, "ЧГ=0"));

    Возврат Запрос.Выполнить().Выгрузить()[0].Глубина

КонецФункции

[необходимо зарегистрироваться для просмотра ссылки]

Но у меня проблема по неопытности: Можно ли вставить это в СКД запрос? (прошу прощения за тупые вопросы)

Petre Подменю пользователя
сообщение 01.12.15, 12:22
Сообщение #5

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2905
Из: Київ, Україна
Спасибо сказали: 1147 раз
Рейтинг: 1228.9

Это не код запроса. Это код встроенного языка.


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

sava1 Подменю пользователя
сообщение 01.12.15, 13:52
Сообщение #6

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2688
Из: Проскуров
Спасибо сказали: 681 раз
Рейтинг: 659.7

НЕ надо там никаких Выборов - 1Ска нормально пережевывает конструкцию типа
ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Родитель,
    Номенклатура.Родитель.Родитель,
    Номенклатура.Родитель.Родитель.Родитель
ИЗ
    Справочник.Номенклатура КАК Номенклатура

drug_com Подменю пользователя
сообщение 01.12.15, 14:32
Сообщение #7

Говорящий
***
Группа: Пользователи
Сообщений: 59
Из: Киев
Спасибо сказали: 3 раз
Рейтинг: 0

Цитата(sava1 @ 01.12.15, 13:52) *
НЕ надо там никаких Выборов - 1Ска нормально пережевывает конструкцию типа
ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Родитель,
    Номенклатура.Родитель.Родитель,
    Номенклатура.Родитель.Родитель.Родитель
ИЗ
    Справочник.Номенклатура КАК Номенклатура

Просто взять данные - это понятно, но мне нужно записать их в определенном порядке:
Строка если 2 уровня группировки:

Столбец 1, Столбец 2, Столбец 3;
Группа 2, Группа 1, Элемент;

Строка если 1 уровень группировки:
Столбец 1, Столбец 2, Столбец 3;
Группа 1, Элемент;

Для этого я преверяю "кто кому родитель", но проблема описана в первом посте темы.

Сначала надо написать
Номенклатура.Родитель.Родитель.Родитель
, если он есть,
Если его нет, надо написать
Номенклатура.Родитель.Родитель
, если он есть .... и т.д.

Petre Подменю пользователя
сообщение 01.12.15, 14:39
Сообщение #8

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2905
Из: Київ, Україна
Спасибо сказали: 1147 раз
Рейтинг: 1228.9

Попробуйте сначала выбрать как советует sava1 во временную таблицу, а потом построить ВЫБОР к ней.


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

sava1 Подменю пользователя
сообщение 01.12.15, 15:09
Сообщение #9

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2688
Из: Проскуров
Спасибо сказали: 681 раз
Рейтинг: 659.7

Чтобы было проще - пишем простой запрос. Поля ЛевелХ лепим в вычисляемые - а там простор фантазии

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 27.04.24, 11:11
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!