Clarion и 1С

Разработка программ на пес его знает на чем
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Smith
Старожил
Сообщения: 213
Зарегистрирован: 05 Сентябрь 2005, 19:21
Откуда: Пермь
Благодарил (а): 1 раз

Clarion и 1С

Сообщение Smith »

Часто бывает необходимо из прикладной программы, написанной на Кларион обменяться данными с 1С. ( например нужно было сделать так чтобы в 1С сформировались все документы, необходимые для формирования бухгалтерской и налоговой отчетности )
Решение проблемы в общем то оказалось простым.
1. Вся оперативная информация, документы делаются в Кларионовской программе
2.Из 1С Подключаемся через ODBC к базе TopSpeed
3. В 1С Формируем журнал документов, которые собираем через ODBC
На основании полученных документов обновляем справочники (при необходимости), вводим новые документы ( на основании), ставим признак что документы полученные из ODBC успешно приняты. Все!
Такой подход реализуем естественно и для других источников ODBC.
Для примера см. http://www.trans-manager.ru/
Andromeda

Запись в 1с через OLE. Агрегатные типы

Сообщение Andromeda »

Здравствуйте, Коллеги.

Вопрос по 1с и Clarion

Недавно столкнулся с необходимостью записывать данные в 1с:предприятие V7.7 из Clarion v5 через OLE.

Но возникла проблема. Читать через OLE я могу любые типы данных 1с, однако записать получается только базовые типы.

Агрегатные типы данных - перечисления (пол сотрудника), ссылки на справочники - не запоминаются в файлах. Вместо ссылки, например, на пол сотрудника 1с записывает в справочник сотрудников ноль.

Вопрос.

Возможно ли используя OLE записывать в 1с агрегатные типы, или такое в принципе невозможно, поскольку действует неизвестное мне ограничение OLE-сервера 1с?

У кого есть опыт в этом вопросе - пожалуйста, поделитесь.

С уважением,
Александр
e-mail: orgaup@mail.ru
lsgsoftware
Ветеран
Сообщения: 311
Зарегистрирован: 08 Июль 2005, 22:04

Сообщение lsgsoftware »

Вроде 1С версии 7.7 работает еще на DBF-платформе.Дружба с Кларион- через копирование нужных файлов в словарь. Но, будут проблемы с индексами - после влезания в 1С через Кларион базу нужно будет переиндексировать.Много раз делал такие штучки для системы БЭСТ - и юзеры были в целом довольны.
Smith
Старожил
Сообщения: 213
Зарегистрирован: 05 Сентябрь 2005, 19:21
Откуда: Пермь
Благодарил (а): 1 раз

Сообщение Smith »

Как я уже писал, нужно ( и это легче) не писать из Клариона в 1С, а именно из 1С брать данные. Я недавно поэтому и визжал от восторга. Т.к. зная что забирать из проги на Кларион внутри 1С тебе доступны будут все ее методы.
Если 1С на SQL, то может оказаться полезной библиотека 1С++(не путать с С++;-). Ее попытаться найти на http://www.proclub.ru/
Andromeda

Запись в 1с через OLE. Агрегатные типы

Сообщение Andromeda »

Спасибо за советы, Коллеги.

Но если возможно, поделитесь опытом работы с 1с через OLE.

Писать напрямую в dbf файлы можно, но это не совсем "корректно", а хотелось бы делать все "по-честному". Не трогая dbf файлы напрямую. К тому же я вынужден работать sql версией 1с.

Взаимодействие через OLE довольно простое.
---
Ref=Glo:OneC.FEQ{'CreateObject("Reference.Сотрудники")'}
Glo:OneC.FEQ{Ref&'.New'}
Glo:OneC.FEQ{Ref & '.Наименование'} = Name
Glo:OneC.FEQ{Ref&'.Код'} =Code
и т.д.
Glo:OneC.FEQ{Ref& '.Write()'}
--
Все работает. Но как только необходимо записать агрегатный тип - не хочет писать.

Я использую OLE, т.к. получается маленький exe файл, который запускается по расписанию, подсоединяется к базе Clarion, к базе 1с и молча делает вычисления и переливает данные из tps в 1с.

