Img/xRom.gif Главная О сайте ROM-Mail Форум Статьи Программы OLAP Ссылки
на сайте на Народ.Ру на Яндексе


Проблема установки значения DSO-объектам из среды 1С и пути ее решения.

При использовании DSO (Decision Support Objects) из среды программы 1С:Предприятие 7.7 мы сразу же сталкиваемся с проблемой ограничений 1С при работе с OLE-объектами. Дело в том, что из среды 1С можно изменить/установить только свойства OLE-объекта, имеющие базовый тип (строка, число, дата). В случае же, если в качестве значения свойству необходимо установить ссылку на другой OLE-объект мы имеем проблему.

Рассмотрим следующий пример...

    // создаем объекты средствами DSO
    dso=СоздатьОбъект("DSO.Server");
    dso.Connect ("LocalHost");

    // создаем новую базу данных
    NewDatabase=dso.MDStores.AddNew("NewDatabase");

    // создаем новый источник данных
    NewDatasource=NewDatabase.DataSources.AddNew("NewDatasource");
    NewDatasource.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Program Files\Microsoft Analysis Services\Samples\FoodMart 2000.mdb;JET OLEDB:SFP=True;";
    NewDatasource.Update();

    // создаем новое измерение
    NewDimension=NewDatabase.Dimensions.AddNew("NewDimension");

До этого момента все шло вполне нормально. Но уже следующая строка вызовет исключительную ситуацию,
(DSO: Object doesn't support this action)
т.к. среда 1С не позволяет присвоить ссылку на объект
    NewDimension.Datasource=NewDatasource;

Суть проблемы заключается в "неумении" увеличить счетчик ссылок на объект, т.к. в 1С нет оператора подобного например, оператору Set в Visul Basic или аналогичных операторов в других языках программирования.

Обойти вышеизложенное ограничение 1С можно несколькими способами. Например, написать внешнюю компоненту, которая будет выполнять "правильное" присвоение значения или же реализовать задачу в другой программной среде (Visual Basic, Delphi, Visual C++). Однако, такое решение подойдет не всем, поэтому рассмотрим альтернативное решение проблемы. В качестве инструмента нам будут необходимы библиотеки V7Plus.dll от фирмы "1С", 1cpp.dll от Дмитрия Гусева aka Deb и класс "OLAPSupport" (описание, реализация) для 1С++ написанный мной.

    // создаем объекты средствами DSO
    dso=СоздатьОбъект("DSO.Server");
    dso.Connect ("LocalHost");

    // создаем новую базу данных
    NewDatabase=dso.MDStores.AddNew("NewDatabase");

    // создаем новый источник данных
    NewDatasource=NewDatabase.DataSources.AddNew("NewDatasource");
    NewDatasource.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Program Files\Microsoft Analysis Services\Samples\FoodMart 2000.mdb;JET OLEDB:SFP=True;";
    NewDatasource.Update();

    // создаем новое измерение
    NewDimension=NewDatabase.Dimensions.AddNew("NewDimension");
    //NewDimension.Datasource=NewDatasource;
    // предыдущая строка как мы уже знаем вызовет исключительную ситуацию,  поэтому пропустим установку атрибута
    NewDimension.FromClause="product";
    NewDimension.JoinClause="";
    NewLevel=NewDimension.Levels.AddNew("NewLevel");
    NewLevel.MemberKeyColumn = """product"".""brand_name""";
    NewLevel.ColumnSize = 255;
    NewLevel.EstimatedSize = 1;
    NewDimension.Update();

    // установим атрибут Datasource с помощью класса OLAPSupport
    dsoSupport=СоздатьОбъект("OLAPSupport");
    dsoSupport.Подключиться();
    Db=dsoSupport.ПолучитьОбъект("NewDatabase","Database",);
    Dimension=dsoSupport.ПолучитьОбъект("NewDimension","Dimension",Db);
    Dimension.ДобавитьСвойство("DataSource","NewDatasource");
    dsoSupport.Записать(Dimension);
 

Проверяем результат, атрибут успешно установлен.



1C:TOP-100 КЛУБ ПРОФЕССИОНАЛОВ 1С
Hosted by uCoz