Статьи‎ > ‎

GameWithFire

GameWithFire (игра с огнем) -  это библиотека вспомогательных классов для 1С:Предприятия 8.x. Исполнена по стандарту внешних компонент 1С:Предприятия.
История библиотеки начиналась весьма просто, это была попытка ускорить перебор строк для формирования таблицы значений из RecordSet. Однако такая простая и функциональная вещь оказалась очень востребована, что и позволяет развиваться данной компоненте уже более 2.5 лет.

GameWithFire использует библиотеки С++ 2005.
После того как библиотеки установлены необходимо выполнить регистрацию
GameWithFire.dll  в реестре regsvr32.


Описание

Компонента состоит из следующих классов.

ProgIDИмя типа объекта 1СОписание
GameWithFire.ADOUtils AddIn.ADOUtils Объект предназначен для сервисных процедур для работы с Microsoft Active Data Objects (ADO). Распаковывает и запаковывает служебные данные 1С 
GameWithFire.V8Storage AddIn.V8Storage Объект работает с контейнером данных используемым 1С. Позволяет формировать контейнер и получать элементы контейнера 
Показывать 2 элементов со страницы Классы, отсортированных по по времени изменения. Дополнительно »

ПодключитьВнешнююКомпоненту("GameWithFire.ADOUtils");
ADOUtils
= Новый("AddIn.ADOUtils");
ПодключитьВнешнююКомпоненту
("GameWithFire.V8Storage");
V8Storage
= Новый ("AddIn.V8Storage");
Примечание: загружать компоненту методом ЗагрузитьВнешнююКомпоненту невозможно. Для использования компоненты необходимо наличие библиотеки Zlib1.dll (например рядом с библиотекой GameWithFire.dll).

Свойства

Класс/ОбъектИмяТипОписаниеЧтениеЗапись
AddIn.V8Storage Items V8StorageItems Коллекция потоков хранилища   
AddIn.ADOUtils Перечисления / Enums COM объект Возвращает объект, одноименными свойствами которого, являются объекты перечислений из библиотеки типов ADO.   
AddIn.ADOUtils ДвоичныеДанныеВВидеСтрок Булево Представление двоичных данных в виде строк с шестнадцатиичной записью массива батов   
V8Stream FileName Строка Имя потока в хранилище   
V8Stream Modified Свойства Дата изменения потока в хранилище   
V8Stream Creation Дата Дата создания потока в хранилище   
V8Stream Аttributes Свойства Дополнительные атрибуты    
AddIn.ADOUtils YearOffset Число, Неопределенно Определяет смещение дат в годах для результатов запроса. Доступные значение Неопределенно,0,2000   
AddIn.ADOUtils BinaryDataAs1C Булево Определяет необходимость преобразования двоичных данных в формат 1С   
Показывать 9 элементов со страницы Свойства, отсортированных по по времени изменения. Дополнительно »

Методы


Класс/ОбъектИмяОписаниеПараметрыВозвр. значение
AddIn.ADOUtils InflateToString Получает распакованную строку из поля содержащего двоичные данные ADOFiled - тип: COM объект ADOFieldObject. Поле данных, выборки результата запроса Строка 
AddIn.ADOUtils InflateToFile Выгружает и распаковывает двоичные данные из поля в файл. ADOFiled - тип: COM объект ADOFieldObject. Поле данных, выборки результата запроса ИмяФайла - тип: Строка. Имя файла, в который будут распакованы данные, если файл не существует он будет создан.  
AddIn.ADOUtils ADORecordsetВТаблицуЗначений Метод создает новую таблицу значений с колонками соответствующими колонкам переданного набора записей. И переносит содержимое набора записей в таблицу значений.. ADORecordset - тип: COM объект ADORecordset. ТаблицаЗначений. Новая таблица значений заполненная данными набора записей. 
AddIn.ADOUtils DefateFromFile Упаковывает файл, и помешает результат в ADOFiled ADOFiled - тип: COM объект ADOFieldObject. Поле данных или параметр, запроса Строка - тип: Имя файла подлежащего упаковке. Число. Размер упакованных данных 
AddIn.ADOUtils DefateFromString Упаковывает строку, и помешает результат в ADOFiled. ADOFiled - тип: COM объект ADOFieldObject. Поле данных или параметр, запроса Строка - тип: Строка, которую необходимо упаковать. Число. Размер упакованных данных. 
AddIn.ADOUtils ADORecordsetВРезультатЗапроса Позволяет получить объект типа РезультатЗапроса для набора данных. Реализован с помощью объекта ПостроительЗапроса. ADORecordset - тип: COM объект ADORecordset. Набор записей - источник данных. Итоги - тип: Строка. Строка описания итогов (ресурсов и измерений) для результата запроса. Необязательный. По-умолчанию - пустая строка. РезультатЗапроса 
AddIn.V8Storage Close Закрывает, ранее открытый файл хранилища ИмяФайла - тип: Строка. Имя файла, в котором находится хранилище формата 1С.  
AddIn.V8Storage Open Открывает файл хранилища ИмяФайла - тип: Строка. Имя файла, в котором находится хранилище формата 1С  
V8StorageItems Count Возвращает количество потоков в коллекции  Число 
V8StorageItems Get Получает поток хранилища по имени. ЗаголовокПотока - тип: Строка. Имя потока, в хранилище. V8Streаm 
V8StorageItems Add  Создает(добавляет) новый поток в хранилище ЗаголовокПотока - тип: Строка. Имя потока. V8Streаm 
V8StorageItems Delete Удаляет поток из хранилища. ЗаголовокПотока - тип: Строка. Имя потока, в хранилище.  
V8Stream GetDataToString Получает строку из текущего потока. Inflate - тип: Булево. Определяет необходимость распаковки данных. Строка 
V8Stream GetDataToFile Выгружает поток в файл ИмяФайла - тип: Строка. Имя файла, в который будут выгружен поток. Inflate- тип: Булево. Определяет необходимость распаковки данных.   
V8Stream PutDateFromString Помещает строку в поток Строка - тип: Строка, которую необходимо упаковать. Deflate - тип: Булево. Определяет необходимость упаковки данных. Число. Размер потока. 
V8Stream PutDateFromFile Помещает файл в поток Строка- тип: Имя файла, который нужно поместить в поток. Deflate - тип: Булево. Определяет необходимость упаковки данных. Число. Размер потока. 
AddIn.ADOUtils InflateData Получает данные распакованной записи. Данные представляют собой "сырые" байты - никак не обработанные, а только распакованные. Необходим для определения того, что содержит в себе запись. ADOFiled - тип: COM объект ADOFieldObject. Поле данных, выборки результата запроса ЧислоБайт - тип: Число. Количество бат которые нужно получить с начала файла. Необязательный.  COMSafeArray типа VT_UI1 с одним измерением 
AddIn.ADOUtils DefateData Упаковывает содержимое массива байтов, и помешает результат в ADOFiled. ADOFiled - тип: COM объект ADOFieldObject. Поле данных или параметр, запроса МассивБайт - тип: COMSafeArray типа VT_UI1 с одним измерением. Байты данных для запаковки. Число. Размер упакованных данных 
V8Stream GetData Получает массив данных текущего потока. Необходим для определения того что содержит в себе поток Inflate тип: Булево. Определяет необходимость распаковки данных. ЧислоБайт - тип: Число. Количество байт, которые нужно получить с начала потока.  COMSafeArray типа VT_UI1 с одним измерением. 
V8Stream PutData На основе массива байтов формирует поток. Deflate - тип: Булево. Определяет необходимость упаковки данных. МассивБайт - тип: COMSafeArray типа VT_UI1 с одним измерением. Число. Размер потока 
AddIn.ADOUtils GetUsersFile Получает распакованную строку из поля содержащего двоичные данные описывающих пользователей ADOFiled - тип: COM объект ADOFieldObject. Поле данных запроса (SELECT BinaryData FROM dbo.Params WHERE FileName = 'user.usr') Строка 
AddIn.ADOUtils PutUsersFile Сохраняет строку в формат двоичных данных описывающих пользователей ADOFiled - тип: COM объект ADOFieldObject. Поле данных (SELECT BinaryData FROM dbo.Params WHERE FileName = 'user.usr') или параметр запроса Строка - тип: Строка, которую необходимо записать. Число. Размер упакованного поля в байтах 
AddIn.ADOUtils V8DateToDBDate Преобразовывает дату из формата 1С в формат СУБД MSSQL с учетом смещения дат (установленного свойства YearOffset)  Дата Дата 
Показывать 23 элементов со страницы Методы, отсортированных по по времени изменения. Дополнительно »

Примеры использования

Получение результатов запроса

ПодключитьВнешнююКомпоненту("GameWithFire.ADOUtils");
ADOUtils = Новый("AddIn.ADOUtils");
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open("Provider=sqloledb;Server=MyServer;Database=MyDatabase;Trusted_Connection=yes;");
Recordset = Connection.Execute("select * from MyTable (nolock)");
ТЗ = ADOUtils.ADORecordsetToValueTable(Recordset);
ТЗ.ВыбратьСтроку();