Можно ли также пакетно по расписанию "молча" запускать 1с из нее внешнюю обработку (ert) и затем завершать работу с 1с - я не знаю. Типовую конфигурацию трогать нельзя.
Smith
Старожил
Сообщения: 213
Зарегистрирован: 05 Сентябрь 2005, 19:21
Откуда: Пермь
Благодарил (а): 1 раз

Сообщение Smith »

Возможно ли используя OLE записывать в 1с агрегатные типы, или такое в принципе невозможно, поскольку действует неизвестное мне ограничение OLE-сервера 1с?
-------------------------------------------------
Скорее всего действует отсутствие доступной доки. У нас эксперименты закончились поражением ;-).
Обработку сваять можно. Пиши подробнее в чем затыка.
Andromeda

Сообщение Andromeda »

Скорее всего действует отсутствие доступной доки. У нас эксперименты закончились поражением .
Обработку сваять можно. Пиши подробнее в чем затыка.
-----------------------------------------------------------------------

Условия задачи таковы.

Есть список сотрудников в программе "Кадры" на Кларион.

Каждый день появляются новые работники. Кто-то увольняется.

Необходимо все эти изменения передавать в справочник "Сотрудники" 1с-Бухгалтерия. Желательно все делать автоматом раз в день. В типовую конфигурацию вмешиваться нельзя.

Пробую использовать OLE.

Я взял за основу пример взаимодействия Clarion и 1с Антона Балкина, создал класс для удобства работы.

Glo:OneC.FEQ - это класс для работы с 1с
Str string(30) !ID объекта 1c
CODE
Str=Glo:OneC.FEQ{'CreateObject("Reference.Сотрудники")'}
RetVal=Glo:OneC.FEQ{StrRef&'.ВыбратьЭлементы(0)'}
LOOP
RetVal = Glo:OneC.FEQ{StrRef&'.ПолучитьЭлемент()'}
IF RetVal=0 THEN BREAK.
do LoadRec
END

LoadRec ROUTINE
Glo:OneC.FEQ{Str &'.New'}
Glo:OneC.FEQ{Str & '.Наименование'} = L.R.Descr
Glo:OneC.FEQ{Str&'.Код'} = L.R.Code
Glo:OneC.FEQ{Str&'.ДатаРождения'} = format( L.R.BirthDay , @d6.)
Glo:OneC.FEQ{Str&'.Должность'} = clip(L.R.Dolgn)
Glo:OneC.FEQ{Str&'.ДокументДатаВыдачи'} = format( L.R.DokData , @d6.)
Glo:OneC.FEQ{Str&'.ДокументКемВыдан'} = L.R.KemVid
Glo:OneC.FEQ{Str&'.ДокументНомер'} = L.R.DokNomer
Glo:OneC.FEQ{Str&'.ДокументСерия'} = L.R.DokSeria
Glo:OneC.FEQ{Str&'.Телефон'} = L.R.Telefon

Glo:OneC.FEQ{Str& '.Write()'}

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

Но у сотрудника есть пол. И еще какие-то агрегатные атрибуты. Ссылки на справочники(подразделение) и перечесления(пол), если проще.

Вот с этим затык. Как только я не извращался - ничего не помогает. Пишет в базу ноль вместо ID пола.

И что самое интересное, читается агрегатный тип без проблем:
RefDep = Glo:OneC.FEQ{StrRef&'.Подразделение'} !Вернет строку ID Подразделения и прочитает из связного справочника:

DepKod = Glo:OneC.FEQ{RefDep & '.Код'}
DepName = Glo:OneC.FEQ{RefDep & '.Наименование'}
Pol = Glo:OneC.FEQ{StrRef & '.Пол.Идентификатор()'} !Вернет "Мужской"

А пишется... - не пишется вообще.
Ни так (для отладки попробовал)
Glo:OneC.FEQ{StrRef&'.Пол'} = ' GJA' !Если пол мужской, то в dbf файле "это" написано.

Ни даже так:
Glo:OneC.FEQ{Str&'.Пол'} = Glo:OneC.FEQ{'Перечисление.Пол.ЗначениеПоИдентификатору(Пол.Мужской.Идентификатор())' }

Как записывать агрегатный тип через OLE - я так и не понял. Обработой из 1с можно, но только как ее запустить в "автоматическом" режиме не касаясь стандартной конфигурации - я не знаю.

