Имя: Пароль:
1C
1C 7.7
v7: Новая версия FormEx 2.0.5.194
Ø (Волшебник 15.02.2024 21:14)
0 АЛьФ
 
14.02.24
21:52
Выложил обновление.

Для объекта ОкноСообщений добавлены методы получения и установки координат окна.
Добавлена предопределенная процедура ПриВыводеСообщения().
Добавлен новый объект ПрогрессБар.
Подробней в als.

Информация о доработках в комментах этой ветки:
(67),(102),(122),(224),(294),(317),(366),(407)

Качать, как обычно, тут: http://dorex.pro/?projects&formex&download
334 АЛьФ
 
11.02.24
15:40
2(332) В следующий раз добавлю.
335 АЛьФ
 
11.02.24
15:43
2(333) Тут уж я вряд ли что-то буду менять.
336 Злопчинский
 
11.02.24
15:47
(335) кактусовод, елы-палы... ;-)
337 Злопчинский
 
11.02.24
15:48
буду сюда информационно кидать ошибки в словах и падежов
338 Злопчинский
 
11.02.24
15:48
вот
339 Злопчинский
 
11.02.24
15:50
новый
340 Злопчинский
 
11.02.24
15:51
поворот
341 Злопчинский
 
11.02.24
16:09
вот тут ALS редактор https://infostart.ru/1c/tools/14338/
на 10-ке без доп.бубнов ругается
342 АЛьФ
 
11.02.24
16:13
2(338-340) Лучше текстом кидать, мне будет проще искать.
2(341) В Нотепад++ мне привычней. Грамотность моя не повысится от использования других инструментов.
343 Chai Nic
 
11.02.24
17:21
Прошу проверить ещё один баг. Если в форме журнала документов обратиться к реквизиту атрибута расширения формы, то 1с вылетает.
Тестовая процедура, в модуле формы журнала.

Процедура ПослеОткрытия()
    Расш=СоздатьОбъект("РасширениеФормы");
    Расш.УстановитьФорму(Форма);
    Для Сч=1 по Расш.КоличествоАтрибутов() Цикл
        Атр=Расш.ПолучитьАтрибут(Сч);
        Тест=Атр.Тип; // вылетает если делать вот это (не обязательно Тип, если обращаться к Формула - то же самое), но вылетает не сразу, а после завершения процедуры

    КонецЦикла;
КонецПроцедуры
344 Злопчинский
 
11.02.24
17:59
(343) подтверждаю. приведенный выше код вышибает 1Ску бесповоротно. Вылетает при выходе из процедуры - на выполнении КонецПроцедуры. Проверял на абсолютно пустой пустой форме журнала.
345 АЛьФ
 
11.02.24
18:05
2(343) Падение в этом примере связано с тем, что атрибуты нумеруются с 0. Т.е. цикл должен быть таким:
Для Сч=0 по Расш.КоличествоАтрибутов()-1 Цикл
346 Chai Nic
 
11.02.24
18:09
(345) Понял. Ну ладно, учтем это как фичу.
347 АЛьФ
 
11.02.24
18:10
2(346) Поправил, чтобы не падало. Там классическая ошибка была: "строго больше" вместо "больше или равно".
348 АЛьФ
 
11.02.24
18:10
+(347) В следующей сборке будет учтено.
349 mishaPH
 
11.02.24
18:19
гм. народ. автор жжет.. кидайте скорее свои хотелки, пока добрый и есть время ;)
350 АЛьФ
 
11.02.24
18:21
2(349) Поздно... С понедельника возьмусь за восьмерочные задачи.
351 Злопчинский
 
11.02.24
20:09
(345) я в (333) был предельно бдителен...
352 Злопчинский
 
11.02.24
20:12
(350) космополит...
353 Злопчинский
 
11.02.24
22:51
(345) "Для Сч=0 по Расш.КоличествоАтрибутов()-1"
если количество атрибутов = 10, от 0 до 9 - то почему не сломалось при цикеле от 1 до 10 на ПолучитьАтрибут(10)..?
354 АЛьФ
 