Получение записи конфигурации

ПодключитьВнешнююКомпоненту("GameWithFire.ADOUtils");
ADOUtils = Новый("AddIn.ADOUtils");
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open("Provider=sqloledb;Server=MyServer;Database=MyDatabase;Trusted_Connection=yes;");
RecSetRead=Connection.Execute("Select BinaryData from Config Where FileName='"+Ключ+"'");
Если RecSetRead.State=1
        И RecSetRead.RecordCount>0 Тогда
   МассивБайт = ADOUtils.InflateData(RecSetRead.Fields(0), 4).Выгрузить();
   СимволыМаркера=""+МассивБайт[0]+ МассивБайт[1]+МассивБайт[2]+ МассивБайт[3];
   RecSetRead.MoveFirst(); //это для того чтобы внутренее состояние объекта ADODB.Recordset изменилось и мы могли         снова получать данные длинного поля, т.к. один раз мы его уже получили выше методом ADOUtils.InflateData
Если Лев(СимволыМаркера,9)="239187191" Тогда
//Строковые данные
Содержание=ADOUtils.InflateToString(RecSetRead.Fields(0));
ИначеЕсли СимволыМаркера="77798867" Тогда
//MXL
ADOUtils.InflateToFile(RecSetRead.Fields(0), ИмяФайла);
Файл=Новый Файл(ИмяФайла);
ИначеЕсли СимволыМаркера="255255255127" Тогда
//Внутренее хранилище
ADOUtils.InflateToFile(RecSetRead.Fields(0), ИмяФайла);
Файл=Новый Файл(ИмяФайла);
ПодключитьВнешнююКомпоненту("GameWithFire.V8Storage");
V8Storage
= Новый ("AddIn.V8Storage");
V8Storage.Open(ИмяФайла);
Для каждого Item из V8Storage.Items Цикл
    МассивБайт = Item.GetData(Ложь, 4).Выгрузить();
    СимволыМаркера=""+МассивБайт[0]+ МассивБайт[1]+МассивБайт[2];
    Если Лев(СимволыМаркера,9)="239187191" Тогда
    //на данном уровне только строковые данные
       ТекстДок=Новый ТекстовыйДокумент;
                    ТекстДок.УстановитьТекст(Item.GetDataToString(Ложь));

    КонецЕсли;
КонецЦикла;
V8Storage.Close();
КонецЕсли;
КонецЕсли;

Сохранение записи конфигурации

ПодключитьВнешнююКомпоненту("GameWithFire.ADOUtils");
ADOUtils
= Новый("AddIn.ADOUtils");

Connection
= Новый COMОбъект("ADODB.Connection");
Connection.Open("Provider=sqloledb;Server=MyServer;Database=MyDatabase;Trusted_Connection=yes;");

RecSet=Новый COMОбъект("ADODB.Recordset");
RecSet.Open("Select DataSize,Modified,BinaryData From Config WHERE FileName='"+СтруктураЗаписи.Ключ+"'",Connection,1,3);//3 разрешаем Update обычно 3,1

RecSet
.Fields("Modified").Value=ТекущаяДата();
Если ТипЗнч(Данные)=Тип("Строка") ТОгда
        RecSet.Fields("DataSize").Value=ADOUtils.DeflateFromString(RecSet.Fields("BinaryData"),Данные);
ИначеЕсли ТипЗнч(Данные)=Тип("Файл") Тогда
    RecSet.Fields("DataSize").Value=ADOUtils.DeflateFromFile(RecSet.Fields("BinaryData"),Строка(Данные.ПолноеИмя));
КонецЕсли;
RecSet.Update();
RecSet.Close();

Создание потока

ПодключитьВнешнююКомпоненту("GameWithFire.V8Storage");
V8Storage
= Новый ("AddIn.V8Storage");
V8Storage
.Create(ИмяФайлаНовойФормы);
    Данные
= V8Storage.Items.Add("form");
    Данные
.PutDataFromString(ТекстовыеДанныеФормы,Ложь);
    Данные
= V8Storage.Items.Add("module");
    Данные
.PutDataFromString(ТекстМодуля,Ложь);
V8Storage
.Close();




Авторы

Дмитрий Ощепков (Киров) разработчик 1С++ и Ei
Кудяков Герман (Санкт-Петербург) автор Ei

в работе подглядывали исходники v8Unpack Дениса Демидова (Санкт-Петербург)


Подстраницы (3): Классы Методы Свойства
Comments