Вот вкратце и все. Поражение вышло, однако. :oops:
Может быть есть опыт победителей?

С уважением,
Александр
Smith
Старожил
Сообщения: 213
Зарегистрирован: 05 Сентябрь 2005, 19:21
Откуда: Пермь
Благодарил (а): 1 раз

Сообщение Smith »

Есть список сотрудников в программе "Кадры" на Кларион.
Каждый день появляются новые работники. Кто-то увольняется.
Необходимо все эти изменения передавать в справочник "Сотрудники" 1с-Бухгалтерия. Желательно все делать автоматом раз в день. В типовую конфигурацию вмешиваться нельзя
------------------------------------------------------------------------
Давно не заглядывал сюда. Если еще актуально. То можно сделать так.
Нужно :
1. Название и Релиз конфигурации 1С
2. Подробное описание б.д. кларионовской проги .
3. Конфигурация не пострадает, ни разу.... ;-)))
Подробности лучше почтой : smith@arcpearl.ru
ut5jbh
Прохожий
Сообщения: 3
Зарегистрирован: 19 Апрель 2006, 16:33
Откуда: Севастополь
Контактная информация:

Re: Clarion и 1С

Сообщение ut5jbh »

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

Есть в примере такая рутина
FillQueue ROUTINE
IF OLEThread THEN
SetTarget(,OLEThread);
StrRef=OLEFeq{'CreateObject("Reference.Сотрудники")'}
message('Создали' & CLIP(StrRef))
!тут чуть подправлено под конфигурацию "Reference.Сотрудники"
Переменная StrRef пуста, соответственно ничего не читается из
справочника
RetVal=OLEFeq{StrRef&'.ВыбратьЭлементы(0)'}
message('Подготовили к выборке')
LOOP
RetVal = OLEFeq{StrRef&'.ПолучитьЭлемент()'}
IF RetVal=0 THEN BREAK.
RefQueue.Number = OLEFeq{StrRef&'.Код'};
RefQueue.Name = OLEFeq{StrRef&'.Наименование'};
ADD(RefQueue);
SetTarget();
Display;
SetTarget(,OLEThread);
END;
SetTarget();
message('Вывели')
END;
В диспетчере задач видно, что запускается 1с.

