tormozit / RDT1C

Подсистема "Инструменты разработчика" для платформы 1С 8
http://devtool1c.ucoz.ru
88 stars 8 forks source link

Различные значения колонки. Долгое получения представлений ссылок в Толстом Клиенте #521

Closed PerlAmutor closed 9 months ago

PerlAmutor commented 10 months ago

https://github.com/tormozit/RDT1C/assets/87958986/b18b7824-8e5a-458b-983b-6ed0da156426

IRDebug.zip

Информация для технической поддержки Платформа: 8.3.20.1996 Режим БД: клиент-серверный Конфигурация. Название: () Конфигурация. Основной режим запуска: Управляемое приложение Конфигурация. Вариант встроенного языка: Русский Конфигурация. Режим управления блокировкой данных: Управляемый Конфигурация. Режим совместимости: НеИспользовать Конфигурация. Режим использования синхронных вызовов: НеИспользовать Инструменты разработчика. Версия: Портативный 6.95.1p Инструменты разработчика. Инструмент: Прочее Инструменты разработчика. Перехват клавиатурного ввода: Да Инструменты разработчика. Объекты на сервере: Нет Инструменты разработчика. Серверный модуль БСП: Нет Клиент. Приложение: Обычное приложение 64б Клиент. Проверка модальных вызовов: Нет Клиент. Язык интерфейса конфигурации: ru Клиент. Язык интерфейса системы: ru Клиент. Отладка разрешена: Да Клиент. Постоянный кэш метаданных: Да Клиент. ОС: Майкрософт Windows 10 Pro 64-разрядная Русский Клиент. ОС от имени администратора: Нет Клиент. ОС выполнение BAT: Да Клиент. ОС Текущая кодовая страница: 866 Клиент-Сервер. Пинг: 0мс

Воспроизведение проблемы Давно уже напрягает одна проблема. Инструмент "Различные значения колонки" очень долго получает представления ссылок в Толстом Клиенте. Например на рабочей базе это время занимает около 400 секунд для 10000 элементов справочника. Я сделал замеры производительности и пришел к выводу что проблема кроется в этом месте:

//ирРазличныеЗначенияКолонки.epf (строка 407) image

После выполнения запроса управление возвращается в Толстый Клиент, откуда потом 10000 раз идет вызов Сервера за представлением.

image

Причем в файловой базе это происходит быстрее чем в Клиент Серверной.

Я создал демонстрационную конфигурацию где можно увидеть разные подходы к получению представлений ссылок:

Вызов сервера и фоновое задание отрабатывают в среднем 1 секунду, в то время как на толстом клиенте это время 35 секунд. Стоит отметить, что время выполнения через фоновое задание варьируется и может достигать и нескольких секунд, в зависимости от нагрузки на сервер и т.п.

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

Как возможный вариант решения проблемы можно задействовать БСП, если присутствует в конфигурации. Например в тех случаях, когда количество ссылок превышает определенный порог, например 1000.

tormozit commented 10 months ago

В твоей демо базе не хватает формы

PerlAmutor commented 10 months ago

Попробуй этот .dtшник IRDebug.zip

tormozit commented 10 months ago

Проблему воспроизвел https://www.hostedredmine.com/issues/971259

PerlAmutor commented 10 months ago

Проблему воспроизвел https://www.hostedredmine.com/issues/971259

"В портативном варианте проблема осталась." Там ведь наверняка можно сделать через ДополнительныеОтчетыИОбработкиВызовСервера.ВыполнитьКоманду() когда обработка Ир зарегистрирована в справочнике.

На худой конец есть еще такой вариант, фоновое задание должно будет запуститься на сервере, клиентский общий модуль с флагом вызова "Клиент (обычное приложение)"

// Пример:
//  &НаКлиенте
//  Процедура ОбработчикКоманды(Команда)
//      ПараметрыКоманды = ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(Параметры.ДополнительнаяОбработкаСсылка);
//      ПараметрыКоманды.СопровождающийТекст = НСтр("ru = 'Выполняется команда...'");
//      Обработчик = Новый ОписаниеОповещения("<ИмяЭкспортнойПроцедуры>", ЭтотОбъект);
//      ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(Команда.Имя, ПараметрыКоманды, Обработчик);
//  КонецПроцедуры
tormozit commented 10 months ago

Чисто для портативного режима пока не планирую делать некритичные доработки.

tormozit commented 10 months ago

Исправлено в 6.97

PerlAmutor commented 10 months ago

Ты похоже не тот участок исправил. Речь шла про строку 407, вот я даже остановился в отладчике на версии 6.97

image

А доработка в строке 595

image

tormozit commented 10 months ago

Там 2 ветки с выполнением запроса получения представлений. Я пока исправил действительно только в одной. Доделаю во второй.

tormozit commented 10 months ago

Исправлено в 6.97.2

PerlAmutor commented 10 months ago

