Clarion и 1С
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- Старожил
- Сообщения: 219
- Зарегистрирован: 05 Сентябрь 2005, 19:21
- Откуда: Пермь
- Благодарил (а): 1 раз
- Поблагодарили: 2 раза
Clarion и 1С
Часто бывает необходимо из прикладной программы, написанной на Кларион обменяться данными с 1С. ( например нужно было сделать так чтобы в 1С сформировались все документы, необходимые для формирования бухгалтерской и налоговой отчетности )
Решение проблемы в общем то оказалось простым.
1. Вся оперативная информация, документы делаются в Кларионовской программе
2.Из 1С Подключаемся через ODBC к базе TopSpeed
3. В 1С Формируем журнал документов, которые собираем через ODBC
На основании полученных документов обновляем справочники (при необходимости), вводим новые документы ( на основании), ставим признак что документы полученные из ODBC успешно приняты. Все!
Такой подход реализуем естественно и для других источников ODBC.
Для примера см. http://www.trans-manager.ru/
Решение проблемы в общем то оказалось простым.
1. Вся оперативная информация, документы делаются в Кларионовской программе
2.Из 1С Подключаемся через ODBC к базе TopSpeed
3. В 1С Формируем журнал документов, которые собираем через ODBC
На основании полученных документов обновляем справочники (при необходимости), вводим новые документы ( на основании), ставим признак что документы полученные из ODBC успешно приняты. Все!
Такой подход реализуем естественно и для других источников ODBC.
Для примера см. http://www.trans-manager.ru/
Запись в 1с через OLE. Агрегатные типы
Здравствуйте, Коллеги.
Вопрос по 1с и Clarion
Недавно столкнулся с необходимостью записывать данные в 1с:предприятие V7.7 из Clarion v5 через OLE.
Но возникла проблема. Читать через OLE я могу любые типы данных 1с, однако записать получается только базовые типы.
Агрегатные типы данных - перечисления (пол сотрудника), ссылки на справочники - не запоминаются в файлах. Вместо ссылки, например, на пол сотрудника 1с записывает в справочник сотрудников ноль.
Вопрос.
Возможно ли используя OLE записывать в 1с агрегатные типы, или такое в принципе невозможно, поскольку действует неизвестное мне ограничение OLE-сервера 1с?
У кого есть опыт в этом вопросе - пожалуйста, поделитесь.
С уважением,
Александр
e-mail: orgaup@mail.ru
Вопрос по 1с и Clarion
Недавно столкнулся с необходимостью записывать данные в 1с:предприятие V7.7 из Clarion v5 через OLE.
Но возникла проблема. Читать через OLE я могу любые типы данных 1с, однако записать получается только базовые типы.
Агрегатные типы данных - перечисления (пол сотрудника), ссылки на справочники - не запоминаются в файлах. Вместо ссылки, например, на пол сотрудника 1с записывает в справочник сотрудников ноль.
Вопрос.
Возможно ли используя OLE записывать в 1с агрегатные типы, или такое в принципе невозможно, поскольку действует неизвестное мне ограничение OLE-сервера 1с?
У кого есть опыт в этом вопросе - пожалуйста, поделитесь.
С уважением,
Александр
e-mail: orgaup@mail.ru
-
- Ветеран
- Сообщения: 311
- Зарегистрирован: 08 Июль 2005, 22:04
-
- Старожил
- Сообщения: 219
- Зарегистрирован: 05 Сентябрь 2005, 19:21
- Откуда: Пермь
- Благодарил (а): 1 раз
- Поблагодарили: 2 раза
Как я уже писал, нужно ( и это легче) не писать из Клариона в 1С, а именно из 1С брать данные. Я недавно поэтому и визжал от восторга. Т.к. зная что забирать из проги на Кларион внутри 1С тебе доступны будут все ее методы.
Если 1С на SQL, то может оказаться полезной библиотека 1С++(не путать с С++;-). Ее попытаться найти на http://www.proclub.ru/
Если 1С на SQL, то может оказаться полезной библиотека 1С++(не путать с С++;-). Ее попытаться найти на http://www.proclub.ru/
Запись в 1с через OLE. Агрегатные типы
Спасибо за советы, Коллеги.
Но если возможно, поделитесь опытом работы с 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с - я не знаю. Типовую конфигурацию трогать нельзя.
Но если возможно, поделитесь опытом работы с 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с - я не знаю. Типовую конфигурацию трогать нельзя.
-
- Старожил
- Сообщения: 219
- Зарегистрирован: 05 Сентябрь 2005, 19:21
- Откуда: Пермь
- Благодарил (а): 1 раз
- Поблагодарили: 2 раза
Возможно ли используя OLE записывать в 1с агрегатные типы, или такое в принципе невозможно, поскольку действует неизвестное мне ограничение OLE-сервера 1с?
-------------------------------------------------
Скорее всего действует отсутствие доступной доки. У нас эксперименты закончились поражением .
Обработку сваять можно. Пиши подробнее в чем затыка.
-------------------------------------------------
Скорее всего действует отсутствие доступной доки. У нас эксперименты закончились поражением .
Обработку сваять можно. Пиши подробнее в чем затыка.
Скорее всего действует отсутствие доступной доки. У нас эксперименты закончились поражением .
Обработку сваять можно. Пиши подробнее в чем затыка.
-----------------------------------------------------------------------
Условия задачи таковы.
Есть список сотрудников в программе "Кадры" на Кларион.
Каждый день появляются новые работники. Кто-то увольняется.
Необходимо все эти изменения передавать в справочник "Сотрудники" 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с можно, но только как ее запустить в "автоматическом" режиме не касаясь стандартной конфигурации - я не знаю.
Вот вкратце и все. Поражение вышло, однако.
Может быть есть опыт победителей?
С уважением,
Александр
Обработку сваять можно. Пиши подробнее в чем затыка.
-----------------------------------------------------------------------
Условия задачи таковы.
Есть список сотрудников в программе "Кадры" на Кларион.
Каждый день появляются новые работники. Кто-то увольняется.
Необходимо все эти изменения передавать в справочник "Сотрудники" 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с можно, но только как ее запустить в "автоматическом" режиме не касаясь стандартной конфигурации - я не знаю.
Вот вкратце и все. Поражение вышло, однако.
Может быть есть опыт победителей?
С уважением,
Александр
-
- Старожил
- Сообщения: 219
- Зарегистрирован: 05 Сентябрь 2005, 19:21
- Откуда: Пермь
- Благодарил (а): 1 раз
- Поблагодарили: 2 раза
Есть список сотрудников в программе "Кадры" на Кларион.
Каждый день появляются новые работники. Кто-то увольняется.
Необходимо все эти изменения передавать в справочник "Сотрудники" 1с-Бухгалтерия. Желательно все делать автоматом раз в день. В типовую конфигурацию вмешиваться нельзя
------------------------------------------------------------------------
Давно не заглядывал сюда. Если еще актуально. То можно сделать так.
Нужно :
1. Название и Релиз конфигурации 1С
2. Подробное описание б.д. кларионовской проги .
3. Конфигурация не пострадает, ни разу.... ))
Подробности лучше почтой : smith@arcpearl.ru
Каждый день появляются новые работники. Кто-то увольняется.
Необходимо все эти изменения передавать в справочник "Сотрудники" 1с-Бухгалтерия. Желательно все делать автоматом раз в день. В типовую конфигурацию вмешиваться нельзя
------------------------------------------------------------------------
Давно не заглядывал сюда. Если еще актуально. То можно сделать так.
Нужно :
1. Название и Релиз конфигурации 1С
2. Подробное описание б.д. кларионовской проги .
3. Конфигурация не пострадает, ни разу.... ))
Подробности лучше почтой : smith@arcpearl.ru
-
- Прохожий
- Сообщения: 3
- Зарегистрирован: 19 Апрель 2006, 16:33
- Откуда: Севастополь
- Контактная информация:
Re: Clarion и 1С
Похоже, что клалист опять кондрашка хватила..
Потому обращаюсь сюда
Тема затертая, наверное.Потому прошу прощения.
Понадобилось почитать справочники из 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.
Спасибо.
ПС
Варианты импорта-экспорта через промежуточные файлы сейчас
используются
Потому обращаюсь сюда
Тема затертая, наверное.Потому прошу прощения.
Понадобилось почитать справочники из 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.
Спасибо.
ПС
Варианты импорта-экспорта через промежуточные файлы сейчас
используются
-
- Прохожий
- Сообщения: 3
- Зарегистрирован: 19 Апрель 2006, 16:33
- Откуда: Севастополь
- Контактная информация:
Re: Clarion и 1С
Отвечаю себе сам. Проблемы в примере под С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('Результат')
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
- Ветеран
- Сообщения: 910
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Clarion и 1С
Так вот в чем дело!Проблемы в примере под С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
-
- Прохожий
- Сообщения: 3
- Зарегистрирован: 19 Апрель 2006, 16:33
- Откуда: Севастополь
- Контактная информация:
Re: Clarion и 1С
Спасибо за ссылку. Мне пришлось вернуться к прежнему подходу: выгрузка в промежуточный формат и импорт. Про "V77. Appliacftion" есть в описании 1С, зависит от версии.
Re: Clarion и 1С
Давно пользуюсь подходом через dbf файл, и более придумывать ничего неохота! Тем более, что бухгалтера живут в отдельном от остальных компов мире.