Вышла первая версия бесплатного .Net-компонента Elisy.CfInspector для чтения CF-формата, совместимого с форматом 1С-конфигураций и внешних обработок. Для использования требуется .Net framework 4.0.
Вы можете ознакомиться с описанием CF-формата здесь.
Хотя использовать компонент можно из 1С при помощи компонента Elisy .Net Bridge, но максимальный эффект будет получен при использовании из .Net-проектов.
Для использования необходимо создать подходящий проект в Visual Studio. Добавить ссылку на сборку Elisy.CfInpector.dll. При необходимости вставить директиву:
using Elisy.CfInspector;
Пример обращения к компоненту:
var stream = new FileStream(@"D:\228\1Cv8.cf", FileMode.Open, FileAccess.Read, FileShare.Read);
Image image = ImageReader.ReadImageFrom(stream);
В результате вызова ReadImageFrom произойдет создание объекта типа Image. Image содержит несколько свойств, самым полезным из которых является Rows. Rows возвращает массив объектов ImageRow[]. Это и есть содержимое файла, записанного в формате CF. ImageRow определяет несколько свойств: Id – идентификатор данных, BodyRawData – тело в виде массива данных, Body – распознанное содержимое, которое может принимать типы: String, Image, byte[]. BodyType определяет тип данных:
- CompressedUtf8MarkedString – сжатая строка;
- CompressedImage – сжатый объект составного типа;
- Utf8MarkedString – несжатая строка;
- CompressedMoxcel – сжатый объект Moxcel;
- Unknown – неизвестный тип.
Пример простого запроса к свойству Row – получить все данные с составным типом:
var request = from ir in image.Rows
where ir.BodyType == ImageRowTypes.CompressedImage
select ir;
var array = request.ToArray();
В .Net framework 4 есть достойная фича: Parallel LINQ. Используя параллельные вычисления, запрос можно выполнить значительно быстрее. Достаточно воспользоваться конструкцией AsParallel():
var request = from ir in image.Rows.AsParallel()
where ir.BodyType == ImageRowTypes.CompressedImage
select ir;
var array = request.ToArray();
Вот еще несколько примеров запросов:
Выбрать все макеты:
var request = from ir in image.Rows.AsParallel()
where ir.BodyType == ImageRowTypes.CompressedMoxcel
select new { a = ir.Id, b = Convert.ToString(ir.Body) };
var array = request.ToArray();
Выбрать все основные объекты:
var request = from ir in image.Rows.AsParallel()
where !ir.Id.Contains('.')
select new { a = ir.Id, b = Convert.ToString(ir.Body) };
var array = request.ToArray();
Найти корневой элемент:
var request = from ir in image.Rows.AsParallel()
where ir.Id == "root"
select ir.Body as string;
var root = request.FirstOrDefault();
Желаем успехов в экспериментах.
Отзывы принимаются здесь.
CfInspector.zip (4.21 kb)