Чем разобрать форму из текста Сервис.ПолучитьФормуОбъекта(ИмяФормы)?

Автор item, 17 июня 2025, 10:39

« назад - далее »

item

Как оказалось, платформа у меня валится не из-за парсера.
Дело в формексе.
Примитивный код
    СервисФорм = СоздатьОбъект("Сервис");
    СписокВсехФорм = СервисФорм.СписокВсехФорм();
    КоличествоФорм = СписокВсехФорм.КоличествоСтрок();
    Для НомерФормы = 1 По КоличествоФорм Цикл
        ИмяФормы = СписокВсехФорм.ПолучитьСтроку(НомерФормы);
        Состояние("..." + НомерФормы + "/" + КоличествоФорм + " " + ИмяФормы);
        Стрим = СервисФорм.ПолучитьФормуОбъекта(ИмяФормы);
    КонецЦикла;

приводит к тому, что все формы и меню начинают косо отображаться, при попытке открыть любую форму система выдает предупреждение "Failed to create empty", а при потере фокуса главное окно вообще не отвечает.

Прикрепил обработку с вышеуказанным кодом для теста.

Харлампий Дымба

Цитата: item от 09 июля 2025, 16:29Дело в формексе.
Не, Формекс не виновен. Запустил в типовой пустой торговле, ну дополнил само собой вызовами
ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+"1cpp.dll");//3.2.4.1
ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+"FormEx.dll");//2.5.0.198
Все отработало нормально, по 1000 форм пробежалась строка состояния и всё открывается потом.

item


Харлампий Дымба

Парсер спотыкается на формах у которых нет контролов. Типа начал делать форму элемента справочника, потом решил что буду "Редактировать в списке", а форма элемента осталась пустая без ничего - тогда parser.dll спотыкается и тянет потом за собой проблемы. То есть если в стриме попалось
{""Controls""}
то это неиспользуемая форма, и её надо убирать из списка форм. Тогда не будет проблем с парсингом, а соответственно падений при выходе. Ну или свой парсер использовать, раз уж он был сделан, а с parser.dll заморочка оказалась.

Что характерно - 1С встроено такие формы игнорит и не даст открыть форму без контролов - ни для справочника, ни для документа, ни для отчета/обработки. Ну это общеизвестно.

Харлампий Дымба

Цитата: item от 09 июля 2025, 17:05И память не кушает?
Ну тут не знаю - запустил пустую ТиС - 35 мегов, запустил обработку - стало 95. Вышел.

item

Цитата: Харлампий Дымба от 09 июля 2025, 17:07...Парсер спотыкается на формах у которых нет контролов...
То, что нет контролов, для парсера не проблема, просто формекс выдает для этих форм неформатный стрим, без первых двух символов "{""", и никакой парсер не разложит его с такой ошибкой.
Ситуация неоднозначная, Compaund показывает следующую картину:
префикс нормальной формы в DialogStream составляет три спецсимвола, а префиск ненормальной формы - один спецсимвол, причем формат "{}" стрима не нарушен. Похоже, что АЛьФ просто вырезает из стрима первые три символа, и в случае ненормальной формы у нас получается нарушение формата.
Лечится проблема легко, достаточно проверки стрима на первый символ "{", и форму можно пропускать.
Ну, или слёзно просить демиурга вернуться в строй.
Цитата
...Ну или свой парсер использовать, раз уж он был сделан, а с parser.dll заморочка оказалась...
Парсер - это громко сказано, я могу только разобрать текст по лексемам "{..}". Даже разбор горячих клавиш атрибутов у меня не очень правильный. А формат допускает использование любых символов в формулах, описаниях и подсказках атрибутов, в том числе и фигурных скобок.  Здесь я не знаю, как подступиться без регулярных выражений. Вк AddRE Иноземцева у меня не запустилась совсем, так что остается пока только parser.dll.

Прикрепил свой парсерок, без вк, узлы-лексемы не вложены, читать их надо с конца.

item

Цитата: Харлампий Дымба от 09 июля 2025, 17:15Ну тут не знаю - запустил пустую ТиС - 35 мегов, запустил обработку - стало 95. Вышел.

Похоже, что формекс как-то кэширует стримы при ПолучитьФормуОбъекта, повторные прогоны теста на получение всех форм быстрее на порядок, и память при этом уже не растёт.
Но первичная утечка не сопоставима с совокупным объемом всех стримов, пропорция ~ 6Мб/1Мб.

Может оно и к лучшему, кэш тоже хорошо, и нечего краш-тесты устраивать.