Извлечение текстов модулей из внешней обработки 1С

28.04.18

Разработка - Математика и алгоритмы

Лень в очередной раз сподвигла меня на доработку существующего инструментария. В публикации опишу свой опыт парсинга бинарного файла с данными обычной формы (выгруженного с помощью функционала платформы 1С "Выгрузить в файлы").

На этот раз, устав от добавления текстов модулей множества форм в обработке «Анализ процедур и функций», решил реализовать автоматическую загрузку этих модулей из выгруженных файлов (функционал платформы 1с «Выгрузить в файлы»).

 

 

Для внешней обработки формируется следующая структура каталогов.

Текст модуля обработки выгружается в файл «\Ext\ObjectModule.bsl«.

 

Тексты модулей управляемых форм — в файлы с расширением «.bsl«: «\Forms\НазваниеФормы\Ext\Form\Module.bsl«.

 

А вот обычные (не управляемые) формы выгружаются в следующие двоичные файлы: «\Forms\НазваниеФормы\Ext\Form.bin«.

 

Пришлось повозиться с парсингом этих бинарных файлов. Зато опробовал новую (для меня) возможность платформы работы с бинарными файлами

 

Файл с данными обычной формы представляет из себя бинарный файл с блоками данных.

 

Блоки разделены секциями, состоящими из 3-х 16-ричных чисел, оканчивающихся числом 7fffffff.

 

В процессе анализа некоторого количества обработок обнаружилось 2 варианта расположения блоков.

 

Вариант 1

 

Вариант 2

Первые 3 блока в моей выборке обработок всегда начинались с одних и тех же адресов :  00000012(hex) или 18(dec), 00000231(hex) или 561(dec), 00000270(hex) или 624(dec).

 

Я остановился на следующем алгоритме определения необходимой секции, содержащей код модуля формы.

Данный алгоритм был получен империческим путем и не может слепо использоваться в продуктивной разработке!

Если Вы владеете информацией по данному формату, буду рад увидеть Ваш комментарий к данной публикации :)

Итак…

Если последнее число 3-го блока = 7fffffff, считаю, что это первый вариант расположения блоков. В остальных случаях — второй вариант.

 

Для первого варианта

Начало блока с текстом модуля формы совпадает с началом 4-го блока (необходимо только пропустить секцию с 3-мя цифрами), т.е. это в 10-чной системе счисления: 691(начало 4-го блока) + 8*3(3 16-чных числа)  + 2(пробелы между числами).

Т.е. считаю, что это всегда 717 (dec)

Адрес окончания текстового блока — второе число секции из 3-х чисел + смещение на константу 000002D2(hex) или 722(dec).

Для случая, приведенного на скриншоте (см. выше) получаем:

551(dec) + 722(dec),

где 551(dec) это 00000227(hex)

 

Для второго варианта

Анализируем секцию из 3-х чисел блока 3.

Адрес начала блока с кодом 1С — второе число (к этому числу необходимо еще добавить смещение на константу 722(dec)  и размер секции из 3-х чисел  26(dec)).

Для случая, приведенного на скриншоте (см. выше) получаем:

127773(dec) + 722(dec) + 26(dec),

где 127773(dec) — это 0001F31D(hex)

Адрес окончания блока с кодом 1С — третье число.

Для случая, приведенного на скриншоте (см. выше) получаем:

471603(dec),

где 471603(dec) — это 00073233(hex)

 

Для чтения из двоичного файла написал процедуру:

Функция ПрочитатьИзФайла(ИмяФайла, Знач Адрес, Знач Размер)	

	МаксимальныйРазмерБуфера = 5000;	

	Результат = "";
	
	Файл = Новый ЧтениеДанных(ИмяФайла);
	Файл.Пропустить(Адрес);			
	Пока Размер > 0 Цикл
		
		ТекущийРазмер = Мин(Размер, МаксимальныйРазмерБуфера);

		РезультатЧтения = Файл.Прочитать(ТекущийРазмер);
		ЧтениеЧасти     = Новый ЧтениеТекста(РезультатЧтения.ОткрытьПотокДляЧтения(), "utf-8");
		
		Результат = Результат + ЧтениеЧасти.Прочитать();
		
		ЧтениеЧасти.Закрыть();
		
		Адрес = Адрес + ТекущийРазмер;
		Размер = Размер - ТекущийРазмер;
		
	КонецЦикла;
	Файл.Закрыть();		
		
	Возврат Результат;
	
КонецФункции // ПрочитатьИзФайла()

 

Ну в заключении, чтобы не «бегать» в конфигуратор для выгрузки обработки в файлы, добавил выгрузку с помощью пакетного запуска конфигуратора 1С с выводом на экран результата выполнения данной выгрузки:

 

Ссылка на обработку на infostart и на github

Cсылки к публикации:

infostart.ru/public/806807/

http://v8.1c.ru/o7/201602bin/index.htm

https://github.com/evgenylavelin/analysProcFunc

https://its.1c.ru/db/v8312doc/bookmark/dev/TI000001825

https://wonderland.v8.1c.ru/blog/razvitie-vygruzki-zagruzki-konfiguratsii-v-iz-xml/?sphrase_id=34313

ЧтениеТекста ЧтениеДанных ОткрытьПотокДляЧтения парсинг бинарный файл двоичный файл пакетный запуск конфигуратора

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

Математика и алгоритмы Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    1754    stopa85    12    

33

Алгоритм симплекс-метода для решения задачи раскроя

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    4419    user1959478    50    

34

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    7462    4    SpaceOfMyHead    17    

56

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    7855    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

Математика и алгоритмы Платформа 1С v8.3 Бесплатно (free)

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4446    fishca    13    

36

Интересная задача на Yandex cup 2021

Математика и алгоритмы Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    8839    John_d    73    

46

Механизм анализа данных. Кластеризация.

Математика и алгоритмы Анализ учета Платформа 1С v8.3 Анализ и прогнозирование Бесплатно (free)

Подробный разбор, с примером использования, встроенного механизма кластеризации 1С.

31.08.2021    7804    dusha0020    8    

70
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 28.04.18 20:32
Сообщение было скрыто модератором.
...
2. Evil Beaver 8107 29.04.18 11:37 Сейчас в теме
Кажется вы изобрели изобретенное, но все равно, уважуха
papche; adhocprog; pbazeliuk; JohnyDeath; dmpas; zenechka; binex; +7 Ответить
3. vikad 129 29.04.18 11:42 Сейчас в теме
(2) https://infostart.ru/public/250142/ имеется в виду это, да?
BigB; papche; adhocprog; zenechka; +4 Ответить
4. Evil Beaver 8107 29.04.18 11:49 Сейчас в теме
5. zenechka 542 29.04.18 12:27 Сейчас в теме
(2) Андрей, спасибо За Вашу труд.
Я "наподал" на него ранее, но, без практического примера в меня он "не зашел".
В частности, в нем не описано (либо я это проглядел) смещение на 722, которое участвует в определении адреса границы блока. Теперь я обязуюсь перечитать более внимательно Вашу публикацию, скорее всего обнаружу для себя то, на что не обратил внимание раньше.
К тому же, азарт самому разобрать эту головоломку сыграл свою роль в рождении данной публикации.
Мне кажется, эта статья плюс практический пример демонстрирующий реализацию описанного алгоритма не должны навредить читателю.
6. dmpas 417 29.04.18 22:47 Сейчас в теме
(5)
В частности, в нем не описано (либо я это проглядел) смещение на 722

Потому что нет "смещения на 722", есть таблица адресов, записанная первым файлом в контейнере - в этой таблице где-то написано это "722".

А за практическими примерами сюда: https://github.com/search?utf8=%E2%9C%93&q=v8unpack&type=
kirillkr; JohnyDeath; Evil Beaver; +3 Ответить
7. Evil Beaver 8107 30.04.18 09:45 Сейчас в теме
(5) Труд не мой, это просто компиляция в одном месте накопленного сообществом опыта. Но если уж вы делаете вытаскиватель модулей обычных форм, то сделайте его корректно, по документации иначе он где-нибудь упадет. (см. пояснение про 722 от @baton_pk ниже)
Оставьте свое сообщение