Кларион и 1с

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Velomot
Посетитель
Сообщения: 35
Зарегистрирован: 18 Октябрь 2005, 11:55

Кларион и 1с

Сообщение Velomot »

Народ, помогите.- кто знает1с..Сил больше нет бороться с ней..:(
Нужно из 1с 8.1 получить в клару текущий список сотрудников(табельный номер
и фамилию)
Написал следующий цикл после возни с примером Антона Балкина и обзоров
форумов 1с

Код: Выделить всё


 IF OLEThread THEN
     SetTarget(,OLEThread);
     StrRef=OLEFeq{'Справочники.СотрудникиОрганизаций()'}
     LOOP
        RetVal = OLEFeq{StrRef&'.Следующий()'}
        IF RetVal=0 THEN BREAK.
        RefQueue.Number   = OLEFeq{StrRef&'.Код'}
        StrRef2 = OleFEQ{'РегистрыСведений.ФИОФизЛиц.Выбрать(,,Новый 
Структура("ФизЛицо",' & OLEFeq{StrRef&'.Физлицо'} &  '))'}
        Loop
          RetVal2 =  OLEFeq{StrRef2&'.Следующий()'}
          If RetVal2 = 0 THEN BREAK.
          RefQueue.Name = OLEFeq{StrRef2&'.Фамилия'}
         .
        ADD(RefQueue)
      .
     SetTarget();
     Display;

 END;
Цикл по справочнику сотрудников проходит нормально - табельный номер
получаю в очередь.
Строка же StrRef2 = OleFEQ{'РегистрыСведений.ФИОФизЛиц.Выбрать(,,Новый
Структура("ФизЛицо",' & OLEFeq{StrRef&'.Физлицо'} & '))'}
возвращает - GetPropertyFailed
Если пишу StrRef2 = OleFEQ{'РегистрыСведений.ФИОФизЛиц.Выбрать()') - то
отрабатывает нормально но возвращает все значения из регистра
сведений, а мне нужно получить фамилию только для конкретного сотрудника
Где можно порыться или каким другим способом получить для сотрудника его
фамилию?
kreator
✯ Ветеран ✯
Сообщения: 5080
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 23 раза

Re: Кларион и 1с

Сообщение kreator »

А напрямую из БД не пойдет?
We are hard at work… for you. :)
lsgsoftware
Ветеран
Сообщения: 311
Зарегистрирован: 08 Июль 2005, 22:04

Re: Кларион и 1с

Сообщение lsgsoftware »

К сожалению, структуру базы "монополисты" из 1С не раскрывают. С 1С 7.7 было проще,
там убогий ДБФ. У меня получалось примерно так. Экспорт базы из 1С в формате XML, но
это можно не во всех конфигурациях, к примеру, из Бухгалтерия-PRO такой функции у 1С 8.1 нет.
А дальше парсинг XML-файла - все реально, но ручками конечно надо поработать.
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Re: Кларион и 1с

Сообщение ru_alex »

Мы тесно работаем с 1С. Сначала пробовали напрямую, но так как постоянно сталкиваемся с разными, в том числе с самописными, конфами не пошло. Затем пробовали по OLE, тоже не айс, к сожалению подробностей не помню, глючный он вообщем у них. В итоге пришли к выводу, что нужно модуль интеграции писать непосредственно на языке 1С. Для универсальности разработан формат промежуточных файлов (у нас DBF, но можно и XML). Язык позволяет легко считать структуру метаданных, и модуль можно постоить в виде "контруктора" по ним. Получается довольно универсально.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3236
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 13 раз
Поблагодарили: 45 раз
Контактная информация:

Re: Кларион и 1с

Сообщение Дед Пахом »

В предпоследней моей конторе мы спокойно лазили в базу 1С (7.7 MSSQL) (через вьюшки, хранимки загоняли данные в Clarion и обратно). В последней - я написал на C# класс, который выполняет любые запросы к 8-ке через их OLE (V81.COMConnector), ну и естественно получает результаты этих запросов.
С уважением, ДП
Long
Новичок
Сообщения: 5
Зарегистрирован: 04 Сентябрь 2009, 9:13

Re: Кларион и 1с

Сообщение Long »

Дед Пахом писал(а): В последней - я написал на C# класс, который выполняет любые запросы к 8-ке через их OLE (V81.COMConnector), ну и естественно получает результаты этих запросов.
А можно подробнее? А то вот такой:

Код: Выделить всё

        ?AnyOLEObject{PROP:Create} = 'V81.Application'         !Let the user pick one
        StrRef=?AnyOLEObject{'Connect("File=D:\flash\sveta\1;Usr=adm;")'}
        QueryRef=?AnyOLEObject{'NewObject("Запрос")'}
        ?AnyOLEObject{QueryRef&'Text'} = 'ВЫБРАТЬ СотрудникиОрганизаций.Код ИЗ Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций'
        Res=?AnyOLEObject{QueryRef&'Выполнить().Выгрузить()'}
Приводит к GPF.
Описание переменных

Код: Выделить всё

