gifts2017

Распаковка CF на Lua

Опубликовал Борис Илов (ilov_boris) в раздел Программирование - Инструментарий

Модуль на Lua для чтения CF формата.

Элементарная реализация "читалки" файлов конфигураций 1С (cf, epf, erf)

Сделано по этому описанию:
Компонент для чтения CF-формата. Описание CF-формата.

При разработке подглядывал в исходный код Elisy.CfInspector и V8Unpack

Исходник модуля в открытом доступе: cf_reader.lua

Модуль экспортирует три функции: NewFileReader(file, buflen), NewStringReader(s) и ReadImage(rd)
Первые две создают ридеры над файлами и строками с единым интерфейсом: read(len), setpos(newpos), pos(), size()
ReadImage принимает ридер и возвращает объект Image: Header, Pages, Pointers, Rows()
Метод Image.Rows() возвращает итератор по элементам Row файла CF (см. описание формата)

Пример:
for ID, Body, Header, Packed in Image.Rows() do
    -- do something
end

ID - идентификатор данных в UTF-8 (строка)
Body - тело данных (строка)
Header - заголовок данных (объект)
Packed - признак упаковки алгоритмом DEFLATE (булево)

cf_reader не умеет распаковывать данные. Для этого нужно использовать сторонние библиотеки.

Вот пример с использованием zlibcf_unpack.lua 
Этот скрипт распаковывает конфигурацию в папку:
luajit.exe cf_unpack.lua c:\temp\1Cv8.cf c:\temp\1Cv8_cf\

Вот пример с использованием minizcf_repack.lua 
Этот скрипт переупаковывает конфигурацию в zip-архив:
luajit.exe cf_repack.lua c:\temp\1Cv8.cf c:\temp\1Cv8.zip

Примеры написаны для компилятора LuaJIT (используется ffi)

Для cf_reader доcтаточно интерпретатора Lua, но рекомендую все же использовать jit-компилятор.

Инструкция по установке:
1. Распакуйте LuaJIT_201.zip и 1c-toolkit.zip в одну папку (например c:\LuaJIT_201\)
2. Добавьте путь к этой папке в переменную среды PATH

Обновление 08.04.2013 Теперь утилиты можно установить с помощью удобного инсталлятора.


См. также

Подписаться Добавить вознаграждение

Комментарии

1. Александр Орефков (orefkov) 18.03.13 09:23
На чем еще осталось чтение цфников реализовать?
Питон, javascript и 1С ?
2. Борис Илов (ilov_boris) 18.03.13 09:53
(1) orefkov, на питоне было бы неплохо. Ибо в линуксах он обычно есть по дефолту. У Lua тоже есть движение в этом направлении http://www.linux.org.ru/news/bsd/8878745
3. andrewks 18.03.13 10:41
4. Андрей Комар (akomar) 18.03.13 12:10
5. Алексей Новиков (Новиков) 18.03.13 12:37
Круто. Полагаю тем, кто знает про луа - это пригодится.

Плюсую! Следующий должен как миниму на Ada 94 написать аналог. Или еще лучше - на GPSS.
ilov_boris; +1 Ответить
6. Борис Илов (ilov_boris) 18.03.13 12:48
7. Евгений Сосна (pumbaE) 18.03.13 12:56
(3) andrewks, у магистра попроси исходники http://infostart.ru/public/124213/ , думаю, он хорошему человеку не откажет.
8. Борис Илов (ilov_boris) 18.03.13 20:33
Поправил критическую ошибку в примере cf_unpack
Архив обновлен https://bitbucket.org/boris_coder/1c-toolkit/downloads
9. Иван Иванов (Famza) 19.03.13 09:14
(0) А меня сильно рассмешило сопоставление картинки из фильма и заголовка - наверное, именно так и делается чтение cf.
"+" за отличное настроение!!!
10. d@ncer (d@ncer) 04.04.13 09:11
Автор хорошо разбирается в LUA. Может и на QLUA поможете, что - нибудь написать?
11. Борис Илов (ilov_boris) 04.04.13 09:41
(10) d@ncer, я пока еще только изучаю Lua :) И во многом не разбираюсь. Эти публикации просто побочный продукт этого моего нового хобби.
Про QLUA первый раз слышу. Нужно смотреть.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа