Страница 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С. Топспид одбс - и вперед. Не круто конечно, без си - но .... "доступно быстро и всерьез" да и гнать в клару можно все что угодно и заибирать оттелева