12.02.24
09:04
2(353) Выходя за пределы массива элементов, не всегда попадаешь в область памяти, которая вызывает падение. Можно попасти и в мусор, оставшийся от прошлой формы. Т.е. будут какие-то данные получены.
355 Chai Nic
 
12.02.24
11:33
После установки свежего релиза поломалась расшифровка таблицы в бухгалтерских отчетах. В вызов глобальной процедуры ОбработкаЯчейкиТаблицы() попадает первым параметром контекст, вместо параметра расшифровки. Эта процедура изначально штатная с определенным поведением, даже в глобальнике. Если уж передавать туда контекст, то как необязательный параметр и после всех стандартных.
356 АЛьФ
 
12.02.24
11:52
2(355) Вот ведь зараза какая... Спасибо. Буду вечером чинить.

Проблема со сквозным вызовом через доп.глобальники. Надо поставить исключения на процедуры, которые в штатной версии могут быть и в модуле формы, и в глобальнике. Помимо ОбработкаЯчейкиТаблицы() есть еще такие?
357 АгентБезопасной Нацио
 
12.02.24
11:57
(356) Кстати, а перехватчик потом не перехватит еще и событие из глобальника?
358 AAA
 
12.02.24
12:22
Есть милый мультик "Каникулы Бонифация". Догадайтесь, кто тут Бонифаций, кто Бабушка и кто наглые зверушки )
359 Chai Nic
 
12.02.24
12:54
(356) ПриУстановкеОтбора() ещё такая же
360 Злопчинский
 
12.02.24
13:27
такс.. тогда откатываемся на 191 релиз
361 АЛьФ
 
12.02.24
13:28
2(357) Понятия не имею. Проверять надо.
2(360) Нельзя же быть таким оптимистом!
362 Злопчинский
 
12.02.24
13:40
(361) эти косячки они просто последствия от использовании снеговика ;-) это ж как ковид... непонятно чем аукнется...
363 Злопчинский
 
12.02.24
13:40
(357) я об этом сразу подумал, но так как перехватчики не юзаю то и забил...
364 Arbuz
 
12.02.24
17:52
Может для имён перехваченных процедур какой-нибудь префикс завести?
365 АЛьФ
 
12.02.24
20:34
2(364) Думал над этим. Но от озвученных глюков это не избавило бы.
366 АЛьФ
 
12.02.24
20:36
Выложил новую сборку.
Исправил обнаруженные глюки. Добавил пару методов объекту Сервис: ВерсияFormEx и ДоступнаяВерсияFormEx.
Первый метод для получения текущей версии компоненты, второй для запроса с сайта выложенной версии.
367 АЛьФ
 
12.02.24
20:36
Может кто-нибудь из модераторов поправит заголовок темы? Текущая сборка уже 2.0.5.194.
368 Chai Nic
 
13.02.24
08:55
Кстати, возник вопрос. По какой причине может не срабатывать УстановитьПеременнуюКонтекста()? Возвращает 0, то есть, не удалось установить переменную. Однако, если обращаться через точку, то всё работает. Но нужно обращаться по заранее неизвестному имени. Суть задачи - обнулить реквизиты на форме, где введен счет, который не относится к списку разрешенных для пользователя.

Например в ПослеОбновленияФормы:

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

Сообщить(Сервис.УстановитьПеременнуюКонтекста(Конт,"Счет",СчетПоКоду("00"))); // выдается 0 в возвращаемом значении
Сообщить(Конт.Счет); // значение не меняется

Конт.Счет=СчетПоКоду("00");
Сообщить(Конт.Счет); // а так всё работает
369 АЛьФ
 
13.02.24
09:10
2(368) Метод УстановитьПеременнуюКонтекста() работает именно с переменными модуля, а не с реквизитами формы.
370 Chai Nic
 
13.02.24
09:20
(369) А как быть с реквизитами формы?
371 Chai Nic
 
13.02.24
09:23
+(370) Через "Значение" в атрибуте расширения формы не срабатывает тоже.
372 АЛьФ
 
