Форум Кладовочки АЛьФ`а

Обсуждение проектов => FormEx => Тема начата: АЛьФ от 17 февраля 2024, 11:09

Название: Загрузка внешних обработок
Отправлено: АЛьФ от 17 февраля 2024, 11:09
Утренние прогулки с собакой настраивают на медитативные размышления...
На работе у нас много функционала вынесено во внешние обработки. Начал думать мысль - добавить возможность загрузки внешней обработки, чтобы она воспринималась, как внутренняя. Соответственно, с возможностью перезагружать внутренние отчеты и обработки.

Сервис.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert")

Стоит ли продолжать обдумывать это дело?
Название: Re: Загрузка внешних обработок
Отправлено: Djelf от 17 февраля 2024, 14:13
Зачем это нужно, если уже есть ПриЗагрузкеФормы?
Где, как и зачем это предполагается использовать? /* нужны предварительные примеры */
> чтобы она воспринималась, как внутренняя.
А это зачем?

P.S. при редактировании сообщения отваливается продвинутый редактор, остается только текстовой. Не критично...
Название: Re: Загрузка внешних обработок
Отправлено: АЛьФ от 17 февраля 2024, 14:48
Дело в том, что запуск внешнего отчета очень затратен по времени. Внутренний отчет уже загружен и обращение к нему идет намного быстрей.
Например, у нас внесены некоторые расчеты во внешние обработки. Так исторически сложилось. Если запускать расчет в большом цикле, то потеря времени существенна. Можно попробовать вынести в класс. А можно попробовать сделать внешний отчет внутренним.
Если я правильно помню, в ПриЗагрузкеФормы моно только изменить объект, из которого загружается форма. И объект этот должен быть внутри md.

Можно подробней про отваливание редактора? И желательно в специальный раздел, чтобы у меня не потерялось.
Название: Re: Загрузка внешних обработок
Отправлено: АЛьФ от 17 февраля 2024, 15:35
Цитата: Djelf от 17 февраля 2024, 14:13P.S. при редактировании сообщения отваливается продвинутый редактор, остается только текстовой. Не критично...

Похоже, что при нажатии кнопки "редактировать" запускается упрощенный редактор. А если нажать "ещё"-"изменить", то в полном редакторе. Не знаю доступно ли это меню у пользователей или только у админа.
Название: Re: Загрузка внешних обработок
Отправлено: Djelf от 17 февраля 2024, 15:37
А!!! Чуток понял, типа кэш внешних обработок внутри системы 7.7?
Это будет супер круто, и еще круче если печатные формы внешние (+5-10% к печати минимум).

Это не потеряется, тыкаю редактировать и редактора сверху уже нет, чего уж проще (ты уже все нашел, должна быть галочка).
Название: Re: Загрузка внешних обработок
Отправлено: АЛьФ от 17 февраля 2024, 15:52
Цитата: Djelf от 17 февраля 2024, 15:37Это не потеряется, тыкаю редактировать и редактора сверху уже нет, чего уж проще (ты уже все нашел, должна быть галочка).

У пользователей меню "еще " нет?
Название: Re: Загрузка внешних обработок
Отправлено: Djelf от 17 февраля 2024, 21:29
Цитата: АЛьФ от 17 февраля 2024, 15:52
Цитата: Djelf от 17 февраля 2024, 15:37Это не потеряется, тыкаю редактировать и редактора сверху уже нет, чего уж проще (ты уже все нашел, должна быть галочка).

У пользователей меню "еще " нет?
Очередная 8ка, чтоб ее... там есть...
Название: Re: Загрузка внешних обработок
Отправлено: MWW_Ruza от 21 февраля 2024, 16:21
Кнопка Ещё есть. А а ней изменить, когда в своём сообщении нажимаешь. В чужом - только пожаловаться.
Название: Re: Загрузка внешних обработок
Отправлено: Злоп от 21 февраля 2024, 21:23
Сервис.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert")
.
Вот у меня есть диспетчер процесса, который в зависимости от процесса передает управление между внешними обработками-формами (вызываются модально). Ускорение загрузки это хорошо, м.б. моргать будет быстрее экран (на одну обработку на разные слои весь процесс вешать не хочется, получается монструозный код, да и мало повторноиспользуемый).
.
Но тут вот какой ВОПРОС1:
допустим:
12:30:00 Сервис.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert"); // первый вызов
.. прошло сколько-то минут, ходили-бродили по обработкам
12:40:00 Сервис.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert"); // второй вызов
.
на втором вызове - будет ПОВТОРНО ЗАГРУЖЕНА ВНЕШНЯЯ ОБРАБОТКА или будет использоваться уже ранее загруженная...?
если будет использоваться ранее загруженная - это не всегда есть комильфо, потому что на этапе отладки исправляется код/косяки внешней обработки и надо чтобы она ПОДГРУЖАЛАСЬ ПОВТОРНО...
Поэтому если такая повторная подгрузка не происходит - тогда нужен типа третий параметр
Параметр: Режим,
- 0 // по умолчанию, используется ранее подгруженная
- 1 // подгружается заново
Название: Re: Загрузка внешних обработок
Отправлено: Злоп от 21 февраля 2024, 21:24
Вопрос2: как будут работать отладка с такими "превращенными" внешними обработками?
Название: Re: Загрузка внешних обработок
Отправлено: Злоп от 21 февраля 2024, 21:27
Вопрос3: (допник к Вопрос1): Допустим есть разные локальные Сервис'ы, доступные в одном и том же контексте
Сервис1.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
Сервис2.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
- обработка будет загружена повторно или как?
Название: Re: Загрузка внешних обработок
Отправлено: Злоп от 21 февраля 2024, 21:30
Вопрос4 (доп. к ВОпрос1):
сделали Сервис1.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
- Сервис1 уничтожился (закончился контекст видимости Сервис1) - что стало с загруженной обработкой?
сделали в другом контексте Сервис2.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
или повторно зашли в контекст где Сервис1.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
- будет повторно загружена или как?
Название: Re: Загрузка внешних обработок
Отправлено: АЛьФ от 21 февраля 2024, 22:03
Цитата: Злоп от 21 февраля 2024, 21:23Сервис.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert")
.
Вот у меня есть диспетчер процесса, который в зависимости от процесса передает управление между внешними обработками-формами (вызываются модально). Ускорение загрузки это хорошо, м.б. моргать будет быстрее экран (на одну обработку на разные слои весь процесс вешать не хочется, получается монструозный код, да и мало повторноиспользуемый).
.
Но тут вот какой ВОПРОС1:
допустим:
12:30:00 Сервис.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert"); // первый вызов
.. прошло сколько-то минут, ходили-бродили по обработкам
12:40:00 Сервис.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert"); // второй вызов
.
на втором вызове - будет ПОВТОРНО ЗАГРУЖЕНА ВНЕШНЯЯ ОБРАБОТКА или будет использоваться уже ранее загруженная...?
если будет использоваться ранее загруженная - это не всегда есть комильфо, потому что на этапе отладки исправляется код/косяки внешней обработки и надо чтобы она ПОДГРУЖАЛАСЬ ПОВТОРНО...
Поэтому если такая повторная подгрузка не происходит - тогда нужен типа третий параметр
Параметр: Режим,
- 0 // по умолчанию, используется ранее подгруженная
- 1 // подгружается заново

Задумка в том и состоит, что при вызове ЗагрузитьВнешнююОбработку она будет загружена и дальше ты работаешь с ней, как со встроенной. При повторном вызове она загружается опять. Соответственно, если ты в первом параметре указываешь имя встроенной обработки, то она будет заменена.
Значит надо будет делать какую-то систему мониторинга, которая покажет, что внешний файл изменился и надо повторно вызвать метод ЗагрузитьВнешнююОбработку. Т.е. фактически твой флаг и используется у тебя в коде как-то так:
Если НадоЗагрузить = 1 Тогда
Сервис.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
КонецЕсли;
Название: Re: Загрузка внешних обработок
Отправлено: АЛьФ от 21 февраля 2024, 22:05
Цитата: Злоп от 21 февраля 2024, 21:24Вопрос2: как будут работать отладка с такими "превращенными" внешними обработками?
Отладчик не поймет откуда исходный код брать. Обработки же нет фактически в MD.
Может быть получится подсовывать отладчику параметры внешней обработки, чтобы он из нее грузил. Но это надо будет уже по ходу дела разбираться.
Пока считаем, что модули такие отладки не подлежат.
Название: Re: Загрузка внешних обработок
Отправлено: АЛьФ от 21 февраля 2024, 22:07
Цитата: Злоп от 21 февраля 2024, 21:27Вопрос3: (допник к Вопрос1): Допустим есть разные локальные Сервис'ы, доступные в одном и том же контексте
Сервис1.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
Сервис2.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
- обработка будет загружена повторно или как?
Повторно. Загрузка никак к объекту не привязана.
Вообще многие (если не все) методы объекта Сервис - это фактически глобальные процедуры типа ОткрытьФорму().
Название: Re: Загрузка внешних обработок
Отправлено: АЛьФ от 21 февраля 2024, 22:08
Цитата: Злоп от 21 февраля 2024, 21:30Вопрос4 (доп. к ВОпрос1):
сделали Сервис1.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
- Сервис1 уничтожился (закончился контекст видимости Сервис1) - что стало с загруженной обработкой?
сделали в другом контексте Сервис2.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
или повторно зашли в контекст где Сервис1.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
- будет повторно загружена или как?


Вытекает из предыдущего ответа. Модуль останется на месте.
При повторном вызове метода будет повторно загружен.
Название: Re: Загрузка внешних обработок
Отправлено: Злоп от 21 февраля 2024, 22:14
Цитата: АЛьФ от 21 февраля 2024, 22:03Если НадоЗагрузить = 1 Тогда
ну, это-то понятно, но некрасиво/неудобно, впихнуть бы этот флаг третьим параметром типа...
Название: Re: Загрузка внешних обработок
Отправлено: Злоп от 21 февраля 2024, 22:23
Получается если у меня процесс состоит из 10-15 внешних обработок
то где-то "в начале" процесса я делаю типа
.
Сервис1.ЗагрузитьВнешнююОбработку("Отчет.Обработка1", КаталогИБ()+"\ExtForms\Обработка1.ert");
Сервис1.ЗагрузитьВнешнююОбработку("Отчет.Обработка2", КаталогИБ()+"\ExtForms\Обработка2.ert");
...
Сервис1.ЗагрузитьВнешнююОбработку("Отчет.ОбработкаN", КаталогИБ()+"\ExtForms\ОбработкаN.ert");
.
и дальше по коду процесса обработки открываю как внутренние, типа

Если Режим="ОТЛАДКА" Тогда
  Сервис1.ЗагрузитьВнешнююОбработку("Отчет.ОбработкаX", КаталогИБ()+"\ExtForms\ОбработкаX.ert");
КонецЕсли;
ОткрытьФорму("Отчет.ОбработкаX",конт);
.
так?
Название: Re: Загрузка внешних обработок
Отправлено: Злоп от 21 февраля 2024, 22:25
Вопрос5: а что будет при загрузке обработки если файл обработки отсутствует?
Штатно ОткрытьФорму на несуществующий внешний отчет ничего не говорит, просто молча идет дальше по коду...
И что будет если вместо ert подсунуть/попадется какая-нить хрень?
.
Полагаю, что при неуспешной подгрузке внешнего отчета - надло вывалиться в рантайм-ошибку с сообщением в ОС.
Название: Re: Загрузка внешних обработок
Отправлено: АЛьФ от 21 февраля 2024, 22:29
Цитата: Злоп от 21 февраля 2024, 22:14
Цитата: АЛьФ от 21 февраля 2024, 22:03Если НадоЗагрузить = 1 Тогда
ну, это-то понятно, но некрасиво/неудобно, впихнуть бы этот флаг третьим параметром типа...

Может тогда сделать чтобы метод возвращал хэш загруженного файла, а третьим параметром как раз принимал хэш. Если текущий хэш совпадает с переданным, то не загружаем. Соответственно, если третий параметр не передан, то грузим всегда. Если передана пустая строка, а отчет такой уже загружен (или есть внутренний такой), то не грузим.
Название: Re: Загрузка внешних обработок
Отправлено: АЛьФ от 21 февраля 2024, 22:30
Цитата: Злоп от 21 февраля 2024, 22:25Вопрос5: а что будет при загрузке обработки если файл обработки отсутствует?
Штатно ОткрытьФорму на несуществующий внешний отчет ничего не говорит, просто молча идет дальше по коду...
И что будет если вместо ert подсунуть/попадется какая-нить хрень?
.
Полагаю, что при неуспешной подгрузке внешнего отчета - надло вывалиться в рантайм-ошибку с сообщением в ОС.

Это надо будет уже при реализации проверять и решать.
По логике должна ошибка выпадать - "нет файла" и "неверный формат файла".
Название: Re: Загрузка внешних обработок
Отправлено: Злоп от 22 февраля 2024, 00:33
Цитата: АЛьФ от 21 февраля 2024, 22:29а третьим параметром как раз принимал хэш. Если текущий хэш совпадает с переданным, то не загружаем ... Если передана пустая строка,...то не грузим.
Лично мне не нравится вот это "извращение" - пустая строка - это третий параметр ХЕШ, для загруженного отчета пустая строка не совпадет с текущим хешем = ГРУЗИМ, для незагруженного хеш = неопределено, пустая строка не совпадает с неопределено - значит ГРУЗИМ. А у тебя как-то все наоборот... Чуток бы пологичнее как-то МОЖЕТ БЫТЬ. Но автору виднее...
Название: Re: Загрузка внешних обработок
Отправлено: АЛьФ от 06 марта 2024, 16:43
Плотно засел за реализацию этого функционала.
Поразительно все же как уйма потраченного времени и бессонные ночи в итоге выливаются в пару десятков строк кода.
Название: Re: Загрузка внешних обработок
Отправлено: Злоп от 06 марта 2024, 21:08
Цитата: АЛьФ от 06 марта 2024, 16:43Плотно засел за реализацию этого функционала.
Поразительно все же как уйма потраченного времени и бессонные ночи в итоге выливаются в пару десятков строк кода.
Если писать вдумчиво и не торопясь, а не ночами в режиме нехватки времени - то получается всё норм. Я вот смотрю на написанное впопыхах - ну капец же, шняга полная
Название: Re: Загрузка внешних обработок
Отправлено: АЛьФ от 06 марта 2024, 22:28
Цитата: Злоп от 06 марта 2024, 21:08
Цитата: АЛьФ от 06 марта 2024, 16:43Плотно засел за реализацию этого функционала.
Поразительно все же как уйма потраченного времени и бессонные ночи в итоге выливаются в пару десятков строк кода.
Если писать вдумчиво и не торопясь, а не ночами в режиме нехватки времени - то получается всё норм. Я вот смотрю на написанное впопыхах - ну капец же, шняга полная

Вдумчиво и не торопясь - это днем на работе.

Уперся в очередной тупик. Все грузится, но с пустым модулем. Никак не пойму в чем дело.
И набрел на занимательный глюк - в режиме Предприятие можно открыть отчет, как в Конфигураторе. Реквизиты формы редактируются и даже можно сохранить, как внешний отчет.
Название: Re: Загрузка внешних обработок
Отправлено: sau от 17 марта 2024, 01:23
Цитата: АЛьФ от 06 марта 2024, 22:28
Цитата: Злоп от 06 марта 2024, 21:08
Цитата: АЛьФ от 06 марта 2024, 16:43Плотно засел за реализацию этого функционала.
Поразительно все же как уйма потраченного времени и бессонные ночи в итоге выливаются в пару десятков строк кода.
Если писать вдумчиво и не торопясь, а не ночами в режиме нехватки времени - то получается всё норм. Я вот смотрю на написанное впопыхах - ну капец же, шняга полная

Вдумчиво и не торопясь - это днем на работе.

Уперся в очередной тупик. Все грузится, но с пустым модулем. Никак не пойму в чем дело.
И набрел на занимательный глюк - в режиме Предприятие можно открыть отчет, как в Конфигураторе. Реквизиты формы редактируются и даже можно сохранить, как внешний отчет.
В этом контексте есть ли возможность менять местами колонки в ТаблицеЗначений (МногострочнойЧасти) (перетягиванием мыши или программно).
Название: Re: Загрузка внешних обработок
Отправлено: Злоп от 17 марта 2024, 02:06
Цитата: sau от 17 марта 2024, 01:23менять местами колонки в ТаблицеЗначений
для тз можно же регулировать порядок ОТОБРАЖЕНИЯ колонок третьим параметром метода Видимость
Название: Re: Загрузка внешних обработок
Отправлено: АЛьФ от 17 марта 2024, 09:37
Цитата: sau от 17 марта 2024, 01:23В этом контексте есть ли возможность менять местами колонки в ТаблицеЗначений (МногострочнойЧасти) (перетягиванием мыши или программно).
Все же для сложных взаимоотношений с табличными частями я рекомендую посмотреть в сторону ТабличноПоле из 1С++.
Название: Re: Загрузка внешних обработок
Отправлено: Злоп от 18 января 2025, 00:38
@Альф, а как выгрузить внешнюю обработку, которую сделали
глСервис.ЗагрузитьВнешнююОбработку(ИмяФайла,ИмяОбъекта);
.
Вот допустим я что-то программно делаю с внешней обработкой, затащил ее внутрь, что-то сделал,
теперь она не нужна, и чтобы ее не было видно в составе Меню-Операции-Обработки и Сервис.СписокВсехФорм()..?
Название: Re: Загрузка внешних обработок
Отправлено: Злоп от 18 января 2025, 02:21
@Альф, вот ну ничего не понимаю.

Если делать типа

Цикл ПоФайламВнешнихОбработок
ИмяОбъекта = ВРег("Обработка.Загружаемая")+[b]_GetPerformanceCounter()[/b];
локСервис.ЗагрузитьВнешнююОбработку(РасположениеФайла,ИмяОбъекта);
Описание = локСервис.ПолучитьОписаниеОбъекта(ИмяОбъекта+".ФОРМА");
КонецЦикла
то работает все нормально
А если загружать РАЗНЫЕ обработки в один и тот же объект (одно и то же имя)
Цикл ПоФайламВнешнихОбработок
ИмяОбъекта = ВРег("Обработка.Загружаемая"); // одно и то же имя объекта для разных обработок
локСервис.ЗагрузитьВнешнююОбработку(РасположениеФайла,ИмяОбъекта);
Описание = локСервис.ПолучитьОписаниеОбъекта(ИмяОбъекта+".ФОРМА");
КонецЦикла
то на втором проходе и дальше выдает ошибку
Ошибка при выполнении метода Сервис:ЗагрузитьВнешнююОбработку.
.
всего-то надо - перебрать внешние обработки и вытащить из них описание, больше ничего для каждой обработки не нужно, загрузка в конфигурацию - просто как транзитный контейнер чтобы достучаться до Описания.
вечер целый бьюсь...
Почему нельзя разные обработки в один и тот же объект загрузить?

Название: Re: Загрузка внешних обработок
Отправлено: Злоп от 18 января 2025, 03:54
Информационно: в цикле удалось обработать порядка 500 обработок, суммарное количество обработок (с учетом "родных") ~650. Процесс под конец стал спотыкаться на Предупреждение типа "диск полон", типа
He могу создать
КаталогИБ\1Cv7.MDVVpedText\UserHelp_Number9045\Container.Contents - диск полон

жмешь ОК (попутная ошибка загрузки в окно сообщений выдается для такого предупреждения), следующая ошибка аналогичная, только ресурс другой...
К дисковому месту на дисках компа это отношения не имеет (места вагон)...
Понятно, что MD видимо распух и не уложился/не влез куда-то... Память процесса 1С отожралось под 940 Мб
.
Замедление загрузки обработок - нелинейное, сначала шустренько, потом медленее.. медленее...

 
Название: Re: Загрузка внешних обработок
Отправлено: Злоп от 18 января 2025, 03:55
А вот если бы можно было "очищать" загруженную обработку...
Название: Re: Загрузка внешних обработок
Отправлено: АЛьФ от 20 января 2025, 09:48
Цитата: Злоп от 18 января 2025, 00:38@Альф, а как выгрузить внешнюю обработку, которую сделали
глСервис.ЗагрузитьВнешнююОбработку(ИмяФайла,ИмяОбъекта);
.
Вот допустим я что-то программно делаю с внешней обработкой, затащил ее внутрь, что-то сделал,
теперь она не нужна, и чтобы ее не было видно в составе Меню-Операции-Обработки и Сервис.СписокВсехФорм()..?

Никак.
Название: Re: Загрузка внешних обработок
Отправлено: Злоп от 20 января 2025, 13:20
@АЛьФ
А как разные внешние обработки загружать под одним и тем же именем? (например затягивать обработки в цикле)..?
Название: Re: Загрузка внешних обработок
Отправлено: АЛьФ от 21 января 2025, 09:08
Цитата: Злоп от 20 января 2025, 13:20@АЛьФ
А как разные внешние обработки загружать под одним и тем же именем? (например затягивать обработки в цикле)..?
По идее должно в один объект нормально грузить разные обработки. Попробую потестировать этот момент дополнительно.

И по поводу чтения описания решил доработать методы ПолучитьМодульОбъекта, ПолучитьФормуОбъекта и ПолучитьОписаниеОбъекта чтобы можно было туда передавать полное имя файла внешней обработки. Будет дублирование некоторых методов, но и пусть.