Страница 1 из 1

Кларион и 1с

Добавлено: 18 Ноябрь 2009, 11:18
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{'РегистрыСведений.ФИОФизЛиц.Выбрать()') - то
отрабатывает нормально но возвращает все значения из регистра
сведений, а мне нужно получить фамилию только для конкретного сотрудника
Где можно порыться или каким другим способом получить для сотрудника его
фамилию?

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

Добавлено: 18 Ноябрь 2009, 15:45
kreator
А напрямую из БД не пойдет?

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

Добавлено: 20 Ноябрь 2009, 12:17
lsgsoftware
К сожалению, структуру базы "монополисты" из 1С не раскрывают. С 1С 7.7 было проще,
там убогий ДБФ. У меня получалось примерно так. Экспорт базы из 1С в формате XML, но
это можно не во всех конфигурациях, к примеру, из Бухгалтерия-PRO такой функции у 1С 8.1 нет.
А дальше парсинг XML-файла - все реально, но ручками конечно надо поработать.

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

Добавлено: 20 Ноябрь 2009, 13:18
ru_alex
Мы тесно работаем с 1С. Сначала пробовали напрямую, но так как постоянно сталкиваемся с разными, в том числе с самописными, конфами не пошло. Затем пробовали по OLE, тоже не айс, к сожалению подробностей не помню, глючный он вообщем у них. В итоге пришли к выводу, что нужно модуль интеграции писать непосредственно на языке 1С. Для универсальности разработан формат промежуточных файлов (у нас DBF, но можно и XML). Язык позволяет легко считать структуру метаданных, и модуль можно постоить в виде "контруктора" по ним. Получается довольно универсально.

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

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

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

Добавлено: 21 Ноябрь 2009, 11:51
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)

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

Добавлено: 21 Ноябрь 2009, 16:40
Дед Пахом
Long писал(а): А можно подробнее?
Если это мне, то я не понял, что подробнее, код на шарпе привести?

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

И если я правильно помню, в 1С можно проследить, какие запросы шлются и от кого, и проанализировать, что происходит.

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

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

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

Добавлено: 22 Ноябрь 2009, 6:29
Long
Дед Пахом писал(а):
Long писал(а): А можно подробнее?
Если это мне, то я не понял, что подробнее, код на шарпе привести?
Ну да.
Дед Пахом писал(а): А GPF-то где, Вы 5 строк привели, в какой?
В последней. Т.е. при попытке заставить 1С выполнить подготовленный запрос.
Дед Пахом писал(а): И если я правильно помню, в 1С можно проследить, какие запросы шлются и от кого, и проанализировать, что происходит.
Если это про журнал регистрации, то там нельзя включить запись всех операций пользователя. Максимум это "ошибки, предупреждения, информацию, примечания".

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

Добавлено: 22 Ноябрь 2009, 12:44
Дед Пахом
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);
                }
            }
        }

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

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