Кто-нибудь из знатоков 1С++ знает возможен ли сабж?
Обнаружилась проблема метода Сервис::ЗагрузитьВнешнююОбработку() при включенном ТурбоБЛ. Последний кэширует номера методов и при изменении на лету модуля обработки начинает вызывать всякие не те процедуры вместо тех.
Отключить ТубоБЛ (тут м.б. дернуть какой-то простой метод) и заново включить?
Цитата: Злоп от 11 апреля 2024, 19:47Отключить ТубоБЛ (тут м.б. дернуть какой-то простой метод) и заново включить?
Не помогает. Даже просто отключение не помогает до перезагрузки 1С.
Вроде делали Система.ОбновитьДанныеГК(Контекст) но работает или нет, в этом случае, я не в курсе.
Цитата: Djelf от 12 апреля 2024, 08:10Вроде делали Система.ОбновитьДанныеГК(Контекст) но работает или нет, в этом случае, я не в курсе.
У меня в Сервисе Артур делал такой метод, судя по его комментам в исходниках, как раз для такого обновления. Но не сработало. Попробую в 1С++ метод это найти.
Цитата: Djelf от 12 апреля 2024, 08:10Вроде делали Система.ОбновитьДанныеГК(Контекст) но работает или нет, в этом случае, я не в курсе.
Спасибо огромное! Помогло. Буду пытаться повторить код этого метода у себя при загрузке внешней обработки.
А вот в связи с этим глюком возник еще один концептуальный вопрос.
Получается, что при закрытии формы в 1С групповой контекст не уничтожается, а остается висеть в памяти. И при следующем открытии формы обработки подхватывается старый контекст, в котором просто инициализируются внутренние переменные.
Похоже, что я сейчас, при разработке функционала дополнительных кнопок в реквизитах, столкнулся с той же проблемой. Класс CGroupContext содержит массив объектов CRefContext, которые в свою очередь имеют свойство - ссылку на CBLContext. При уничтожении CGroupContext вызываются деструкторы CRefContext. В этом деструкторе уничтожается сам объект CRefContext, но не CBLContext, на который он ссылается. И получается, что CBLContext зависает в памяти.
Пока писал подумал, что что-то тут не вяжется. Если бы действительно групповой контекст не уничтожался, я бы на свою проблему не наткнулся бы. Значит проблема с ТурбоБЛ именно в его реализации - таблица методов строится по типу контекста и для разных объектов используется своя. А отсюда вырисовывается еще одна проблема: недостаточно будет для загружаемой внешней обработки вызвать ОбновитьДанныеГК, открытые ранее обработки этого вида начнут глючить.
Выхода пока не вижу. Только если восстанавливать умение сборки 1С++ и править ТурбоБЛ, чтобы общая таблица методов вида копировалась для каждого объекта этого вида.
Хорошо, что я не склонен к суициду...
После изучения исходников 1С++ родилось простейшее обходное решение проблемы ТурбоБЛ: опставить первым символом в модуле #. ТурбоБЛ воспринимает это, как загрузку модуля из файла и строит каждый раз карту методов заново. А 1С просто игнорирует этот символ.
Добавлю в свой метод ЗагрузитьВнешнююОбработку добавление этого символа в загружаемые объекты.
И надо будет это учитывать при планируемой разработке метода ЗагрузитьМодульОбънета.
Хотя забуду, конечно...
Если не разрушается CBLContext значит есть циклические ссылки, а их быть не должно
Цитата: trad от 12 апреля 2024, 10:46Если не разрушается CBLContext значит есть циклические ссылки, а их быть не должно
Насколько я вижу по IDA, в деструкторе CGroupContext идет в цикле вызов деструктора CRefContext для каждого элемента массива, а в деструкторе CRefContext тупо уходит в код базового деструктора CBLContext. А вот для ссылки CBLContext, хранимой в CRefContext, даже DecrRef() не вызывается.
Если я в групповой контекста добавляю свой контекст, то он зависает в памяти. Может другие контексты 1С как-то отдельно уничтожает, но сомнительно.
Сколько лет с семеркой вожусь, каждый раз нахожу что-то новое.
Нигде раньше не встречал, что вот такой модуль не дает синтаксической ошибки и нормально работает:
#Какой-то текст с пробелами
#Еще какой-то текст
#И еще много-много строк
Перем Сервис;
Процедура Сформировать()
КонецПроцедуры
в 1с++ это используется в модулях определении классов и в директивах препроцессора
Цитата: trad от 12 апреля 2024, 12:40в 1с++ это используется в модулях определении классов и в директивах препроцессора
Нет, там используется просто # для меток предварительного анализа модуля класса. Типа макросов, которые перед компиляцией модуля вычищаются. Т.е. обычный синтаксис-контроль дает в этом месте ошибку.
Я же о том, что штатный компилятор игнорирует строки с # в начале модуля.
Так и я про то что компилятор и синтакс контроль игнорирует строки на # и 1спп это использует для выражений описания классов и препроцессора
Нет. Ты что-то путаешь. Сам попробуй вставить что-то подобное не в самом начале модуля, а после объявления любой переменной, с начальной решеткой.
Так не получится!
Препроцессор Классов 1с++ работает через //# Команда и никак иначе.
АЛьФ, а это интересная находка, как бы теперь придумать как эту фичу можно использовать...
Цитата: АЛьФ от 12 апреля 2024, 12:56Я же о том, что штатный компилятор игнорирует строки с # в начале модуля.
тоже не знал...
капец, как говорится "век живи, век учись, всё равно дураком помрешь"
одно время турбоБЛ отдельно был, может там что полезного накопать можно
https://openconf.1cpp.ru/vk/turbobl/
там даже вот так уже ругается
//фигня
#хрень
Процедура Чтото()...
Если коммент с фигней убрать - то проходит...
Цитата: Djelf от 12 апреля 2024, 13:49Препроцессор Классов 1с++ работает через //# Команда и никак иначе.
Точно! //#
Лопухнулся, извините
Цитата: trad от 12 апреля 2024, 14:04Точно! //#
Лопухнулся, извините
.
"Я успел забыть больше чем вы знали!" ;-)
Цитата: Злоп от 12 апреля 2024, 13:57одно время турбоБЛ отдельно был, может там что полезного накопать можно
https://openconf.1cpp.ru/vk/turbobl/
Это сильно устарело, копать эти исходники смысла, imho, нет. В 1cpp они актуальнее.
Цитата: trad от 12 апреля 2024, 13:37Так и я про то что компилятор и синтакс контроль игнорирует строки на # и 1спп это использует для выражений описания классов и препроцессора
Игнорирует только в начале модуля. А 1С++ использует собственный механизм с # по всему модулю.
Запаздываю...
Цитата: АЛьФ от 12 апреля 2024, 11:01Если я в групповой контекста добавляю свой контекст, то он зависает в памяти. Может другие контексты 1С как-то отдельно уничтожает, но сомнительно.
А что будет если прогнать в цикле с мониторингом Система.Память(0)?
Я в тесте своей ВК curl1c использую такое, эта штука очень хорошо помогает найти изъяны...
Цитата: Djelf от 12 апреля 2024, 14:16Цитата: АЛьФ от 12 апреля 2024, 11:01Если я в групповой контекста добавляю свой контекст, то он зависает в памяти. Может другие контексты 1С как-то отдельно уничтожает, но сомнительно.
А что будет если прогнать в цикле с мониторингом Система.Память(0)?
Я в тесте своей ВК curl1c использую такое, эта штука очень хорошо помогает найти изъяны...
Попробую на выходных.
Цитата: Djelf от 12 апреля 2024, 14:16Цитата: АЛьФ от 12 апреля 2024, 11:01Если я в групповой контекста добавляю свой контекст, то он зависает в памяти. Может другие контексты 1С как-то отдельно уничтожает, но сомнительно.
А что будет если прогнать в цикле с мониторингом Система.Память(0)?
Я в тесте своей ВК curl1c использую такое, эта штука очень хорошо помогает найти изъяны...
Нужна пояснительная бригада. Что возвращает эта функция? С передачей аргумента 0 вообще никакой реакции. Если передать 1, то выдает информацию:
-- до открытия обработки
Heap( 0x00f90000 ): Used: 1104811 ( 11530 block(s) ); Overhead: 116005; Committed: 1679360; UnCommitted: 1589248
Heap( 0x01fd0000 ): Used: 0 ( 0 block(s) ); Overhead: 0; Committed: 4096; UnCommitted: 61440
-- внешняя обработка открыта
Heap( 0x00f90000 ): Used: 1128881 ( 11783 block(s) ); Overhead: 118583; Committed: 1679360; UnCommitted: 1589248
Heap( 0x01fd0000 ): Used: 0 ( 0 block(s) ); Overhead: 0; Committed: 4096; UnCommitted: 61440
-- внешняя обработка закрыта
Heap( 0x00f90000 ): Used: 1106607 ( 11544 block(s) ); Overhead: 116145; Committed: 1679360; UnCommitted: 1589248
Heap( 0x01fd0000 ): Used: 0 ( 0 block(s) ); Overhead: 0; Committed: 4096; UnCommitted: 61440
Это просто пустая обработка открывается/закрывается. Без какого-либо моего вмешательства в групповой контекст обработки.
Что значат эти цифры?
// funcMemInfo(флПоказыватьСообщения, битЗатребованнаяИнформация)
// флПоказыватьСообщения == [1 / 0]
// битЗатребованнаяИнформация == [бит 0: CRT Heap; бит 1: VTExtended Heap]
Система.Память(0) возвращает число, использую как-то так:
Состояние("Тест конвертера BASE64: "+ии+"/"+КоличествоПроходов+" Память: "+Система.Память(0));
Цитата: Djelf от 14 апреля 2024, 14:39Система.Память(0) возвращает число, использую как-то так:
Состояние("Тест конвертера BASE64: "+ии+"/"+КоличествоПроходов+" Память: "+Система.Память(0));
А что это число значит?
Если будет утечка, то этот показатель покажет что она есть.
У тебя же есть исходники, там не сложно...
Цитата: Djelf от 14 апреля 2024, 15:51Если будет утечка, то этот показатель покажет что она есть.
У тебя же есть исходники, там не сложно...
Или абсолютно бесполезная штука, или я чего-то не понимаю.
В конфигу загружена только 1С++, открываю/закрываю пустую внешнюю обработку:
До открытия:1008433
При открытой:1123628
После закрытия:1105506
Т.е. в любом случае присутствует утечка. Получается, утечку, вызываемую именно моим вмешательством, мне не отловить.
Тут я ничего определенного сказать не могу, я в своей ВК curl1c вроде (все) утечки таким образом нашел и устранил.
С обработками не понятно, если помнишь, в каждой обработке должна быть тз, хотя бы скрытая, иначе текут объекты gdi.
Циклическое открытие обработки снаружи в цикле без твоих финтов и с ними, теоретически должны совпадать по выделению памяти. В этом и была идея как это можно как-то отдетектить.
В целом методика понятна. Спасибо.
Но похоже 1С течет даже без каких-либо действий. Просто периодический вызов этого метода дает постепенно увеличивающуюся циферь.
Цитата: АЛьФ от 14 апреля 2024, 18:12В целом методика понятна. Спасибо.
Но похоже 1С течет даже без каких-либо действий. Просто периодический вызов этого метода дает постепенно увеличивающуюся циферь.
Да, я заметил что увеличивается, но иногда не очень сильно, а потом повторноно почти никак (с этим и боролся).
Сия тайна велика есть!
Ну и хрен с ним, главное чтобы не разбухало в геометрической прогресии...
З.Ы. в карлике я психанул количеством подобных тестов на утечки, норм, все проходит...