13.02.24
09:24
2(371) А вот как раз должно бы было срабатывать. Я посмотрю.
373 Chai Nic
 
13.02.24
10:02
А кстати, почему-то не глобализована предопределенная процедура ОбработкаВыбораЗначения. Например, ПриНачалеВыбораЗначения в глобальнике цепляется нормально, в отличие от.
374 АЛьФ
 
13.02.24
10:28
2(373) Хороший вопрос. Следующий вопрос.

Из-за исторически сложившегося числового представления версии компоненты, максимальный номер сборки - 255. Чувствую, что такими темпами скоро перейдем к версии 2.0.6.
375 AAA
 
13.02.24
10:35
(374)а почему нельзя нумеровать просто + 1?
376 АЛьФ
 
13.02.24
10:55
2(375) Потому что числовой номер версии формируется, как шестнадцатиричное число. Сейчас 0х020005С2. Как дойдет до FF, перейдет в другой разряд.
377 Arbuz
 
13.02.24
17:16
На тему ОкноСообщений: получается, что в рамках одной процедуры нельзя изменять размеры окна и выводить в него сообщения/устанавливать строку. Установка строки не срабатывает, а если изменять размер, то у меня окно вообще не отрисовывается до конца работы 1С кода.
Может можно было бы сделать метод Сервису, который перерисовывал бы интерфейс, как при завершении потока пользовательского кода 1С, а потом продолжал код? По логике методы "ложного закрытия".

был такой оператор у васика DoEvents()

PS Изменение размера я делаю в ПриВыводеСообщения() и/или в Сервис.ОбработкаОжидания()
378 Злопчинский
 
13.02.24
17:27
(377) у меня вроде норм
.
Перем ОС;

//======================================================================
Процедура кнПоказать()
    ВыбЗнач =0; ВвестиЧисло(ВыбЗнач,"введи номер строки",10,0);
    ОС.ПоказатьСтроку(ВыбЗнач);
КонецПроцедуры // кнПоказать

//*******************************************
Процедура Сформировать()

    ОС.УстановитьКоординаты(100,100,200,700);
    Для ы=0 по 50 Цикл
        ОС.Сообщить(""+ы+": выполнено в Сформировать");
    КонецЦикла;
    Для ы=1 по 100000000 Цикл
    КонецЦикла;
    //Предупреждение("Ждем");
КонецПроцедуры
.
При этом цикл в Сформировать струячит, все строки выведены в ОС, при этом ОС - можно мышью таскаит/прикреплять - а цикл все струячит...
379 Arbuz
 
13.02.24
17:55
(378) Видимо у меня проблема в том, что изменение размеров происходят в событии ПриВыводеСообщения()
380 Злопчинский
 
13.02.24
18:17
(379) это ты сильно извратился...
381 АЛьФ
 
13.02.24
19:52
2(371) У меня устанавливается. Возможно, какие-то особые условия. Нужен тестовый пример.

2(373) А это глобальная проблема. Если нет в модуле локальной процедуры, то и глобальная не вызывается. Буду думать.
382 Злопчинский
 
13.02.24
20:07
(381) " Если нет в модуле локальной процедуры, то и глобальная не вызывается."
- это и других локальных касается? если да - то в ALS неплохо бы указать.
383 АЛьФ
 
13.02.24
20:12
2(382) Разбираюсь сейчас с этим моментом.
384 Злопчинский
 
13.02.24
21:42
(383) я вот ни разу бы не догадался что если нет локальной - то и глобальная не отрабатывает
385 trdm
 
13.02.24
21:47
(384) +++
386 АЛьФ
 
13.02.24
21:50
2(384) Пока нашел, что для трех процедур (ПриВыбореСтроки, ПриНачалеВыбораЗначения, ОбработкаВыбораЗначения) 1С сначала ищет их в модуле, а потом вызывает функцию исполнения предопределенной процедуры. Почему только для эти трех, а не для всех - великая загадка разработчиков 1С...
Причем в самой функции исполнения потом все равно опять проверяет их наличие в модуле.

Буду думать как обойти это недоразумение. Пока побеждает мысль при компиляции модуля виртуально добавлять эти функции, если их нет. Но не знаю каким боком это где-то еще может вылезти.
387 АЛьФ
 
13.02.24
22:06
+(386) О! Нашел способ проще.
388 Злопчинский
 
13.02.24
22:09
(387)
Уже топор занёс палач,
Толпа кричит ему...
389 АЛьФ
 
13.02.24
22:37
Что-то я уже совсем туго соображаю... Годы берут свое...

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

Тестовая сборка тут: https://disk.yandex.ru/d/SaGiKhu0fjokHw
390 Злопчинский
 
13.02.24
22:45
(389) Спокойствие, только спокойствие. Пусть будет утешением, что не только ты один туго соображаешь с годами...
391 Arbuz
 
14.02.24
14:43
(380) Ну, почему же извратился... Идея в том, что окно это скручивают до минимума и не смотрят, что там сыпется. Думалось, что при получении сообщения надо восстанавливать (менять) размер окна. Однако, видимо, в событии ПриВыводеСообщения() нельзя манипулировать окном сообщений, что не разу не изврат, а само собой напрашивающаяся потребность.
392 Arbuz
 
14.02.24
15:42
(378) Провёл некие эксперименты.
1) Ты попробуй убрать из своей Сформировать() ОС.УстановитьКоординаты() и сразу возможность перемещать окно, пока "струячит" твой цикл, пропадает, хотя всё отображается.
2) А если заранее Парковать(1) (не в Сформировать(), но в ней оставить УстановитьКоординаты()), то и будет поведение, которое я описывал.

Так что проблема не конкретно в ПриВыводеСообщения(), а в том, что паркованное окно не обновляется.
393 АЛьФ
 
14.02.24
15:50
Похоже, что критические проблемы новой сборки при работе в компании с перехватчиком. Выбивает напрочь.
394 Arbuz
 
14.02.24
15:58
(393) Может тогда и не надо транслировать события в глобальник — есть же "штатный" Перехватчик? Ну, или сделать трансляцию опционально включаемой?
395 Arbuz
 
14.02.24
16:01
Ещё, АЛьФ, пользуясь моментом, можно поправить часы в панели строки состояния?

396 Chai Nic
 
14.02.24
16:10
(394) Какой же это штатный.. это гемор со всякими там классами 1с++. В формексе удобнее так то. Лучше эту фичу сохранить, но сделать её опциональной.
397 АЛьФ
 
14.02.24
16:11
2(395) Как включается показ времени (через параметры или методом)?
398 АЛьФ
 
14.02.24
16:12
2(394) Если не получится подружить с перехватчиком, то сделаю включаемой. Дело в том, что в FormEx и раньше была эта трансляция для вызовов в доп.глобальниках. И все работало нормально. Но вот последние изменения что-то поломали.
399 Arbuz
 
14.02.24
16:14
(397) Через параметры
400 АЛьФ
 
14.02.24
16:19
2(399) У меня нормальная получается ширина. Судя по скрину, виндовая тянулка окна закрывает часть панели часов. Добавлю ширину по умолчанию.
401 Arbuz
 
14.02.24
16:23
(400) Даже в максимизированном окне такая же картина. Вин7
402 Злопчинский
 
14.02.24
17:18
Даёшь внедреж!
403 Злопчинский
 
14.02.24
19:20
(396) поддерживаю!
404 АЛьФ
 
14.02.24
20:48
Придется все же добавлять префикс к перенаправляемым процедурам. Иначе код перехватчика не нашел как обойти.
Префикс будет "Глобальная_" и "Global_". Это только для процедур, которые обрабатывает перехватчик: ПриОткрытии, ВводНового, ВводНаОсновании. Вроде как остальные и так работают нормально.
Если у кого-то есть возражения, то говорите сейчас либо молчите навеки.

Или все же для всех сделать префикс, чтобы единообразно было?...
405 Волшебник
 
14.02.24
20:50
(404) Что скажет Архитектура?
406 АЛьФ
 
14.02.24
21:03
2(405) Промолчит.
407 АЛьФ
 