Так как реально много баз 1с, то одна из строк текста изменена, чтобы
подключиться к конкретной.
Было:
OLEFeq{'initialize(' & OLEFEq{'RMTrade'} & ',"/M","")'}
У меня
OLEFeq{'initialize(' & OLEFEq{'RMTrade'} & ',/D"C:\Program
Files\1Cv77\zarplata\" /NПользователь /PderParol '}

Вариант
OLEFeq{'initialize(' & OLEFEq{'RMTrade'} & ',/D"C:\Program Files\1Cv77\zarplata\" /NПользователь
/PderParol,"NO_SPLASH_SHOW"'}
дает тот же результат.

Из командной строки 1с с параметрами запускается, правда требует
нажатия "ок", что наводит на мысль, что и в ОЛЕ-режиме дальше не идет,
если смотреть по памяти, которую занимает процесс. Слишком мало.
Второй момент:
есть подозрение, что это связано с новой тредовой моделью в 6-ке.
Кто знает - дайте наводку на путь истинный.

У кого будет желание и возможность - прогоните.
Здесь С63 и 1С7-17.
Спасибо.
ПС
Варианты импорта-экспорта через промежуточные файлы сейчас
используются :)
ut5jbh
Прохожий
Сообщения: 3
Зарегистрирован: 19 Апрель 2006, 16:33
Откуда: Севастополь
Контактная информация:

Re: Clarion и 1С

Сообщение ut5jbh »

Отвечаю себе сам. Проблемы в примере под С6 связаны с новой тредной моделью. Под С55 все работает. Чтоб не страдать с семафорами и прочими mutex`ами, все сделал в одном треде. Меня устроило. Прошу прощения у автора за то, что покоцал его первоисточник.
PROGRAM

INCLUDE('Keycodes.CLW')
INCLUDE('Errors.CLW')

MAP
Main PROCEDURE
Start1C PROCEDURE
END

Start1CThread LONG(0)

CODE
Main


Main PROCEDURE

AppFrame APPLICATION('1C OLE Automation Server'),AT(,,421,112),FONT('MS Sans Serif',8,,),SYSTEM,MAX,RESIZE
MENUBAR
MENU('&Файл'),USE(?Файл)
ITEM('В&ыход<9>Alt-X'),USE(?FileExit),KEY(AltX),STD(STD:Close)
END
MENU('1&C Предпри<255>тие'),USE(?1CПредприятие)
ITEM('&Запуск'),USE(?Start1C)
END
END
END

CODE
OPEN(AppFrame);

ACCEPT
CASE ACCEPTED()
OF ?Start1C
IF ~Start1CThread THEN
Start1CThread = START(Start1C,25000);
END;
END;
END;

RETURN; !Main

!-----------------------------------------------------------------------
! Запуск 1С:Предприятия как OLE Automation Server
!
Start1C PROCEDURE
OLEFeq LONG,AUTO
StrRef STRING(50);
RetVal SHORT;

RefQueue QUEUE
Number STRING(5);
Name STRING(30);
END;

DummyWindow WINDOW('Справочник'),AT(,,233,177),FONT('MS Sans Serif',8,,FONT:regular),SYSTEM,GRAY,DOUBLE,MDI,TIMER(1)
LIST,AT(4,4,226,150),USE(?List1),VSCROLL,FORMAT('30L(2)|M~Номер~@s5@70L(2)|M~Наименование~@s30@'), |
FROM(RefQueue)
BUTTON('Close'),AT(90,160,45,14),USE(?Close)
END

CODE
OPEN(DummyWindow)
ACCEPT
CASE Event()
OF Event:OpenWindow
OleFeq = CREATE(0,Create:OLE);
IF ~OLEFeq THEN
Message('Не удалось создать OLE Control');
POST(EVENT:CloseWindow);
CYCLE;
END;
do r1
END;
END; !accept

OLEFEq{'ЗавершитьРаботуСистемы(0)'};
CLOSE(DummyWindow);


RETURN; !Start1C
r1 routine
OleFeq{PROP:Create} = 'V77S.Application';
UNHIDE(OleFeq);
OLEFeq{'initialize(' & OLEFEq{'RMTrade'} & ',"/DC:\zarplata\ /Nadmin /P123","NO_SPLASH_SHOW")'}
StrRef=OLEFeq{'CreateObject("Reference.Сотрудники")'}
RetVal=OLEFeq{StrRef&'.ВыбратьЭлементы(0)'}
LOOP
RetVal = OLEFeq{StrRef&'.ПолучитьЭлемент()'}
IF RetVal=0 THEN BREAK.
RefQueue.Number = OLEFeq{StrRef&'.Код'};
RefQueue.Name = OLEFeq{StrRef&'.Наименование'};
ADD(RefQueue);
END;
display
MESSAGE('Результат')
Аватара пользователя
morkovin
Ветеран
Сообщения: 908
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

Re: Clarion и 1С

Сообщение morkovin »

Проблемы в примере под С6 связаны с новой тредной моделью
Так вот в чем дело!
r1 routine
OleFeq{PROP:Create} = 'V77S.Application';
У меня так заработало:

OleFeq{PROP:Create} = 'V77.Application';

До этого выкрутился прямым чтением DBF-таблиц (были нужны кассовые документы). Здесь есть описание таблиц
для 1С77: http://www.script-coding.info/v77tables.html
WBR, morkovin
ut5jbh
Прохожий
Сообщения: 3
Зарегистрирован: 19 Апрель 2006, 16:33
Откуда: Севастополь
Контактная информация:

Re: Clarion и 1С

Сообщение ut5jbh »

Спасибо за ссылку. Мне пришлось вернуться к прежнему подходу: выгрузка в промежуточный формат и импорт. Про "V77. Appliacftion" есть в описании 1С, зависит от версии.
seawolf
Старожил
Сообщения: 213
Зарегистрирован: 08 Июль 2005, 11:23
Откуда: St. Petersburg

Re: Clarion и 1С

Сообщение seawolf »

Давно пользуюсь подходом через dbf файл, и более придумывать ничего неохота! Тем более, что бухгалтера живут в отдельном от остальных компов мире.
Ответить