Экспорт в 1С 8.1 через OLE
Показывать по
10
20
40
сообщений
- 1
- 2
03.04.2008
15:08
#1
Я написал программу, которая считывает данные из 1С 8.1 и обрабатывает их. Все хорошо, все замечательно.
Но руководство хочет, чтобы была и обратная совместимость: записывать данные в базу 1С.
Перерыл весь интернет, нашел только информацию по 7.7 – это метод ExecuteBatch (“команда на языке 1С”) или EvalExpr (“команда на языке 1С”)
Но в 8.1 этих методов нет !!!
Есть ли в 8.1 аналог команде ExecuteBatch?
Но руководство хочет, чтобы была и обратная совместимость: записывать данные в базу 1С.
Перерыл весь интернет, нашел только информацию по 7.7 – это метод ExecuteBatch (“команда на языке 1С”) или EvalExpr (“команда на языке 1С”)
Но в 8.1 этих методов нет !!!
Есть ли в 8.1 аналог команде ExecuteBatch?
09.04.2008
13:03
#2
OLE работает в две стороны по идее. Это всего лишь механизм манипулирования приложением из-вне его. Каким образом происходит считывание?
09.04.2008
15:28
#3
"Работающий фрагмент на считывание:
v:= CreateOleObject('v81.Application');
v.Connect(s);
Schet := v.Справочники.Контрагенты;
// Код 000000001 в справочникe 1С - это покупатели.
Schet_Select := Schet.Выбрать(Schet.НайтиПоКоду('000000001'));
while Schet_Select.Следующий() do
begin
if not Schet_Select.ЭтоГруппа then
begin
... < мои действия > ...
end; //if not Schet_Select.ЭтоГруппа
end; //while Schet_Select.Следующий()
А это фрагмент из конфигуратора 1С на запись:
ДокСсылка = Документы.СчетНаОплатуПокупателю.НайтиПоНомеру("АКА00000002",НачалоГода(ТекущаяДата()));
Если ДокСсылка <> Документы.СчетНаОплатуПокупателю.ПустаяСсылка() Тогда
ДокОбъект = ДокСсылка.ПолучитьОбъект();
ДокОбъект.СтатусОплаты = "Оплачен";
ДокОбъект.Записать();
КонецЕсли;
Если была бы версия 7.7, то я бы этот кусок просто подставил бы в v.ExecuteBatch(<набор строк на языке 1С>) и нет проблем, но в 8-й версии ExecuteBatch куда-то пропал.
Через OLE я выкрутился так:
doc_ssilka := v.Документы.СчетНаОплатуПокупателю.НайтиПоНомеру('АКА00000002','20081231101010');
doc_obj := doc_ssilka.ПолучитьОбъект();
doc_obj.СтатусОплаты := 'Оплачен';
doc_obj.Записать();
Пока работает, но я не знаю как через механизм OLE выполнить строку на проверку:
Если ДокСсылка <> Документы.СчетНаОплатуПокупателю.ПустаяСсылка() Тогда ...
Пробовал:
if doc_ssilka = Unassigned then ... – ошибка
if doc_ssilka = nil then ... - ошибка
и т.д.
Полноценная интеграция 1С с внешними программами через OLE могла в 7.7 реализовываться методом ExecuteBatch.
Существует же способ переслать на обработку массив строк, написанных на языке 1С? Ведь не могли же разработчики 1С убрать этот механизм в 8-й версии?
"
v:= CreateOleObject('v81.Application');
v.Connect(s);
Schet := v.Справочники.Контрагенты;
// Код 000000001 в справочникe 1С - это покупатели.
Schet_Select := Schet.Выбрать(Schet.НайтиПоКоду('000000001'));
while Schet_Select.Следующий() do
begin
if not Schet_Select.ЭтоГруппа then
begin
... < мои действия > ...
end; //if not Schet_Select.ЭтоГруппа
end; //while Schet_Select.Следующий()
А это фрагмент из конфигуратора 1С на запись:
ДокСсылка = Документы.СчетНаОплатуПокупателю.НайтиПоНомеру("АКА00000002",НачалоГода(ТекущаяДата()));
Если ДокСсылка <> Документы.СчетНаОплатуПокупателю.ПустаяСсылка() Тогда
ДокОбъект = ДокСсылка.ПолучитьОбъект();
ДокОбъект.СтатусОплаты = "Оплачен";
ДокОбъект.Записать();
КонецЕсли;
Если была бы версия 7.7, то я бы этот кусок просто подставил бы в v.ExecuteBatch(<набор строк на языке 1С>) и нет проблем, но в 8-й версии ExecuteBatch куда-то пропал.
Через OLE я выкрутился так:
doc_ssilka := v.Документы.СчетНаОплатуПокупателю.НайтиПоНомеру('АКА00000002','20081231101010');
doc_obj := doc_ssilka.ПолучитьОбъект();
doc_obj.СтатусОплаты := 'Оплачен';
doc_obj.Записать();
Пока работает, но я не знаю как через механизм OLE выполнить строку на проверку:
Если ДокСсылка <> Документы.СчетНаОплатуПокупателю.ПустаяСсылка() Тогда ...
Пробовал:
if doc_ssilka = Unassigned then ... – ошибка
if doc_ssilka = nil then ... - ошибка
и т.д.
Полноценная интеграция 1С с внешними программами через OLE могла в 7.7 реализовываться методом ExecuteBatch.
Существует же способ переслать на обработку массив строк, написанных на языке 1С? Ведь не могли же разработчики 1С убрать этот механизм в 8-й версии?
"
09.04.2008
17:33
#4
Уважаемый вы забываете о том что есть OLE. Вы можете использовать методы и объекты того объекта с которым установили соединение. Метод "Выполнить" есть в 8.1,он никуда не делся. Только не забывайте что это метод глобального контекста. И не забывайте что через OLE передаются базовые типы (строка,число,дата).
Выполнить (Execute)
Синтаксис:
Выполнить(<Строка>)
Параметры:
<Строка>
Строка, содержащая текст исполняемого кода.
Описание:
Позволяет выполнить фрагмент кода, который передается ему в качестве строкового значения.
Выполнить (Execute)
Синтаксис:
Выполнить(<Строка>)
Параметры:
<Строка>
Строка, содержащая текст исполняемого кода.
Описание:
Позволяет выполнить фрагмент кода, который передается ему в качестве строкового значения.
09.04.2008
17:38
#5
"Выдержка из синтаксис-помощника.
Выполнить (Execute)
Синтаксис:
Выполнить(<Строка>)
Параметры:
<Строка>
Строка, содержащая текст исполняемого кода.
Описание:
Позволяет выполнить фрагмент кода, который передается ему в качестве строкового значения.
Его можно использовать как внутри самой 1С, так скорее всего и как метод OLE-сервера.
Тока я бы все таки советовал использовать Ваш "v:= CreateOleObject('v81.Application');", а все остальное цепляется к нему как методы и атрибуты. Если есть механизм выгрузки, то и механизм загрузки луше выполнять таким же, имхо."
Выполнить (Execute)
Синтаксис:
Выполнить(<Строка>)
Параметры:
<Строка>
Строка, содержащая текст исполняемого кода.
Описание:
Позволяет выполнить фрагмент кода, который передается ему в качестве строкового значения.
Его можно использовать как внутри самой 1С, так скорее всего и как метод OLE-сервера.
Тока я бы все таки советовал использовать Ваш "v:= CreateOleObject('v81.Application');", а все остальное цепляется к нему как методы и атрибуты. Если есть механизм выгрузки, то и механизм загрузки луше выполнять таким же, имхо."
09.04.2008
18:20
#6
"Я это знаю, поэтому и задал вопрос на форуме. Вот пример кода:
v := CreateOleObject('v81.Application'); - OK
v.Connect(s); - OK
v.Execute('Сообщить("Привет, как дела ?");'); - Ошибка «Method 'Execute' not supported by automation object.»
v := CreateOleObject('v81.Application'); - OK
v.Connect(s); - OK
v.Выполнить('Сообщить("Привет, как дела ?");'); - Ошибка «Method 'Выполнить' not supported by automation object.»
А если установлена версия 7.7 и написать:
v.ExecuteBatch ('Сообщить("Привет, как дела ?");');
то будет выполняться.
"
v := CreateOleObject('v81.Application'); - OK
v.Connect(s); - OK
v.Execute('Сообщить("Привет, как дела ?");'); - Ошибка «Method 'Execute' not supported by automation object.»
v := CreateOleObject('v81.Application'); - OK
v.Connect(s); - OK
v.Выполнить('Сообщить("Привет, как дела ?");'); - Ошибка «Method 'Выполнить' not supported by automation object.»
А если установлена версия 7.7 и написать:
v.ExecuteBatch ('Сообщить("Привет, как дела ?");');
то будет выполняться.
"
10.04.2008
13:22
#7
Ну как может выполниться метод "Сообщить" по OLE ? У вас что загружен интерфейс программы? Куда он его выведет? Вот программа и говорит что этот метод не поддерживается при запуске программы через атомейшен.
10.04.2008
15:07
#8
"Да причем тут свойство Visible? Речь идет об Execute (Выполнить)
Вот фрагмент:
v := CreateOleObject('v81.Application'); - OK
v.Connect(s); - OK
v.Документы.СчетНаОплатуПокупателю.ПолучитьФормуСписка().Открыть(); - OK
v.visible := true; - OK
v.Выполнить('Сообщить("Привет, как дела ?");'); - Ошибка «Method 'Выполнить' not supported by automation object.»
Если бы я хотел выполнить вывод на экран фразы «Привет, как дела ?», то вот РАБОТАЮЩИЙ фрагмент:
v := CreateOleObject('v81.Application'); - OK
v.Connect(s); - OK
v.Сообщить('Привет, как дела ?'); - OK
v.visible := true; - OK
Здесь v.visible := true стоит ПОСЛЕ v.Сообщить('Привет, как дела ?') и ошибки НЕТ, т.к. метод «Сообщить» поддерживается OLE automation Object.
Вы невнимательно читаете мои сообщения (или совсем не делали импорт-экспорт между 1С и Delphi, C++ Builder и т.д. через OLE). Ибо не все команды языка 1С можно подтянуть НАПРЯМУЮ через OLE (к примеру фразу типа «Если ДокСсылка <> Документы.СчетНаОплатуПокупателю.ПустаяСсылка() Тогда»). В версии 7.7 был ExecuteBatch и все ОК.
Скорее всего сами разработчики 1С где-то дали маху и полноценной замены ExecuteBatch нет.
"
Вот фрагмент:
v := CreateOleObject('v81.Application'); - OK
v.Connect(s); - OK
v.Документы.СчетНаОплатуПокупателю.ПолучитьФормуСписка().Открыть(); - OK
v.visible := true; - OK
v.Выполнить('Сообщить("Привет, как дела ?");'); - Ошибка «Method 'Выполнить' not supported by automation object.»
Если бы я хотел выполнить вывод на экран фразы «Привет, как дела ?», то вот РАБОТАЮЩИЙ фрагмент:
v := CreateOleObject('v81.Application'); - OK
v.Connect(s); - OK
v.Сообщить('Привет, как дела ?'); - OK
v.visible := true; - OK
Здесь v.visible := true стоит ПОСЛЕ v.Сообщить('Привет, как дела ?') и ошибки НЕТ, т.к. метод «Сообщить» поддерживается OLE automation Object.
Вы невнимательно читаете мои сообщения (или совсем не делали импорт-экспорт между 1С и Delphi, C++ Builder и т.д. через OLE). Ибо не все команды языка 1С можно подтянуть НАПРЯМУЮ через OLE (к примеру фразу типа «Если ДокСсылка <> Документы.СчетНаОплатуПокупателю.ПустаяСсылка() Тогда»). В версии 7.7 был ExecuteBatch и все ОК.
Скорее всего сами разработчики 1С где-то дали маху и полноценной замены ExecuteBatch нет.
"
08.06.2009
00:30
#10
"Доброго всем времени суток!
Нашел кто-нибудь способ использовать метод Выполнить на стороне COM-соединения?
Констуркция, приведенная выше:
v := CreateOleObject('v81.Application'); - OK
v.Connect(s); - OK
v.Execute('Сообщить("Привет, как дела ?");'); - Ошибка «Method 'Execute' not supported by automation object.»
не сработает, т.к. на стороне COM-соединения по идее нет интерфейсной части, соответственно недоступны Сообщить(), Предупреждение() и иже с ними. Однако у меня не работает и такая:
v81 = Новый COMОбъект("v81.Application"); //выполняется
v81.Execute("a=2;"); //ошибка - метод Execute() не обнаружен...
Подскажите пожалуйста решение, если кто делал... Заранее благадарен
P.S. Через v81.COMConnector тоже пробовал - результат аналогичен..."
Нашел кто-нибудь способ использовать метод Выполнить на стороне COM-соединения?
Констуркция, приведенная выше:
v := CreateOleObject('v81.Application'); - OK
v.Connect(s); - OK
v.Execute('Сообщить("Привет, как дела ?");'); - Ошибка «Method 'Execute' not supported by automation object.»
не сработает, т.к. на стороне COM-соединения по идее нет интерфейсной части, соответственно недоступны Сообщить(), Предупреждение() и иже с ними. Однако у меня не работает и такая:
v81 = Новый COMОбъект("v81.Application"); //выполняется
v81.Execute("a=2;"); //ошибка - метод Execute() не обнаружен...
Подскажите пожалуйста решение, если кто делал... Заранее благадарен
P.S. Через v81.COMConnector тоже пробовал - результат аналогичен..."
- 1
- 2
Читают тему
(гостей: 1)