Исправление UChoice для корректной работы с SQL

31.03.10

Разработка - Инструментарий разработчика

Рассказывается как исправить типовой универсальный отчет: "Подбор объектов", что бы он работал с SQL.
В текущей реализации, которая лежит на ИТС без изменений много лет, в SQL базе отобрать объекты по вхождению в группу справочника невозможно, при этом в DBF варианте все работает.

Скачать файлы

Наименование Файл Версия Размер
Испавленный UChoice.ert
.ert 232,00Kb
124
.ert 232,00Kb 124 Скачать

Проиллюстрирую сначала проблему на небольшом простом примере:

Создайте внешний отчет с единственным реквизитом на форме типа: "Справочник.Контрагенты", пусть идентификатор этого реквизита будет "Группа".

В процедуру Сформировать вставьте код:

Процедура Сформировать()
    Перем гУсл1;
    гУсл1 = СоздатьОбъект("СписокЗначений");
    гУсл1.ДобавитьЗначение(Группа.ТекущийЭлемент());

    ТекстЗапроса = "
    |ПеремОбъект = Справочник.Контрагенты.ТекущийЭлемент;
    |Группировка ПеремОбъект Без Групп;
    |Перем1 = Справочник.Контрагенты.Родитель;
    |Условие (Перем1 В гУсл1);
    |";

    Запрос = СоздатьОбъект("Запрос");

    Если Запрос.Выполнить(ТекстЗапроса) = 0 тогда
        Предупреждение("Запрос не выполнен!");
        Возврат;
    КонецЕсли;

    Пока Запрос.Группировка(1, 1) = 1 Цикл
        Сообщить(Запрос.ПеремОбъект);
    КонецЦикла;

КонецПроцедуры

 

Попробуйте выполнить это в SQL базе и в DBF. В DBF, как и должно быть, выведет содержимое группы справочника, а вот в SQL не выведет ничего, - это и есть проблема.

 

Из-за этого в SQL базах не работает и отбор по группе справочника в известной универсальной обработке: UChoice.ert

Попробуйте отобрать ей в SQL базе объекты любого справочника по условию вхождения в группу - список будет пуст. В DBF базе, наоборот, все сработает.

Кроме того в ТиС эта универсальная обработка вставлена в саму конфигурацию под именем: "ПодборОбъектов", - проблемы те же.

 

Меня давно нервировало такое поведение системы, но все время не доходили руки разобраться, почему то работает, то нет. Но наконец руки дошли и вот, что я предлагаю.

Заставить в SQL базе запрос работать так же как в DBF можно как минимум 2-мя путями:

 

1. Перед Запрос.Выполнить(ТекстЗапроса); поставить строку: Запрос.ВключитьSQL(0);

Это недокументированная функция, в случае DBF ничего не делает, а влучае SQL как то меняет внутренню обработку запросов 1С. Запрос начинает работать правильно, но ОЧЕНЬ медленно.

 

2. Изменить текст запроса и вместо:

Условие (Перем1 В гУсл1);

написать:

Условие (гУсл1.Принадлежит(Перем1) = 1);

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

 

Соответственно для исправления UChoice будем использовать второй способ.

 

За формирование текста и выполнение запроса в отчете отвечает:

Процедура Запрос(ВидОбъекта)

В ней нас интересуют буквально самые последние строки перед Запрос.Выполнить():


            Если СокрЛП(ТабУсловия.КолУсловие) = "<>" Тогда
                ТекстЗапроса = ТекстЗапроса + "
                               |Перем" + НомСтр + " = "  + гТипОбъекта + стрТочка + ВидОбъекта + "."
                                                      + ИмяПерем + ";"
                              "Условие (Не(Перем" + НомСтр + " В гУсл" + НомСтр + "));";
            Иначе
                ТекстЗапроса = ТекстЗапроса + "
                               |Перем" + НомСтр + " = "  + гТипОбъекта + стрТочка + ВидОбъекта + "."
                                                      + ИмяПерем + ";"
                              "Условие (Перем" + НомСтр + " " + ТабУсловия.КолУсловие + " гУсл" + НомСтр + ");";
            КонецЕсли;

Их надо исправить на:


            Если СокрЛП(ТабУсловия.КолУсловие) = "<>" Тогда
                ТекстЗапроса = ТекстЗапроса + "
                               |Перем" + НомСтр + " = "  + гТипОбъекта + стрТочка + ВидОбъекта + "."
                                                      + ИмяПерем + ";"
                              "Условие (гУсл" + НомСтр + ".Принадлежит(Перем" + НомСтр + ") = 0);";
            ИначеЕсли СокрЛП(ТабУсловия.КолУсловие) = "В" Тогда
                ТекстЗапроса = ТекстЗапроса + "
                               |Перем" + НомСтр + " = "  + гТипОбъекта + стрТочка + ВидОбъекта + "."
                                                      + ИмяПерем + ";"
                              "Условие (гУсл" + НомСтр + ".Принадлежит(Перем" + НомСтр + ") = 1);";
            Иначе
                ТекстЗапроса = ТекстЗапроса + "
                               |Перем" + НомСтр + " = "  + гТипОбъекта + стрТочка + ВидОбъекта + "."
                                                      + ИмяПерем + ";"
                              "Условие (Перем" + НомСтр + " " + ТабУсловия.КолУсловие + " гУсл" + НомСтр + ");";

            КонецЕсли;

Собственно и все :)

Сохраняйте, пробуйте.

А тем, кто еще пишет под 7.7. стоит запомнить такое поведение SQL движка, - может пригодится.

См. также

Консоль запросов

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Консоль запросов к базе SQL, не требующая внешних компонент

10 стартмани

29.04.2015    21559    54    Gvozdod    8    

14

StartManager 1.4 - Развитие альтернативного стартера

Инструментарий разработчика Платформа 1С v7.7 Платформа 1С v8.3 Абонемент ($m)

Очередная редакция альтернативного стартера, являющегося продолжением StartManager 1.3. Спасибо всем, кто присылал свои замечания и пожелания, и тем, кто перечислял финансы на поддержку проекта. С учетом накопленного опыта, стартер был достаточно сильно переработан в плане архитектуры. В основном сделан упор на масштабируемость, для способности программы быстро адаптироваться к расширению предъявляемых требований (т.к. довольно часто просят добавить ту или иную хотелку). Было пересмотрено внешнее оформление, переработан существующий и добавлен новый функционал. В общем можно сказать, что стартер эволюционировал, по сравнению с предыдущей редакцией. Однако пока не всё реализовано, что планировалось, поэтому еще есть куда развиваться в плане функциональности.

1 стартмани

23.04.2014    165708    1864    Alexoniq    1596    

496

Tray Informer

Инструментарий разработчика Платформа 1С v7.7 Платформа 1С v8.3 Россия Абонемент ($m)

Согласитесь, что окно стандартное сообщений в 1С иногда приносит больше неудобств, чем пользы. И тем более разные "Предупредить"... Что с этим окном только не делают! Его отцепают от формы, делают маленьким, умудряются спрятать за границы экрана. А потом звонят программистам с претензией, что документ почему-то не проводится, отя ничего и не пишет. У вас такого не было? А вот у нас было и не раз )))

1 стартмани

04.09.2013    32878    61    O-Planet    78    

49

Изменение структуры баз 1С 7.7 без долгой реструктуризации. Часть 1. Справочники

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

На днях встретил вопрос на форуме про возможность внесения изменений в конфигурацию без долгого сохранения в рабочей базе большого объема. Вот решил поделиться опытом, как это делал я. База у нас была объемом порядка 120 Гб. К базе обращался сайт в режиме 24/7, поэтому важно было быстро сохранять изменения и желательно без последующего монопольного запуска для восстановления индексов и процедур и без отключения пользователей от базы. Это первая часть статьи и посвящена она справочникам. С одной стороны - это самый простой объект, с другой стороны, именно про справочник спрашивалось на форуме. Если статья будет востребована, то я напишу аналогичные про документы, регистры и может еще что.

1 стартмани

13.08.2013    21198    Reptile    5    

35

v7.7 1CDialogControls: Инструмент в помощь разработчику на 7.7.

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

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

1 стартмани

21.02.2013    18030    35    MarSeN    14    

16

[Разработчику] Любая таблица значений в OLAP

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Анализируем различные данные в 1С, используя OLAP-технологии со всеми прелестями. Т.е. наглядное отображение данных, быстрые расчеты, горизонтальные и вертикальные группировки любой вложенности, удобная фильтрация, Drag'n'Drop и ещё много приятных вещей от MS. Обработка на входе принимает практически любую таблицу значений (ТЗ в которой колонкам указаны типы значений, строка, число и т.п.), на выходе имеем на форме 1С сводную таблицу и график по этой ТЗ, с которой работаем, как и в Excel со сводной таблицей и диаграммой. Взял за основу разработку «OLAP Анализ счёта» ( http://infostart.ru/public/14964/ ) от JohnyDeath и переделал под любую ТЗ. Опционально используется «Прогресс бар для 1С 77» (http://infostart.ru/public/14061/ ) от Gmix.

1 стартмани

21.12.2012    36103    51    venger    7    

23

Библиотека кода 1С 7.7 (накопленная за 8 лет)

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Весь код на 1С 7.7, собранный для повторного использования за 8 лет работы.

10 стартмани

25.11.2012    34959    248    adhocprog    51    

70
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Sk0rp 119 31.03.10 19:20 Сейчас в теме
Так и не разобрался как оформить код, что бы он был с раскраской. Подскажите кто знает, плз.
2. marsohod 123 31.03.10 21:29 Сейчас в теме
4. Sk0rp 119 01.04.10 15:09 Сейчас в теме
(2) Спасибо, только мне прямо в этой статье раскрасить надо, тот способ не подойдет.
(3) Вы невнимательно читали. Группы в выборке не нужны. Речь вообще не об этом.
5. marsohod 123 09.04.10 13:37 Сейчас в теме
6. Sk0rp 119 04.07.10 12:58 Сейчас в теме
(5) Да, это то, что нужно. Хотя я и не сразу понял это :), спасибо!
7. marsohod 123 04.07.10 13:32 Сейчас в теме
3. vcv 89 01.04.10 07:44 Сейчас в теме
Что бы отбор по группам работал достаточно на закладке "Общие свойства" поставить галочку "Включать в выборку группы справочника".
8. CheBurator 3119 17.01.11 22:09 Сейчас в теме
утверждается:
"...Из-за этого в SQL базах не работает и отбор по группе справочника в известной универсальной обработке: UChoice.ert
Попробуйте отобрать ей в SQL базе объекты любого справочника по условию вхождения в группу - список будет пуст."
.
готов продемонстрировать в штатной Учойсе на штатной скульной базе порядок нажатия кнопариков, который приведет к выборке "...объекты любого справочника по условию вхождения в группу" - и список НЕ БУДЕТ ПУСТ!!! о, это - чудо? ;-)
12. CratosX 112 07.08.13 13:40 Сейчас в теме
(8) CheBurator, поделитесь знаниями?

Разобрался, не хватало ещё каких-то файликов в папке с UChoise.ert. Помог совет http://www.forum.mista.ru/topic.php?id=420195#8
13. CheBurator 3119 07.08.13 15:57 Сейчас в теме
(12) используй нормальные установщики универсальных обработок с диска ИТС.
смотри также полезности
http://infostart.ru/public/17032/
http://infostart.ru/public/17037/
.
по группе в скуле - внимательно поройся на закладках обработки
9. Sk0rp 119 18.01.11 10:58 Сейчас в теме
Готов продемонстрировать обратное :)

Если и существует один хитрый путь как обойти ошибку, то это, ИМХО, не повод оставлять обработку нерабочей для всех, кто этого способа не знает.
10. white_ven 11.10.11 15:08 Сейчас в теме
11. CratosX 112 07.08.13 13:32 Сейчас в теме
хм, удивительно - скачал обработку в надежде на решение этой проблемы, но не помогло. На dbf всегда присутствует выбор обработки объектов, а в SQL всегда скрыты.
Платформа 7.70.021
Прикрепленные файлы:
Оставьте свое сообщение