Новости для бухгалтера, бухучет, налогообложение, отчетность, ФСБУ, прослеживаемость и маркировка, 1С:Бухгалтерия

Вход или Регистрация

Показывать по 10 20 40 сообщений
Новая тема Ответить
Письмо в техподдержку 1С
[Прочее]

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

PowerUser
читатель
офлайн
Дата регистрации: 03.04.2008
Сообщений: 5
Пост №1
 
03.04.2008 15:08

Я написал программу, которая считывает данные из 1С 8.1 и обрабатывает их. Все хорошо, все замечательно.<br><br>Но руководство хочет, чтобы была и обратная совместимость: записывать данные в базу 1С.<br><br>Перерыл весь интернет, нашел только информацию по 7.7 – это метод ExecuteBatch (“команда на языке 1С”) или EvalExpr (“команда на языке 1С”)<br><br>Но в 8.1 этих методов нет !!!<br>Есть ли в 8.1 аналог команде ExecuteBatch? <br><br>

SiAl
читатель
офлайн
Дата регистрации: 09.04.2008
Сообщений: 29
Пост №2
 
09.04.2008 13:03

OLE работает в две стороны по идее. Это всего лишь механизм манипулирования приложением из-вне его. Каким образом происходит считывание?

PowerUser
читатель
офлайн
Дата регистрации: 03.04.2008
Сообщений: 5
Пост №3
 
09.04.2008 15:28

"Работающий фрагмент на считывание:<br>v:= CreateOleObject('v81.Application');<br>v.Connect(s);<br><br>Schet := v.Справочники.Контрагенты;<br><br>// Код 000000001 в справочникe 1С - это покупатели.<br>Schet_Select := Schet.Выбрать(Schet.НайтиПоКоду('000000001'));<br><br><br>while Schet_Select.Следующий() do<br> begin<br> if not Schet_Select.ЭтоГруппа then<br> begin<br> <br> ... < мои действия > ...<br><br> end; //if not Schet_Select.ЭтоГруппа<br> end; //while Schet_Select.Следующий()<br><br><br><br>А это фрагмент из конфигуратора 1С на запись:<br>ДокСсылка = Документы.СчетНаОплатуПокупателю.НайтиПоНомеру("АКА00000002",НачалоГода(ТекущаяДата()));<br> Если ДокСсылка <> Документы.СчетНаОплатуПокупателю.ПустаяСсылка() Тогда<br> ДокОбъект = ДокСсылка.ПолучитьОбъект();<br> ДокОбъект.СтатусОплаты = "Оплачен";<br> ДокОбъект.Записать();<br> КонецЕсли;<br><br>Если была бы версия 7.7, то я бы этот кусок просто подставил бы в v.ExecuteBatch(<набор строк на языке 1С>) и нет проблем, но в 8-й версии ExecuteBatch куда-то пропал.<br><br><br>Через OLE я выкрутился так:<br>doc_ssilka := v.Документы.СчетНаОплатуПокупателю.НайтиПоНомеру('АКА00000002','20081231101010');<br> doc_obj := doc_ssilka.ПолучитьОбъект();<br> doc_obj.СтатусОплаты := 'Оплачен';<br> doc_obj.Записать();<br><br>Пока работает, но я не знаю как через механизм OLE выполнить строку на проверку:<br> Если ДокСсылка <> Документы.СчетНаОплатуПокупателю.ПустаяСсылка() Тогда ...<br><br>Пробовал:<br> if doc_ssilka = Unassigned then ... – ошибка<br> if doc_ssilka = nil then ... - ошибка<br>и т.д.<br><br>Полноценная интеграция 1С с внешними программами через OLE могла в 7.7 реализовываться методом ExecuteBatch.<br>Существует же способ переслать на обработку массив строк, написанных на языке 1С? Ведь не могли же разработчики 1С убрать этот механизм в 8-й версии?<br>"

Станислав Зворыкин
читатель
офлайн
Дата регистрации: 20.03.2008
Сообщений: 128
Пост №4
 
09.04.2008 17:33

Уважаемый вы забываете о том что есть OLE. Вы можете использовать методы и объекты того объекта с которым установили соединение. Метод "Выполнить" есть в 8.1,он никуда не делся. Только не забывайте что это метод глобального контекста. И не забывайте что через OLE передаются базовые типы (строка,число,дата). <br><br>Выполнить (Execute)<br>Синтаксис:<br>Выполнить(<Строка>)<br>Параметры:<br><Строка><br>Строка, содержащая текст исполняемого кода.<br>Описание:<br>Позволяет выполнить фрагмент кода, который передается ему в качестве строкового значения.<br>

SiAl
читатель
офлайн
Дата регистрации: 09.04.2008
Сообщений: 29
Пост №5
 
09.04.2008 17:38

"Выдержка из синтаксис-помощника.<br><br>Выполнить (Execute)<br>Синтаксис:<br>Выполнить(<Строка>)<br>Параметры:<br><Строка><br>Строка, содержащая текст исполняемого кода.<br>Описание:<br>Позволяет выполнить фрагмент кода, который передается ему в качестве строкового значения.<br><br>Его можно использовать как внутри самой 1С, так скорее всего и как метод OLE-сервера.<br>Тока я бы все таки советовал использовать Ваш "v:= CreateOleObject('v81.Application');", а все остальное цепляется к нему как методы и атрибуты. Если есть механизм выгрузки, то и механизм загрузки луше выполнять таким же, имхо."

PowerUser
читатель
офлайн
Дата регистрации: 03.04.2008
Сообщений: 5
Пост №6
 
09.04.2008 18:20

"Я это знаю, поэтому и задал вопрос на форуме. Вот пример кода:<br>v := CreateOleObject('v81.Application'); - OK<br>v.Connect(s); - OK<br>v.Execute('Сообщить("Привет, как дела ?");'); - Ошибка «Method 'Execute' not supported by automation object.»<br><br>v := CreateOleObject('v81.Application'); - OK<br>v.Connect(s); - OK<br>v.Выполнить('Сообщить("Привет, как дела ?");'); - Ошибка «Method 'Выполнить' not supported by automation object.»<br><br>А если установлена версия 7.7 и написать:<br> v.ExecuteBatch ('Сообщить("Привет, как дела ?");');<br>то будет выполняться.<br>"

Станислав Зворыкин
читатель
офлайн
Дата регистрации: 20.03.2008
Сообщений: 128
Пост №7
 
10.04.2008 13:22

Ну как может выполниться метод "Сообщить" по OLE ? У вас что загружен интерфейс программы? Куда он его выведет? Вот программа и говорит что этот метод не поддерживается при запуске программы через атомейшен.

PowerUser
читатель
офлайн
Дата регистрации: 03.04.2008
Сообщений: 5
Пост №8
 
10.04.2008 15:07

"Да причем тут свойство Visible? Речь идет об Execute (Выполнить)<br>Вот фрагмент:<br>v := CreateOleObject('v81.Application'); - OK<br>v.Connect(s); - OK<br>v.Документы.СчетНаОплатуПокупателю.ПолучитьФормуСписка().Открыть(); - OK<br>v.visible := true; - OK<br>v.Выполнить('Сообщить("Привет, как дела ?");'); - Ошибка «Method 'Выполнить' not supported by automation object.»<br><br><br>Если бы я хотел выполнить вывод на экран фразы «Привет, как дела ?», то вот РАБОТАЮЩИЙ фрагмент:<br>v := CreateOleObject('v81.Application'); - OK<br>v.Connect(s); - OK<br>v.Сообщить('Привет, как дела ?'); - OK<br>v.visible := true; - OK<br><br>Здесь v.visible := true стоит ПОСЛЕ v.Сообщить('Привет, как дела ?') и ошибки НЕТ, т.к. метод «Сообщить» поддерживается OLE automation Object.<br>Вы невнимательно читаете мои сообщения (или совсем не делали импорт-экспорт между 1С и Delphi, C++ Builder и т.д. через OLE). Ибо не все команды языка 1С можно подтянуть НАПРЯМУЮ через OLE (к примеру фразу типа «Если ДокСсылка <> Документы.СчетНаОплатуПокупателю.ПустаяСсылка() Тогда»). В версии 7.7 был ExecuteBatch и все ОК.<br>Скорее всего сами разработчики 1С где-то дали маху и полноценной замены ExecuteBatch нет.<br>"

Станислав Зворыкин
читатель
офлайн
Дата регистрации: 20.03.2008
Сообщений: 128
Пост №9
 
10.04.2008 15:44

Могу предложить попробовать соединиться через COM соединение.

1cproger
читатель
офлайн
Дата регистрации: 08.06.2009
Сообщений: 1
Пост №10
 
08.06.2009 00:30

"Доброго всем времени суток!<br>Нашел кто-нибудь способ использовать метод Выполнить на стороне COM-соединения?<br>Констуркция, приведенная выше:<br>v := CreateOleObject('v81.Application'); - OK<br>v.Connect(s); - OK<br>v.Execute('Сообщить("Привет, как дела ?");'); - Ошибка «Method 'Execute' not supported by automation object.»<br>не сработает, т.к. на стороне COM-соединения по идее нет интерфейсной части, соответственно недоступны Сообщить(), Предупреждение() и иже с ними. Однако у меня не работает и такая:<br>v81 = Новый COMОбъект("v81.Application"); //выполняется<br>v81.Execute("a=2;"); //ошибка - метод Execute() не обнаружен...<br>Подскажите пожалуйста решение, если кто делал... Заранее благадарен<br>P.S. Через v81.COMConnector тоже пробовал - результат аналогичен..."

Показывать по 10 20 40 сообщений

Читают тему:

Быстрый переход
Для технических специалистов
  • Книга жалоб и предложений по работе сайта
  • Для технических специалистов
  • Представление регламентированной отчетности
  • Говорильня
  • Бухгалтерский учет: обсуждаем проекты нормативных актов и рекомендаций по ведению учета от БМЦ
  • Новый порядок применения ККТ (онлайн кассы с передачей сведений в ФНС)
  • Интернет-конференция: Оформление командировок по новым правилам
  • МАРКИРОВКА
  • ЕГАИС
  • Учет, налогообложение, автоматизация