Имя: Пароль:
1C
1С v8
Как выполнить произвольный код 1С через COM-соединение?
0 fisher
 
04.05.12
17:49
Пытаюсь через Выполнить() - ругается что нет такого метода...
1 andrewks
 
04.05.12
17:50
Execute()
2 fisher
 
04.05.12
17:54
Аналогичная фигня.
3 andrewks
 
04.05.12
17:54
код давай
4 fisher
 
04.05.12
17:54
Соединение активно, к глобальному контексту доступ дает.
5 kuromanlich
 
04.05.12
17:54
COMconnect.Execute()  ?
6 fisher
 
04.05.12
17:55
Блин. Какой еще код нужен?
Выполнить() :)
7 andrewks
 
04.05.12
17:56
(6) переработал?
8 fisher
 
04.05.12
17:59
Возможно. Но все равно грит нету такого метода :(
9 andrewks
 
04.05.12
17:59
т.е. код не покажешь?
10 fisher
 
04.05.12
18:01
Какой конкретно код интересует? Получения подключения? Моих слов что оно активно и работает - недостаточно?
11 fisher
 
04.05.12
18:04
То, что я это делаю в серверной процедуре УФ имеет значение?
Вроде в СП написано, что оператор не поддерживается только в режиме запуска веб-клиента...
12 kuromanlich
 
04.05.12
18:05
COMconnect.Execute("а=1")

не пашет?
13 fisher
 
04.05.12
18:07
Нет
14 fisher
 
04.05.12
18:10
Сразу ругается что метод объекта не обнаружен. При этом остальное все что угодно через это соединение - без проблем делается.
15 fisher
 
04.05.12
18:19
Я вообще перестал что-то понимать...
Например, COMconnect.ПолучитьИмяВременногоФайла() отрабатывает нормально, а COMconnect.ТекущаяДата() - тоже метод не обнаружен... Англоязычные синонимы ничего не лечат.
16 fisher
 
04.05.12
18:36
Я правильно понял, что у всех в аналогичных условиях работает и один я лысый?
17 Ахиллес
 
04.05.12
18:37
Ты случайно не на эти грабли наступил?
Примечание:
В режиме запуска веб-клиент оператор не поддерживается и его вызов игнорируется.
18 fisher
 
04.05.12
18:39
(17) См. (11)
Я уже эту хрень в экспортную процедуру модуля отчета засунул - те же грабли.
У меня вообще режим запуска - обычное приложение, но с использованием УФ.
19 andrewks
 
04.05.12
18:40
(18) "обычное приложение, но с использованием УФ"

это как? может, имел в виду толстый клиент, но УП?
20 fisher
 
04.05.12
18:45
(19) Это так: основной режим запуска в конфе стоит "обычное приложение". Идет работа в толстом клиенте с использованием управляемых форм.
Но дело не в этом. Я уже в обычной форме на толстом клиенте проверил - та же фигня. Кто-то реально юзал Выполнить/Execute через COM-соединение?
21 fisher
 
04.05.12
18:47
Уже и права проверил... Не знаю, куда еще глянуть можно.
Реально оно хоть работает? Или чисто теоретики тут советуют?
22 andrewks
 
04.05.12
18:54
у тебя V82.Application, или прямо v8.ComConnector?
23 andrewks
 
04.05.12
18:56
видимо, придётся тебе написать процедурку в общем модуле, и обращаться к ней
24 fisher
 
04.05.12
19:05
(22) V82.COMConnector
25 fisher
 
04.05.12
19:17
(23) Да придумаю как выкрутиться. Просто хотелось прояснить на будущее - это я граблями неправильно загребаю или в 1С забыли этот момент задокументировать.
Отзовитесь, кто реально юзал.
Чтобы хоть понять - стоит дальше рыть землю или плюнуть и обходить.
26 Лоботряс
 
04.05.12
19:25
// Функция выполняет компоновку во внешнем соединении.
// Возвращается результат компоновки.
Функция ВыполнитьКомпоновкуВоВнешнемСоединении(Соединение, МакетКомпоновки, ДанныеРасшифровки) Экспорт
       
   Если ДанныеРасшифровки = Неопределено Тогда
       // Данные расшифровки заполнять не нужно
       // Макет компоновки будем передавать в виде строки
       Результат = Соединение.ВыполнитьКомпоновкуСтрока(ЗначениеВСтрокуXML(МакетКомпоновки), Неопределено);
       
   Иначе
       // Данные расшифровки заполнять нужно
       // Макет компоновки и данные расшифровки будем передавать в виде строки
       Результат = Соединение.ВыполнитьКомпоновкуСтрока(ЗначениеВСтрокуXML(МакетКомпоновки), ЗначениеВСтрокуXML(ДанныеРасшифровки));
       
       // Прочитаем данные расшифровки из строки
       ДанныеРасшифровки = ЗначениеИзСтрокиXML(Результат.ДанныеРасшифровки);
       
   КонецЕсли;
   
   // Прочитаем результат из строки
   Возврат МассивИзСтрокиXML(Результат.Результат);
   
КонецФункции

// Функция выполняет копмоновку и помещает элементы результата в массив.
// Возвращается массив элементов результата
Функция ВыполнитьКомпоновкуВМассив(МакетКомпоновки, ДанныеРасшифровки) Экспорт
   
   // Создадим массив, в который будем помещать элементы результата
   МассивЭлементовРезультата = Новый Массив;
   
   // Создадим и инициализируем процессор компоновки
   ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
   ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ,ДанныеРасшифровки, Истина);
   
   // Основной цикл вывода отчета
   Пока Истина Цикл

       // Получим следующий элемент результата компоновки
       ЭлементРезультата = ПроцессорКомпоновки.Следующий();

       Если ЭлементРезультата = Неопределено Тогда
           // Следующий элемент не получен - заканчиваем цикл вывода
           Прервать;

       Иначе
           // Элемент получен - выведем его при помощи процессора вывода
           МассивЭлементовРезультата.Добавить(ЭлементРезультата);

       КонецЕсли;

   КонецЦикла;
   
   Возврат МассивЭлементовРезультата;
   
КонецФункции

// Функция выполняет компоновку. Результат возвращается в виде строки,
// содержащей внутреннее представление массива элементов результата компоновки данных.
Функция ВыполнитьКомпоновкуСтрока(МакетКомпоновкиСтрока, ДанныеРасшифровкиСтрока) Экспорт
   
   Перем ДанныеРасшифровки;
   
   // Загрузим макет компоновки из переданной строки
   МакетКомпоновки = ЗначениеИзСтрокиXML(МакетКомпоновкиСтрока);
   
   Если ДанныеРасшифровкиСтрока <> Неопределено Тогда
       // Если передали расшифровку - получим ее из строки
       ДанныеРасшифровки = ЗначениеИзСтрокиXML(ДанныеРасшифровкиСтрока);
       
   КонецЕсли;
   
   // Создадим структуру результата
   Результат = Новый Структура("Результат, ДанныеРасшифровки");
   
   Если ДанныеРасшифровки = Неопределено Тогда
       // Данные расшифровки не передали
       Результат.Результат = МассивВСтрокуXML(ВыполнитьКомпоновкуВМассив(МакетКомпоновки, Неопределено));
       
   Иначе
       // Данные расшифровки передали
       Результат.Результат = МассивВСтрокуXML(ВыполнитьКомпоновкуВМассив(МакетКомпоновки, ДанныеРасшифровки));
       // Предбразуем данные расшифровки в строку
       Результат.ДанныеРасшифровки = ЗначениеВСтрокуXML(ДанныеРасшифровки);
       
   КонецЕсли;
   
   Возврат Результат;
   
КонецФункции
27 Адинэснег
 
04.05.12
19:28
(0) а может в куй этот com и запилить вэб-сервис?
28 Лоботряс
 
04.05.12
19:30
29 МишКа
 
04.05.12
19:50
Вместо V82.COMConnector
надо использовать V82.Application
30 Ахиллес
 
04.05.12
19:51
(25) Плюнуть и обходить.
Например в модуле внешнего соединения запилить экспортную функцию
СделатьНазлоОдинэсу(БудетПоМоему) Экспорт
Выполнить(БудетПоМоему);
И вызывать это уже по ком соединению.
31 fisher
 
04.05.12
19:54
(29) Я прекрасно знаю разницу.
(30) Так скорее всего и будет. Выше Лоботряс выложил универсальное решение в этом стиле, за что ему спасибо.
32 fisher
 
04.05.12
19:57
Тьфу блин, я уже сам ветки путаю :)
Лоботряс выложил универсальное решение для этой задачи v8: Выполнение отчета СКД через COM. Не получается :(, которая тоже напрямую через COM не решается
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс