Снегопат
https://snegopat.ru/forum/

Как юзать интерфейс для чтения списков IDataSource ?
https://snegopat.ru/forum/viewtopic.php?f=1&t=251
Страница 1 из 1

Автор:  artbear [ 10 сен 2012, 07:03 ]
Заголовок сообщения:  Как юзать интерфейс для чтения списков IDataSource ?

Цитата:
1.2.0.2 - Добавлен программный интерфейс для чтения различных списков во внутренних формах 1С.

IDataSource, верно?
Саш, приведи, пожалуйста, пример работы с новым интерфейсом!
например, для какого-нибудь системного окна Конфигуратора

Автор:  orefkov [ 10 сен 2012, 08:26 ]
Заголовок сообщения:  Re: Как юзать интерфейс для чтения списков IDataSource ?

Вот небольшой пример, как обойти грид с деревом метаданных.
Для простоты фокус должен быть на окне конфигурации
Код:
function walkDS(parentRow, level)
{
    for(var row = parentRow.firstChild; row; row = row.next)
    {
        var value = row.getCellValue(0)     // Value есть не всегда, многие источники просто задают текст в оформлении ячейки
        var ca = row.getCellAppearance(0)   // Либо наоборот, некоторые источники не задают оформление, а просто возвращают value
        Message(level + ca.text, ca.picture)
        walkDS(row, level + " ")    // Обойдем дочерние строки
    }
}

function macrosЗапуститьТест()
{
    // Фокус должен стоять в окне конфигурации
    var form = windows.getActiveView().getInternalForm()
    if(form)
    {
        var ctr = form.getControl(0)    // Получаем грид - дерево метаданных
        walkDS(ctr.dataSource.root, "")
    }
}

Автор:  orefkov [ 10 сен 2012, 08:29 ]
Заголовок сообщения:  Re: Как юзать интерфейс для чтения списков IDataSource ?

Пока можно просто перебрать источник данных.
Позже добавлю интерфейс для работы с самим гридом - перебрать колонки, свернуть/развернуть узлы и тд и тп.

Автор:  artbear [ 13 сен 2012, 07:47 ]
Заголовок сообщения:  Re: Как юзать интерфейс для чтения списков IDataSource ?

orefkov писал(а):
Вот небольшой пример, как обойти грид с деревом метаданных.
Код:
function walkDS(parentRow, level)
{
    for(var row = parentRow.firstChild; row; row = row.next)
    {
        var value = row.getCellValue(0)     // Value есть не всегда, многие источники просто задают текст в оформлении ячейки
        var ca = row.getCellAppearance(0)   // Либо наоборот, некоторые источники не задают оформление, а просто возвращают value
        Message(level + ca.text, ca.picture)
        walkDS(row, level + " ")    // Обойдем дочерние строки
    }
}


В добавление к твоему код использую следующий код для анализа модальных окон
Код:
//{ Анализ модальных окон
SelfScript.self['macrosВключить анализ модальных окон'] = function() {
 events.connect(windows, "onDoModal", SelfScript.self, "AnalyseModalWindow");
}

SelfScript.self['macrosОтключить анализ модальных окон'] = function() {
      events.disconnect(windows, "onDoModal", SelfScript.self, "AnalyseModalWindow")
}

function AnalyseModalWindow(dlgInfo)
{
   if(dlgInfo.stage == openModalWnd)
   {
      Message("dlgInfo.Caption = <"+dlgInfo.Caption+">");
      for(var c = 0; c < dlgInfo.form.controlsCount; c++)
      {
         var ctr = dlgInfo.form.getControl(c)
         Message("  name  <"+ctr.name + "> , id  <" + ctr.id + ">, value <" + ctr.value+">")

         if (ctr.dataSource && ctr.dataSource.root){
             try{
                   walkDS(ctr.dataSource.root, "-")
            }
             catch(e)
             {
                Message("Ошибка разбора dataSource на контроле " + ctr.name + ": " + e.description)
             }
        }
      }
   }
}
//}


И при вызове некоторых модальных окон выдается ошибка "Ошибка разбора dataSource на контроле ХХХ: Недостаточно памяти"
Например, включаем анализ модальных окон, добавляем какой-нибудь реквизит в конфигурацию, нажимаем Ф7 (обновить базу данных), получаем модальное окно реструктуризации.
И тогда скрипт выдает следующий код в окне сообщений
Цитата:
dlgInfo.Caption = <Реорганизация информации>
name <3> , id <6>, value <Изменения в структуре информации конфигурации >
name <BtnOK> , id <7>, value <undefined>
name <BtnCancel> , id <8>, value <undefined>
name <ListChanging> , id <9>, value <>
Ошибка разбора dataSource на контроле ListChanging: Недостаточно памяти


Что не так у меня? или это ошибка Снегопата?

Автор:  orefkov [ 13 сен 2012, 07:50 ]
Заголовок сообщения:  Re: Как юзать интерфейс для чтения списков IDataSource ?

спасибо за инфу, разберусь.

Автор:  artbear [ 13 сен 2012, 07:57 ]
Заголовок сообщения:  Re: Как юзать интерфейс для чтения списков IDataSource ?

Еще вопрос по IDataRow:
Есть методы
Function getCellAppearance(columnID As Long) As ICellAppearance
Function getCellValue(columnID As Long)
как определить количество колонок для правильного указания columnID ?

Автор:  artbear [ 13 сен 2012, 07:58 ]
Заголовок сообщения:  Re: Как юзать интерфейс для чтения списков IDataSource ?

orefkov писал(а):
Позже добавлю интерфейс для работы с самим гридом - перебрать колонки, свернуть/развернуть узлы и тд и тп.

Да, вот этого очень не хватает :) очень жду.

Автор:  artbear [ 13 сен 2012, 08:26 ]
Заголовок сообщения:  Re: Как юзать интерфейс для чтения списков IDataSource ?

Пока сделал временную заглушку
Код:
        if ( dstTree == parentRow.owner.type )
            walkDS(row, level + " ")    // Обойдем дочерние строки

для dstGrid как раз и вылетает в бесконечный цикл, т.е. ошибка Снегопата :(
для dstGrid достаточно первый уровень просмотреть.

Автор:  artbear [ 13 сен 2012, 09:13 ]
Заголовок сообщения:  Re: Как юзать интерфейс для чтения списков IDataSource ?

Еще баг:
Код:
                 var value = row.getCellValue(colcount)
                 var ca = row.getCellAppearance(colcount)

Этот код не выдает ошибок для любых значений colcount, хоть тысячу, хоть миллион :(
неудобно разбирать источник :(
Но только для случая dstGrid !

Автор:  artbear [ 13 сен 2012, 09:37 ]
Заголовок сообщения:  Re: Как юзать интерфейс для чтения списков IDataSource ?

orefkov писал(а):
Вот небольшой пример, как обойти грид с деревом метаданных.
Для простоты фокус должен быть на окне конфигурации
Код:
function walkDS(parentRow, level)
{
    for(var row = parentRow.firstChild; row; row = row.next)
    {
        var value = row.getCellValue(6)     // ВОТ ЗДЕСЬ
        var ca = row.getCellAppearance(6)   // ВОТ ЗДЕСЬ
    }
}

function macrosЗапуститьТест()
{
    // Фокус должен стоять в окне конфигурации
    var form = windows.getActiveView().getInternalForm()
    if(form)
    {
        var ctr = form.getControl(0)    // Получаем грид - дерево метаданных
        walkDS(ctr.dataSource.root, "")
    }
}

Если для окна конфигурации вызвать макрос ЗапуститьТест из вышеприведенного кода, то 1С либо падает, либо перестают вызываться макросы :( по Цтрл+М

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/