14.02.24
22:21
Выложил тестовую сборку: https://disk.yandex.ru/d/SaGiKhu0fjokHw

Добавлены префиксы для предопределенных процедур.
Исправлена отрисовка окна сообщений после установки координат.
Расширена панель отображения времени.
408 Ёпрст
 
гуру
14.02.24
22:04
(404) Перехватчик, будет перехватывать ити глобальные процы ?..
Непонятно зачем, но так, на всякий

И еще, если создавть доп глобальник, например, в них будут отрабатывать эти "перенаправляемые процедуры" ?

Жалко клюшек нет, поиграться
409 АЛьФ
 
14.02.24
22:23
2(408) И перехватчик перехватывает, и перенаправление в глобальные работает.
Через доп.глобальники должно все проходить. Это дело не проверял, тупо лень, а на работе мы их не используем.
410 Злопчинский
 
14.02.24
22:42
(404) "Или все же для всех сделать префикс, чтобы единообразно было?..."
- я за этот вариант. ибо это проще, а то здесь играем, здесь не играм, здесь рыбка лежала...
411 Ёпрст
 
гуру
14.02.24
22:55
(409) Еще такой момент прояснить для себя:
после срабатывания Глобальная_ПриОткрытии(), потом будет вызов ПриОткрытии() той, что в форме объекта описана ?

ЗЫ: в перехватчике можно этим управлять просто было, вызывая или не вызывая оригинальное событие
412 АЛьФ
 
14.02.24
23:06
2(411) Да, потом будет вызов ПриОткрытии, которая в форме. Или, если сброшен статус возврата, то прерывается выполнение.
413 АЛьФ
 
14.02.24
23:06
2(410) Так в итоге и сделал.
414 Ёпрст
 
гуру
14.02.24
23:18
(412)
А..если универсально сделать, как в Перехватчике, из глобальной сделать вызов локальной, и по результатам или выполнить код ниже, или нет.
Ну, чтоб свой код в глобальной был бы
-перед
-вместо
-после

на выбор. Не ?
415 АЛьФ
 
14.02.24
23:20
2(414) Подумаю.
416 Ёпрст
 
гуру
14.02.24
23:40
(415) Эх, жалко нет клюшек в конторе, так бы тебе еще работы накидал, на год вперёд :)
417 Ёпрст
 
гуру
14.02.24
23:53
(415) Тему плавающих окошек, подзабросил ?
Было бы удобно прикреплять к форме вторую форму в нужном месте и сплиттер между ними.
418 Злопчинский
 
15.02.24
00:38
(412) "Да, потом будет вызов ПриОткрытии, которая в форме. Или, если сброшен статус возврата, то прерывается выполнение."
- если в глобальной Глобальная_ПриОткрытии будет СтатусВозврата(0) - то локальная ПриОткрытии - НЕ ВЫЗЫВАЕТСЯ и ФОРМА НЕ ОТКРЫВАЕТСЯ - так?
419 Chai Nic
 
15.02.24
08:54
(413) С учетом префикса, может тогда вернуть собственную глобализацию ОбработкаЯчейкиТаблицы и ПриУстановкеОтбора, которую убрали из-за конфликта со штатной?

С префиксом они не будут конфликтовать со стандартными обработчиками, а будут дополнять их. Иногда было бы полезно иметь Контекст в этих обработчиках, а штатные методы его не предоставляют.
420 АЛьФ
 
15.02.24
09:26
2(419) С процедурами, которые сами имеют глобализацию, есть другие проблемы. Не готов сейчас в это ввязываться. В этих процедурах контекст можно получить с помощью метода Сервис::АктивныйКонтекст.

2(417) Плавающие и прикрепляемые окна - это было две разные идеи. Но там не удалось в существующий функционал вписаться. Надо делать свою реализацию окон-родителей. Т.к. в практику у меня не пошло, так и забросил эту тему.

2(418) Так.
421 Chai Nic
 
15.02.24
09:59
(420) "В этих процедурах контекст можно получить с помощью метода Сервис::АктивныйКонтекст."
Понял, спасибо. Ну тогда действительно нет смысла.
422 Ёпрст
 