Сделал Proof-of-Concept решения проблемы с долгим получением представлений ссылок в Портативном варианте в клиент-серверном варианте через ДополнительныеОтчетыИОбработки. Скорость получения представлений на сервере приблизительно увеличилась в 100 раз

            ирОбщий.СостояниеЛкс("Получение представлений ссылок");

            // для ускорения получения представлений с серверными обработчиками https://www.hostedredmine.com/issues/971259
            Если ирКэш.ПараметрыЗаписиОбъектовЛкс().ОбъектыНаСервере Тогда
                ТекстДляВыполнения = "
                            |Запрос = Новый Запрос;
                            |Запрос.Текст = ""
                            ||ВЫБРАТЬ * ПОМЕСТИТЬ Т ИЗ &Т КАК Т;
                            ||ВЫБРАТЬ ПредставлениеСсылки(Значение) КАК ЗначениеПредставление 
                            ||ИЗ Т
                            ||УПОРЯДОЧИТЬ ПО НомерСтроки"";
                            |Запрос.УстановитьПараметр(""Т"", _АлгоритмОбъект.СсылкиБД);
                            |_АлгоритмОбъект.Результат = Запрос.Выполнить().Выгрузить();";

                СтруктураПараметров = Новый Структура;
                СтруктураПараметров.Вставить("СсылкиБД", СсылкиБД);
                СтруктураПараметров.Вставить("Результат", Неопределено);

                ирСервер.ВыполнитьАлгоритм(ТекстДляВыполнения, СтруктураПараметров);
                СсылкиБД = СтруктураПараметров.Результат;
            Иначе
                Запрос = Новый Запрос;
                Запрос.Текст = "
                |ВЫБРАТЬ * ПОМЕСТИТЬ Т ИЗ &Т КАК Т;
                |ВЫБРАТЬ ПредставлениеСсылки(Значение) КАК ЗначениеПредставление 
                |ИЗ Т
                |УПОРЯДОЧИТЬ ПО НомерСтроки";
                Запрос.УстановитьПараметр("Т", СсылкиБД);

                РезультатЗапроса = Запрос.Выполнить();
                СсылкиБД = РезультатЗапроса.Выгрузить();
            КонецЕсли;

            ОсновнойЭУ.Значение.ЗагрузитьКолонку(СсылкиБД.ВыгрузитьКолонку("ЗначениеПредставление"), "ЗначениеПредставление");
            ирОбщий.СостояниеЛкс("");
PerlAmutor commented 10 months ago

Кстати в 6.97.3p получение представлений ссылок сломалось

image

image

Проблема тут, ОбработчикЗавершения не определен, а проверки на его заполненность нет

image

tormozit commented 10 months ago

Кстати в 6.97.3p получение представлений ссылок сломалось

Нужен текст ошибки либо текстовая ссылка на строку модуля.

PerlAmutor commented 10 months ago

Кстати в 6.97.3p получение представлений ссылок сломалось

Нужен текст ошибки либо текстовая ссылка на строку модуля.

{<Неизвестный модуль>(1,10)}: Ожидается идентификатор ЭтаФорма.<<?>>(, РезультатЗадания) {<Неизвестный модуль>(1,11)}: Неопознанный оператор ЭтаФорма.(<<?>>, РезультатЗадания)

tormozit commented 10 months ago

Ошибку подтверждаю https://www.hostedredmine.com/issues/971955

tormozit commented 10 months ago

получением представлений ссылок в Портативном варианте

Реализуемость этого не вызывает сомнений. Но мне это не выгодно. Я должен готовить пользователей к переходу на расширение.

PerlAmutor commented 10 months ago

получением представлений ссылок в Портативном варианте

Реализуемость этого не вызывает сомнений. Но мне это не выгодно. Я должен готовить пользователей к переходу на расширение.

Мне эта доработка нужна при закрытии каждого месяца именно в портативном варианте, т.к. база 1С не моя и я не хочу лишний раз провоцировать ответственных за неё лиц на конфликт. Поэтому был бы премного благодарен за реализацию такой доработки, чтобы мне не приходилось вручную патчить исходники каждого последующего релиза...

tormozit commented 10 months ago

Для особо деликатных сценариев в установщике расширения есть кнопка "Запустить в одном сеансе". Почему она не подходит?

PerlAmutor commented 10 months ago

Для особо деликатных сценариев в установщике расширения есть кнопка "Запустить в одном сеансе". Почему она не подходит?

В целом подходит, но у меня еще УПП, там уже расширения не работают, а с переходом на ERP по срокам не заладилось.

tormozit commented 10 months ago

у меня еще УПП

В УПП вроде бы код написан большей частью под обычное приложение и потому там не должно быть обработчиков получения представлений с серверными вызовами, т.е. они должны быть способны делать все на клиенте. Можешь привести конкретный пример такого обработчика из УПП?

PerlAmutor commented 10 months ago

у меня еще УПП

В УПП вроде бы код написан большей частью под обычное приложение и потому там не должно быть обработчиков получения представлений с серверными вызовами, т.е. они должны быть способны делать все на клиенте. Можешь привести конкретный пример такого обработчика из УПП?

Посмотрел, там действительно нет ни одного серверного обработчика получения представлений. Там вообще обработчиков получения представлений штук 3-4 на всю конфигурацию.

tormozit commented 10 months ago

Исправлено в 6.98

PerlAmutor commented 10 months ago

Исправлено в 6.98

Что-то не исправилось, видно по замеру производительности что происходят все те же самые 10к вызовов с клиента на сервер за представлениями

https://github.com/tormozit/RDT1C/assets/87958986/a1986d24-a7f8-441e-96b8-c0da091350bc

image

image

tormozit commented 9 months ago

Оказалось что представления ссылок получаются внутри методов Выгрузить() и Выборка.Следующий(). Поэтому пришлось еще немного переделать код. Задачу перенес https://www.hostedredmine.com/issues/971259

tormozit commented 9 months ago

Сделано в 6.99