Экспорт в 1С 8.1 через OLE

Новая тема
Показывать по 10 20 40 сообщений
Я написал программу, которая считывает данные из 1С 8.1 и обрабатывает их. Все хорошо, все замечательно.

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

Перерыл весь интернет, нашел только информацию по 7.7 – это метод  ExecuteBatch (“команда на языке 1С”)  или  EvalExpr (“команда на языке 1С”)

Но в 8.1 этих методов нет !!!
Есть ли в 8.1 аналог команде ExecuteBatch?

OLE работает в две стороны по идее. Это всего лишь механизм манипулирования приложением из-вне его. Каким образом происходит считывание?
"Работающий фрагмент на считывание:
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-й версии?
"
Уважаемый вы забываете о том что есть OLE. Вы можете использовать методы и объекты того объекта с которым установили соединение. Метод "Выполнить" есть в 8.1,он никуда не делся. Только не забывайте что это метод глобального контекста. И не забывайте что через OLE передаются базовые типы (строка,число,дата).

Выполнить (Execute)
Синтаксис:
Выполнить(<Строка>)
Параметры:
<Строка>
Строка, содержащая текст исполняемого кода.
Описание:
Позволяет выполнить фрагмент кода, который передается ему в качестве строкового значения.
"Выдержка из синтаксис-помощника.

Выполнить (Execute)
Синтаксис:
Выполнить(<Строка>)
Параметры:
<Строка>
Строка, содержащая текст исполняемого кода.
Описание:
Позволяет выполнить фрагмент кода, который передается ему в качестве строкового значения.

Его можно использовать как внутри самой 1С, так скорее всего и как метод OLE-сервера.
Тока я бы все таки советовал использовать Ваш "v:= CreateOleObject('v81.Application');", а все остальное цепляется к нему как методы и атрибуты. Если есть механизм выгрузки, то и механизм загрузки луше выполнять таким же, имхо."
"Я это знаю, поэтому и задал вопрос на форуме. Вот пример кода:
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 ('Сообщить("Привет, как дела ?");');
то будет выполняться.
"
Ну как может выполниться метод "Сообщить" по OLE ? У вас что загружен интерфейс программы? Куда он его выведет? Вот программа и говорит что этот метод не поддерживается при запуске программы через атомейшен.
"Да причем тут свойство 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 нет.
"
Могу предложить попробовать соединиться через COM соединение.
"Доброго всем времени суток!
Нашел кто-нибудь способ использовать метод Выполнить на стороне 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)

Быстрый переход