гуру
15.02.24
10:01
(420)

>>>2(418) Так.

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

Лучше сделать как в (414) чтоб был выбор.
423 АЛьФ
 
15.02.24
11:18
2(422) Думаю мысль, чтобы если глобальная - это функция, то возвращаемое этой функцией значение и задавало дальнейшее движение вызова.
424 АгентБезопасной Нацио
 
15.02.24
11:36
(422) (423) Но ведь если юзать перехватчик, то используя ВыполнитьОригинальноеСобытие - и делаешь как надо: "перед", "после" или "вместо"?
425 Chai Nic
 
15.02.24
11:40
(423) Да, хорошая идея. Не запрещено же в 1с вызывать функцию как процедуру.  Глобальная_*() можно сделать функциями, с возвращаемым значением, влияющем на.
426 Ёпрст
 
гуру
15.02.24
11:42
(424) да. Я и предлагал Алексею реализовать тоже самое.
427 АЛьФ
 
15.02.24
11:59
2(424)(426) Нынешний код вызова предопределенных процедур не заточен под такую работу.
Исходники выложены. Как раз их собираюсь на выходных обновить. Если кто-то реализует, то велком.
428 alyuev
 
15.02.24
13:12
(152) Всё работает замечательно! На 191й версии. Подробнее ответил тут - ПолучитьСтекВызова() в модуле класса#9
429 АЛьФ
 
15.02.24
15:10
2(428) На самом деле стек ломается, если идет переход через глобальные функции. Но это в самой 1С проблема с реализацией стека. Была даже мысль сделать свой стек. Но уж больно это заморочно получается с непонятной пользой. В принципе нынешнего исправления вполне хватает для повседневных задач. ИМХО.

+(407) Есть глюк с ПриЗавершенииРаботыСистемы. Если в ней поставить СтатусВозврата(0), то выскочит дополнительное окно "Ошибка при выполнении модуля! Завершить работу системы?". Возможно, где-то еще проявляется.
Вечером буду разбираться.
430 АЛьФ
 
15.02.24
21:02
Возвращаясь из той ветки.
Итак, решил сделать одним методом.
Сервис::УровеньТрассировки(НовыйУровень, ШаблонИмениФайла)
Возвращает уровень трассировки до выполнения метода.
Оба параметра необязательные.
НовыйУровень - число, которое задает устанавливаемый уровень, 0 - отключает трассировку.
ШаблонИмениФайла - задает имя файла, куда пишется трассировка. Если в имени есть [МоментЗапуска], то в этом месте прописывается момент времени начала выполнения кода. По умолчанию: КаталогИБ() + "\SYSLOG\Трассировка_[МоментЗапуска].txt"

Теперь вопрос. Какие уровни трассировки надо делать? Пока в голову приходит что-то типа:
1 - ид модуля, полное имя модуля, номер строки.
2 - добавляется текст строки
3 - добавляются значения переменных, которые доступны в текущий момент исполнения

Смущает, что уже третий уровень дает очень большую массу информации. Зачастую ненужной, которая будет дублироваться многократно.
Есть у кого-нибудь мысли как сделать трассировку максимально полезной и гибкой?
431 Волшебник
 
15.02.24
21:11
Меня вообще смущает вся ветка.
432 Злопчинский
 
15.02.24
21:12
ну, редко когда в тексте строки прямо много переменных...
по уровню 3 - выводить переменные используемые для текущей строки, если переменная типа СЗ/ТЗ - то возможно просто упоминание переменной без вывода значений (?)
.
может быть третий параметр - строковое значение с перечислением имен переменных, значения которых надо логировать (при входе и выходе из процедур/функций и/или при изменении значения такой переменной)
.
какие-то настроечные/инишные файлв не очень хорошо наверное использовать, но м.б. параметром имя файла со всякими настройками (продумать синтаксис настроек) типа тот же список переменных для логирования или имена процедур/функций для исклдчения из трассировки/логирования..?
433 Волшебник
 
15.02.24
21:13
(432) Не надо дурдома.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший