Друзья, есть человеческий способ разобрать форму из этого текста,
чтобы получить свойства атрибутов формы, не открывая саму форму?
{"Dialogs",
{"Frame",
{"-11","0","0","0","400","0","0","0","204","1","2","1","34","MS Sans Serif","545","264","Счет","","","256","","1","1","6","28","-1","0","256",....
Где-то я видел, кажется, заголовочный файл с неполным описанием полей... вроде по разбору компаунда. Может на альтерпласте...
Хотел сам разобрать текст в списки значений аки json, но споткнулся на формулах атрибутов. Если формула содержит всякую хрень типа ?("""","""",""""), то ломается весь формат, и даже на глаз хрен определишь, на каком месте какой параметр.
Задача - немного упростить оформление ТабличныхПолей, положение колонки, быстрый выбор и т.д.
Я брал информацию здесь "Исходники GComp\Documentation\txt\DlgForms.txt"
Или нужен был код 1С, который разберет эту "шляпу" в другую "шляпу" ? :)
Вот это клад, большущее спасибо!
Осталось только разобрать эту шляпу в другую шлчяпу.)
Обидно.
Написал доморощенный парсерок для DialogStream, als, lst, spl и прочего,
а сегодня нашел охрененную штуку parser.dll.
//Кто знает автора сей замечательной кувалды?
Автор Тельнов Виктор.
Вопрос снят.
parser.zip (https://disk.yandex.by/d/tLJZs6wD6UMYFw)
als присутствует.
Цитата: item от 01 июля 2025, 21:06parser.zip (https://disk.yandex.by/d/tLJZs6wD6UMYFw)
als присутствует.
ссылку и примеров бы...
Страница автора (https://telnov-vs.narod.ru/parser.html)
Пример (https://infostart.ru/1c/tools/64999/) я не рассматривал, там регулярные выражения, только узнал, что есть такая вк.
По сабжу достаночно методов ParserRecursiveList и ParserRecursiveListFromFile, работает быстро, разбирает все что можно, даже гиговые cfg.
У меня в процессе класс "МетаФорма", на базе Структуры,
метод пока один:
"УстановитьФорму(<ИмяФормы>)",
свойства:
"<ИмяСвойства>" - свойство формы, напр. "МетаФорма.РежимСохраненияНастройки"
"Атрибуты" - коллекция контролов-атрибутов формы, АссоциативныйВектор,
"Колонки" - коллекция колонок многострочной части, АссоциативныйВектор,
"Слои" - коллекция слоёв формы, АссоциативныйВектор,
Атрибут, Колонка, Слой - элементы коллекций, тип Структура, содержат собственные свойства,
в случае, если элемент идентифицирован, ессесно можно обращаться к нему в модуле по идентификатору, напр. "МетаФорма.Атрибуты.МногострочнаяЧасть.ПорядокОбхода" или "МетаФорма.Колонки.НомерСтроки.Ширина".
пока всё сыро, не обработаны размеры шрифтов, не продуманы наименования и типы свойств элементов.
файлы прикреплены
На некоторых формах parser.dll спотыкается - вот это бы в попытку наверное обернуть
Узлы = Парсер.ParserRecursiveList(Стрим);
Пример проблемы:
Ошибка синтаксиса рекурсивного списка
_ИмяФормы:
СПРАВОЧНИК.МЕСТАХРАНЕНИЯ.ФОРМА
ОписаниеОшибки():
Ошибка при выполнении метода объекта компоненты C:\Users\User\Desktop\Новая папка\parser.dll
Стрим:
Dialogs",
{"Frame",
{"-11","0","0","0","400","0","0","0","204","1","2","1","34","MS Sans Serif","260","142"," ","","","0","","1","1","6","29","-1","0","0",
{"0",
{"Основной","1"}},"1","1"}},
{"Controls"},
{"Cnt_Ver","10001"}}
Цитата: Харлампий Дымба от 09 июля 2025, 14:37На некоторых формах parser.dll спотыкается - вот это бы в попытку наверное обернуть...
Уже обернул , и добавил простую проверку на первый символ "{" в стриме.
Похоже, что из-за ошибки разбора строки parser.dll подвешивает процесс 1сv7...
Утечка памяти сумачечшая, не помогает обнуление коллекций, и с системой после выполнения хрень творится, формы и меню отображаются наполовину, хз что такое.
Цитата: item от 09 июля 2025, 14:58Утечка памяти сумачечшая, не помогает обнуление коллекций, и с системой после выполнения хрень творится, формы и меню отображаются наполовину, хз что такое.
Это про класс или про parser.dll?
Если про класс - то штука офгинно интересная. Собирать формы мне не нужно, а вот разбор очень пригодится для инспекции.
Если про parser.dll то
Цитата: item от 09 июля 2025, 14:55Похоже, что из-за ошибки разбора строки parser.dll подвешивает процесс 1сv7...
с этим согласен. Сейчас отпишусь MWWRuza в (соседнюю тему (https://forum.dorex.pro/index.php?topic=233.0))
Как оказалось, платформа у меня валится не из-за парсера.
Дело в формексе.
Примитивный код
СервисФорм = СоздатьОбъект("Сервис");
СписокВсехФорм = СервисФорм.СписокВсехФорм();
КоличествоФорм = СписокВсехФорм.КоличествоСтрок();
Для НомерФормы = 1 По КоличествоФорм Цикл
ИмяФормы = СписокВсехФорм.ПолучитьСтроку(НомерФормы);
Состояние("..." + НомерФормы + "/" + КоличествоФорм + " " + ИмяФормы);
Стрим = СервисФорм.ПолучитьФормуОбъекта(ИмяФормы);
КонецЦикла;
приводит к тому, что все формы и меню начинают косо отображаться, при попытке открыть любую форму система выдает предупреждение "Failed to create empty", а при потере фокуса главное окно вообще не отвечает.
Прикрепил обработку с вышеуказанным кодом для теста.
Цитата: item от 09 июля 2025, 16:29Дело в формексе.
Не, Формекс не виновен. Запустил в типовой пустой торговле, ну дополнил само собой вызовами
ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+"1cpp.dll");//3.2.4.1
ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+"FormEx.dll");//2.5.0.198
Все отработало нормально, по 1000 форм пробежалась строка состояния и всё открывается потом.
Парсер спотыкается на формах у которых нет контролов. Типа начал делать форму элемента справочника, потом решил что буду "Редактировать в списке", а форма элемента осталась пустая без ничего - тогда parser.dll спотыкается и тянет потом за собой проблемы. То есть если в стриме попалось
{""Controls""}
то это неиспользуемая форма, и её надо убирать из списка форм. Тогда не будет проблем с парсингом, а соответственно падений при выходе. Ну или свой парсер использовать, раз уж он был сделан, а с parser.dll заморочка оказалась.
Что характерно - 1С встроено такие формы игнорит и не даст открыть форму без контролов - ни для справочника, ни для документа, ни для отчета/обработки. Ну это общеизвестно.
Цитата: item от 09 июля 2025, 17:05И память не кушает?
Ну тут не знаю - запустил пустую ТиС - 35 мегов, запустил обработку - стало 95. Вышел.
Цитата: Харлампий Дымба от 09 июля 2025, 17:07...Парсер спотыкается на формах у которых нет контролов...
То, что нет контролов, для парсера не проблема, просто формекс выдает для этих форм неформатный стрим, без первых двух символов "{""", и никакой парсер не разложит его с такой ошибкой.
Ситуация неоднозначная, Compaund показывает следующую картину:
префикс нормальной формы в DialogStream составляет три спецсимвола, а префиск ненормальной формы - один спецсимвол, причем формат "{}" стрима не нарушен. Похоже, что АЛьФ просто вырезает из стрима первые три символа, и в случае ненормальной формы у нас получается нарушение формата.
Лечится проблема легко, достаточно проверки стрима на первый символ "{", и форму можно пропускать.
Ну, или слёзно просить демиурга вернуться в строй.
...Ну или свой парсер использовать, раз уж он был сделан, а с parser.dll заморочка оказалась...
Парсер - это громко сказано, я могу только разобрать текст по лексемам "{..}". Даже разбор горячих клавиш атрибутов у меня не очень правильный. А формат допускает использование любых символов в формулах, описаниях и подсказках атрибутов, в том числе и фигурных скобок. Здесь я не знаю, как подступиться без регулярных выражений. Вк AddRE Иноземцева у меня не запустилась совсем, так что остается пока только parser.dll.
Прикрепил свой парсерок, без вк, узлы-лексемы не вложены, читать их надо с конца.
Цитата: Харлампий Дымба от 09 июля 2025, 17:15Ну тут не знаю - запустил пустую ТиС - 35 мегов, запустил обработку - стало 95. Вышел.
Похоже, что формекс как-то кэширует стримы при ПолучитьФормуОбъекта, повторные прогоны теста на получение всех форм быстрее на порядок, и память при этом уже не растёт.
Но первичная утечка не сопоставима с совокупным объемом всех стримов, пропорция ~ 6Мб/1Мб.
Может оно и к лучшему, кэш тоже хорошо, и нечего краш-тесты устраивать.