StrRef     Cstring(255)
QueryRef   Cstring(255)
ResRef     Cstring(255)
Res        Cstring(255)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3236
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 13 раз
Поблагодарили: 45 раз
Контактная информация:

Re: Кларион и 1с

Сообщение Дед Пахом »

Long писал(а): А можно подробнее?
Если это мне, то я не понял, что подробнее, код на шарпе привести?

А GPF-то где, Вы 5 строк привели, в какой?

И если я правильно помню, в 1С можно проследить, какие запросы шлются и от кого, и проанализировать, что происходит.
С уважением, ДП
lsgsoftware
Ветеран
Сообщения: 311
Зарегистрирован: 08 Июль 2005, 22:04

Re: Кларион и 1с

Сообщение lsgsoftware »

1. Если уж работать с этим дерьмом, то лучше всего по схеме ru_alex.Т.е. изучить
их бредовый скриптовый язык и написать на нем промежуточную прогу экспорт-импорт.
Но сам я так и не собрался, заказа за нормальные деньги нет.
2.Не будем лукавить, кларионисты - элита русского программирования.А 1С - продукт откровенно убогий,
типа строителей-таджиков.Будь серьезный заказ за нормальные деньги(а такие у меня были), то написал бы
я такую прогу один за месяца 3-4.Это не хвастовство, делал я такие вещи и не раз.
Long
Новичок
Сообщения: 5
Зарегистрирован: 04 Сентябрь 2009, 9:13

Re: Кларион и 1с

Сообщение Long »

Дед Пахом писал(а):
Long писал(а): А можно подробнее?
Если это мне, то я не понял, что подробнее, код на шарпе привести?
Ну да.
Дед Пахом писал(а): А GPF-то где, Вы 5 строк привели, в какой?
В последней. Т.е. при попытке заставить 1С выполнить подготовленный запрос.
Дед Пахом писал(а): И если я правильно помню, в 1С можно проследить, какие запросы шлются и от кого, и проанализировать, что происходит.
Если это про журнал регистрации, то там нельзя включить запись всех операций пользователя. Максимум это "ошибки, предупреждения, информацию, примечания".
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3236
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 13 раз
Поблагодарили: 45 раз
Контактная информация:

Re: Кларион и 1с

Сообщение Дед Пахом »

Long писал(а):
Дед Пахом писал(а):
Long писал(а): А можно подробнее?
Если это мне, то я не понял, что подробнее, код на шарпе привести?
Ну да.
А толку? В кларе его не заюзаешь.
Ну например, вызов метода 1С:

Код: Выделить всё

        /// <summary>
        /// Вызвать метод над объектом
        /// </summary>
        /// <param name="refObject">Объект</param>
        /// <param name="methodName">Имя метода</param>
        /// <param name="parameters">Параметры вызова</param>
        /// <returns></returns>
        public object Call(object refObject, string methodName, Object[] parameters)
        {
            return m_Base.GetType().InvokeMember(methodName, BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, refObject, parameters);
        }

        private object GetQueryResult(string query)
        {
            object oquery = Call("NewObject", new object[] { "Запрос" });

            // Текст запроса
            SetProp(oquery, "Text", query);

            // Выполнить запрос
            return Call(oquery, "Execute");
        }
И его использование:

Код: Выделить всё

        /// <summary>
        /// Выполнить запрос
        /// </summary>
        /// <param name="query">Текст запроса</param>
        /// <param name="colnames"></param>
        public void ExecuteQuery(string query, params string[] colnames)
        {
            // чистим хранилище результатов
            m_QueryResult.Clear();
            m_QueryResult.Columns.Clear();

            // Создаём колонки
            CreateTable(colnames);

            object queryres = GetQueryResult(query);

            if (queryres != null)
            {
                // Результат выполнения выгрузить в таблицу
                object table = Call(queryres, "Выгрузить");

                // Кол-во строк в таблице
                int count = (int)Call(table, "Количество");

                // Перебираем строки таблицы
                for (int i = 0; i < count; i++)
                {
                    var row = Call(table, "Получить", new object[] { i });

                    DataRow trow = m_QueryResult.NewRow();

                    foreach (string colname in colnames)
                    {
                        if (colname.Trim() == "")
                            continue;

                        try
                        {
                            trow[colname] = GetProp(row, colname).ToString().Trim();
                        }
                        catch (Exception exp)
                        {
                            if (exp.InnerException != null)
                                trow[colname] = exp.InnerException.Message;
                            else
                                trow[colname] = exp.Message;
                        }
                    }

                    m_QueryResult.Rows.Add(trow);
                }
            }
        }
С уважением, ДП
Smith
Старожил
Сообщения: 221
Зарегистрирован: 05 Сентябрь 2005, 19:21
Откуда: Пермь
Благодарил (а): 1 раз
Поблагодарили: 2 раза

Re: Кларион и 1с

Сообщение Smith »

Вот наткнтулся на беседу Ну и в догон.... Мы тоже извращались а потом пришли к выводу что проще делать обмен из 1С. Топспид одбс - и вперед. Не круто конечно, без си - но .... "доступно быстро и всерьез" да и гнать в клару можно все что угодно и заибирать оттелева
Ответить