Снегопат

Обсуждение Снегопата
Текущее время: 23 ноя 2024, 20:34

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
СообщениеДобавлено: 10 сен 2012, 07:03 
Не в сети
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 10 сен 2012, 08:26 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:04
Сообщения: 2052
Вот небольшой пример, как обойти грид с деревом метаданных.
Для простоты фокус должен быть на окне конфигурации
Код:
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, "")
    }
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 10 сен 2012, 08:29 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:04
Сообщения: 2052
Пока можно просто перебрать источник данных.
Позже добавлю интерфейс для работы с самим гридом - перебрать колонки, свернуть/развернуть узлы и тд и тп.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 сен 2012, 07:47 
Не в сети
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:36
Сообщения: 1085
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: Недостаточно памяти


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 сен 2012, 07:50 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:04
Сообщения: 2052
спасибо за инфу, разберусь.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 сен 2012, 07:57 
Не в сети
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:36
Сообщения: 1085
Еще вопрос по IDataRow:
Есть методы
Function getCellAppearance(columnID As Long) As ICellAppearance
Function getCellValue(columnID As Long)
как определить количество колонок для правильного указания columnID ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 сен 2012, 07:58 
Не в сети
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 сен 2012, 08:26 
Не в сети
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 сен 2012, 09:13 
Не в сети
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:36
Сообщения: 1085
Еще баг:
Код:
                 var value = row.getCellValue(colcount)
                 var ca = row.getCellAppearance(colcount)

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


Последний раз редактировалось artbear 13 сен 2012, 09:38, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 сен 2012, 09:37 
Не в сети
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:36
Сообщения: 1085
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С либо падает, либо перестают вызываться макросы :( по Цтрл+М


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB