Утренние прогулки с собакой настраивают на медитативные размышления...
На работе у нас много функционала вынесено во внешние обработки. Начал думать мысль - добавить возможность загрузки внешней обработки, чтобы она воспринималась, как внутренняя. Соответственно, с возможностью перезагружать внутренние отчеты и обработки.
Сервис.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert")
Стоит ли продолжать обдумывать это дело?
Зачем это нужно, если уже есть ПриЗагрузкеФормы?
Где, как и зачем это предполагается использовать? /* нужны предварительные примеры */
> чтобы она воспринималась, как внутренняя.
А это зачем?
P.S. при редактировании сообщения отваливается продвинутый редактор, остается только текстовой. Не критично...
Дело в том, что запуск внешнего отчета очень затратен по времени. Внутренний отчет уже загружен и обращение к нему идет намного быстрей.
Например, у нас внесены некоторые расчеты во внешние обработки. Так исторически сложилось. Если запускать расчет в большом цикле, то потеря времени существенна. Можно попробовать вынести в класс. А можно попробовать сделать внешний отчет внутренним.
Если я правильно помню, в ПриЗагрузкеФормы моно только изменить объект, из которого загружается форма. И объект этот должен быть внутри md.
Можно подробней про отваливание редактора? И желательно в специальный раздел, чтобы у меня не потерялось.
Цитата: Djelf от 17 февраля 2024, 14:13P.S. при редактировании сообщения отваливается продвинутый редактор, остается только текстовой. Не критично...
Похоже, что при нажатии кнопки "редактировать" запускается упрощенный редактор. А если нажать "ещё"-"изменить", то в полном редакторе. Не знаю доступно ли это меню у пользователей или только у админа.
А!!! Чуток понял, типа кэш внешних обработок внутри системы 7.7?
Это будет супер круто, и еще круче если печатные формы внешние (+5-10% к печати минимум).
Это не потеряется, тыкаю редактировать и редактора сверху уже нет, чего уж проще (ты уже все нашел, должна быть галочка).
Цитата: Djelf от 17 февраля 2024, 15:37Это не потеряется, тыкаю редактировать и редактора сверху уже нет, чего уж проще (ты уже все нашел, должна быть галочка).
У пользователей меню "еще " нет?
Цитата: АЛьФ от 17 февраля 2024, 15:52Цитата: Djelf от 17 февраля 2024, 15:37Это не потеряется, тыкаю редактировать и редактора сверху уже нет, чего уж проще (ты уже все нашел, должна быть галочка).
У пользователей меню "еще " нет?
Очередная 8ка, чтоб ее... там есть...
Кнопка Ещё есть. А а ней изменить, когда в своём сообщении нажимаешь. В чужом - только пожаловаться.
Сервис.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert")
.
Вот у меня есть диспетчер процесса, который в зависимости от процесса передает управление между внешними обработками-формами (вызываются модально). Ускорение загрузки это хорошо, м.б. моргать будет быстрее экран (на одну обработку на разные слои весь процесс вешать не хочется, получается монструозный код, да и мало повторноиспользуемый).
.
Но тут вот какой ВОПРОС1:
допустим:
12:30:00 Сервис.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert"); // первый вызов
.. прошло сколько-то минут, ходили-бродили по обработкам
12:40:00 Сервис.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert"); // второй вызов
.
на втором вызове - будет ПОВТОРНО ЗАГРУЖЕНА ВНЕШНЯЯ ОБРАБОТКА или будет использоваться уже ранее загруженная...?
если будет использоваться ранее загруженная - это не всегда есть комильфо, потому что на этапе отладки исправляется код/косяки внешней обработки и надо чтобы она ПОДГРУЖАЛАСЬ ПОВТОРНО...
Поэтому если такая повторная подгрузка не происходит - тогда нужен типа третий параметр
Параметр: Режим,
- 0 // по умолчанию, используется ранее подгруженная
- 1 // подгружается заново
Вопрос2: как будут работать отладка с такими "превращенными" внешними обработками?
Вопрос3: (допник к Вопрос1): Допустим есть разные локальные Сервис'ы, доступные в одном и том же контексте
Сервис1.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
Сервис2.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
- обработка будет загружена повторно или как?
Вопрос4 (доп. к ВОпрос1):
сделали Сервис1.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
- Сервис1 уничтожился (закончился контекст видимости Сервис1) - что стало с загруженной обработкой?
сделали в другом контексте Сервис2.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
или повторно зашли в контекст где Сервис1.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
- будет повторно загружена или как?
Цитата: Злоп от 21 февраля 2024, 21:23Сервис.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert")
.
Вот у меня есть диспетчер процесса, который в зависимости от процесса передает управление между внешними обработками-формами (вызываются модально). Ускорение загрузки это хорошо, м.б. моргать будет быстрее экран (на одну обработку на разные слои весь процесс вешать не хочется, получается монструозный код, да и мало повторноиспользуемый).
.
Но тут вот какой ВОПРОС1:
допустим:
12:30:00 Сервис.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert"); // первый вызов
.. прошло сколько-то минут, ходили-бродили по обработкам
12:40:00 Сервис.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert"); // второй вызов
.
на втором вызове - будет ПОВТОРНО ЗАГРУЖЕНА ВНЕШНЯЯ ОБРАБОТКА или будет использоваться уже ранее загруженная...?
если будет использоваться ранее загруженная - это не всегда есть комильфо, потому что на этапе отладки исправляется код/косяки внешней обработки и надо чтобы она ПОДГРУЖАЛАСЬ ПОВТОРНО...
Поэтому если такая повторная подгрузка не происходит - тогда нужен типа третий параметр
Параметр: Режим,
- 0 // по умолчанию, используется ранее подгруженная
- 1 // подгружается заново
Задумка в том и состоит, что при вызове ЗагрузитьВнешнююОбработку она будет загружена и дальше ты работаешь с ней, как со встроенной. При повторном вызове она загружается опять. Соответственно, если ты в первом параметре указываешь имя встроенной обработки, то она будет заменена.
Значит надо будет делать какую-то систему мониторинга, которая покажет, что внешний файл изменился и надо повторно вызвать метод ЗагрузитьВнешнююОбработку. Т.е. фактически твой флаг и используется у тебя в коде как-то так:
Если НадоЗагрузить = 1 Тогда
Сервис.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
КонецЕсли;
Цитата: Злоп от 21 февраля 2024, 21:24Вопрос2: как будут работать отладка с такими "превращенными" внешними обработками?
Отладчик не поймет откуда исходный код брать. Обработки же нет фактически в MD.
Может быть получится подсовывать отладчику параметры внешней обработки, чтобы он из нее грузил. Но это надо будет уже по ходу дела разбираться.
Пока считаем, что модули такие отладки не подлежат.
Цитата: Злоп от 21 февраля 2024, 21:27Вопрос3: (допник к Вопрос1): Допустим есть разные локальные Сервис'ы, доступные в одном и том же контексте
Сервис1.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
Сервис2.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
- обработка будет загружена повторно или как?
Повторно. Загрузка никак к объекту не привязана.
Вообще многие (если не все) методы объекта Сервис - это фактически глобальные процедуры типа ОткрытьФорму().
Цитата: Злоп от 21 февраля 2024, 21:30Вопрос4 (доп. к ВОпрос1):
сделали Сервис1.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
- Сервис1 уничтожился (закончился контекст видимости Сервис1) - что стало с загруженной обработкой?
сделали в другом контексте Сервис2.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
или повторно зашли в контекст где Сервис1.ЗагрузитьВнешнююОбработку("Отчет.ОстаткиТовара", КаталогИБ()+"\ExtForms\ОстаткиТовара.ert");
- будет повторно загружена или как?
Вытекает из предыдущего ответа. Модуль останется на месте.
При повторном вызове метода будет повторно загружен.
Цитата: АЛьФ от 21 февраля 2024, 22:03Если НадоЗагрузить = 1 Тогда
ну, это-то понятно, но некрасиво/неудобно, впихнуть бы этот флаг третьим параметром типа...
Получается если у меня процесс состоит из 10-15 внешних обработок
то где-то "в начале" процесса я делаю типа
.
Сервис1.ЗагрузитьВнешнююОбработку("Отчет.Обработка1", КаталогИБ()+"\ExtForms\Обработка1.ert");
Сервис1.ЗагрузитьВнешнююОбработку("Отчет.Обработка2", КаталогИБ()+"\ExtForms\Обработка2.ert");
...
Сервис1.ЗагрузитьВнешнююОбработку("Отчет.ОбработкаN", КаталогИБ()+"\ExtForms\ОбработкаN.ert");
.
и дальше по коду процесса обработки открываю как внутренние, типа
Если Режим="ОТЛАДКА" Тогда
Сервис1.ЗагрузитьВнешнююОбработку("Отчет.ОбработкаX", КаталогИБ()+"\ExtForms\ОбработкаX.ert");
КонецЕсли;
ОткрытьФорму("Отчет.ОбработкаX",конт);
.
так?
Вопрос5: а что будет при загрузке обработки если файл обработки отсутствует?
Штатно ОткрытьФорму на несуществующий внешний отчет ничего не говорит, просто молча идет дальше по коду...
И что будет если вместо ert подсунуть/попадется какая-нить хрень?
.
Полагаю, что при неуспешной подгрузке внешнего отчета - надло вывалиться в рантайм-ошибку с сообщением в ОС.
Цитата: Злоп от 21 февраля 2024, 22:14Цитата: АЛьФ от 21 февраля 2024, 22:03Если НадоЗагрузить = 1 Тогда
ну, это-то понятно, но некрасиво/неудобно, впихнуть бы этот флаг третьим параметром типа...
Может тогда сделать чтобы метод возвращал хэш загруженного файла, а третьим параметром как раз принимал хэш. Если текущий хэш совпадает с переданным, то не загружаем. Соответственно, если третий параметр не передан, то грузим всегда. Если передана пустая строка, а отчет такой уже загружен (или есть внутренний такой), то не грузим.
Цитата: Злоп от 21 февраля 2024, 22:25Вопрос5: а что будет при загрузке обработки если файл обработки отсутствует?
Штатно ОткрытьФорму на несуществующий внешний отчет ничего не говорит, просто молча идет дальше по коду...
И что будет если вместо ert подсунуть/попадется какая-нить хрень?
.
Полагаю, что при неуспешной подгрузке внешнего отчета - надло вывалиться в рантайм-ошибку с сообщением в ОС.
Это надо будет уже при реализации проверять и решать.
По логике должна ошибка выпадать - "нет файла" и "неверный формат файла".
Цитата: АЛьФ от 21 февраля 2024, 22:29а третьим параметром как раз принимал хэш. Если текущий хэш совпадает с переданным, то не загружаем ... Если передана пустая строка,...то не грузим.
Лично мне не нравится вот это "извращение" - пустая строка - это третий параметр ХЕШ, для загруженного отчета пустая строка не совпадет с текущим хешем = ГРУЗИМ, для незагруженного хеш = неопределено, пустая строка не совпадает с неопределено - значит ГРУЗИМ. А у тебя как-то все наоборот... Чуток бы пологичнее как-то МОЖЕТ БЫТЬ. Но автору виднее...
Плотно засел за реализацию этого функционала.
Поразительно все же как уйма потраченного времени и бессонные ночи в итоге выливаются в пару десятков строк кода.
Цитата: АЛьФ от 06 марта 2024, 16:43Плотно засел за реализацию этого функционала.
Поразительно все же как уйма потраченного времени и бессонные ночи в итоге выливаются в пару десятков строк кода.
Если писать вдумчиво и не торопясь, а не ночами в режиме нехватки времени - то получается всё норм. Я вот смотрю на написанное впопыхах - ну капец же, шняга полная
Цитата: Злоп от 06 марта 2024, 21:08Цитата: АЛьФ от 06 марта 2024, 16:43Плотно засел за реализацию этого функционала.
Поразительно все же как уйма потраченного времени и бессонные ночи в итоге выливаются в пару десятков строк кода.
Если писать вдумчиво и не торопясь, а не ночами в режиме нехватки времени - то получается всё норм. Я вот смотрю на написанное впопыхах - ну капец же, шняга полная
Вдумчиво и не торопясь - это днем на работе.
Уперся в очередной тупик. Все грузится, но с пустым модулем. Никак не пойму в чем дело.
И набрел на занимательный глюк - в режиме Предприятие можно открыть отчет, как в Конфигураторе. Реквизиты формы редактируются и даже можно сохранить, как внешний отчет.
Цитата: АЛьФ от 06 марта 2024, 22:28Цитата: Злоп от 06 марта 2024, 21:08Цитата: АЛьФ от 06 марта 2024, 16:43Плотно засел за реализацию этого функционала.
Поразительно все же как уйма потраченного времени и бессонные ночи в итоге выливаются в пару десятков строк кода.
Если писать вдумчиво и не торопясь, а не ночами в режиме нехватки времени - то получается всё норм. Я вот смотрю на написанное впопыхах - ну капец же, шняга полная
Вдумчиво и не торопясь - это днем на работе.
Уперся в очередной тупик. Все грузится, но с пустым модулем. Никак не пойму в чем дело.
И набрел на занимательный глюк - в режиме Предприятие можно открыть отчет, как в Конфигураторе. Реквизиты формы редактируются и даже можно сохранить, как внешний отчет.
В этом контексте есть ли возможность менять местами колонки в ТаблицеЗначений (МногострочнойЧасти) (перетягиванием мыши или программно).
Цитата: sau от 17 марта 2024, 01:23менять местами колонки в ТаблицеЗначений
для тз можно же регулировать порядок ОТОБРАЖЕНИЯ колонок третьим параметром метода Видимость
Цитата: sau от 17 марта 2024, 01:23В этом контексте есть ли возможность менять местами колонки в ТаблицеЗначений (МногострочнойЧасти) (перетягиванием мыши или программно).
Все же для сложных взаимоотношений с табличными частями я рекомендую посмотреть в сторону ТабличноПоле из 1С++.
@Альф, а как выгрузить внешнюю обработку, которую сделали
глСервис.ЗагрузитьВнешнююОбработку(ИмяФайла,ИмяОбъекта);
.
Вот допустим я что-то программно делаю с внешней обработкой, затащил ее внутрь, что-то сделал,
теперь она не нужна, и чтобы ее не было видно в составе Меню-Операции-Обработки и Сервис.СписокВсехФорм()..?
@Альф, вот ну ничего не понимаю.
Если делать типа
Цикл ПоФайламВнешнихОбработок
ИмяОбъекта = ВРег("Обработка.Загружаемая")+[b]_GetPerformanceCounter()[/b];
локСервис.ЗагрузитьВнешнююОбработку(РасположениеФайла,ИмяОбъекта);
Описание = локСервис.ПолучитьОписаниеОбъекта(ИмяОбъекта+".ФОРМА");
КонецЦикла
то работает все нормально
А если загружать РАЗНЫЕ обработки в один и тот же объект (одно и то же имя)
Цикл ПоФайламВнешнихОбработок
ИмяОбъекта = ВРег("Обработка.Загружаемая"); // одно и то же имя объекта для разных обработок
локСервис.ЗагрузитьВнешнююОбработку(РасположениеФайла,ИмяОбъекта);
Описание = локСервис.ПолучитьОписаниеОбъекта(ИмяОбъекта+".ФОРМА");
КонецЦикла
то на втором проходе и дальше выдает ошибку
Ошибка при выполнении метода Сервис:ЗагрузитьВнешнююОбработку.
.
всего-то надо - перебрать внешние обработки и вытащить из них описание, больше ничего для каждой обработки не нужно, загрузка в конфигурацию - просто как транзитный контейнер чтобы достучаться до Описания.
вечер целый бьюсь...
Почему нельзя разные обработки в один и тот же объект загрузить?
Информационно: в цикле удалось обработать порядка 500 обработок, суммарное количество обработок (с учетом "родных") ~650. Процесс под конец стал спотыкаться на Предупреждение типа "диск полон", типа
He могу создать
КаталогИБ\1Cv7.MDVVpedText\UserHelp_Number9045\Container.Contents - диск полон
жмешь ОК (попутная ошибка загрузки в окно сообщений выдается для такого предупреждения), следующая ошибка аналогичная, только ресурс другой...
К дисковому месту на дисках компа это отношения не имеет (места вагон)...
Понятно, что MD видимо распух и не уложился/не влез куда-то... Память процесса 1С отожралось под 940 Мб
.
Замедление загрузки обработок - нелинейное, сначала шустренько, потом медленее.. медленее...
А вот если бы можно было "очищать" загруженную обработку...
Цитата: Злоп от 18 января 2025, 00:38@Альф, а как выгрузить внешнюю обработку, которую сделали
глСервис.ЗагрузитьВнешнююОбработку(ИмяФайла,ИмяОбъекта);
.
Вот допустим я что-то программно делаю с внешней обработкой, затащил ее внутрь, что-то сделал,
теперь она не нужна, и чтобы ее не было видно в составе Меню-Операции-Обработки и Сервис.СписокВсехФорм()..?
Никак.
@АЛьФ А как разные внешние обработки загружать под одним и тем же именем? (например затягивать обработки в цикле)..?
Цитата: Злоп от 20 января 2025, 13:20@АЛьФ
А как разные внешние обработки загружать под одним и тем же именем? (например затягивать обработки в цикле)..?
По идее должно в один объект нормально грузить разные обработки. Попробую потестировать этот момент дополнительно.
И по поводу чтения описания решил доработать методы ПолучитьМодульОбъекта, ПолучитьФормуОбъекта и ПолучитьОписаниеОбъекта чтобы можно было туда передавать полное имя файла внешней обработки. Будет дублирование некоторых методов, но и пусть.