Как запустить извне (из других программ) на выполнение проект Экстрактора, используя COM-соединение?

Примечание

Запустить извне (из других программ) на выполнение проект Экстрактора, используя COM-соединение возможно в версиях Экстрактора начиная с 3.5.3.132.

Это можно сделать с помощью методов для внешних вызовов:

  • InitializeQueue — процедура инициализации очереди проекта;

  • ExecuteProject — процедура запуска выполнения проекта.

текст модуля Экс_ВнешнийВызов
// InitializeQueue - процедура инициализации очереди проекта //Проект - это ссылка на проект //ИдентификаторСтроки - номер строки - можно не заполнять. Если передать номер строки, то выполнится только эта строка. //ТекстОшибки - в эту переменную записывается текст ошибки. ////////////////////////////////////////////////////////////// Функция InitializeQueue(Проект, ИдентификаторСтроки = Неопределено, ТекстОшибки = "") Экспорт ТекстОшибкиОбщий = ""; Если ИдентификаторСтроки = -1 ИЛИ ТипЗнч(ИдентификаторСтроки) <> Тип("Число") Тогда ИдентификаторСтроки = Неопределено; КонецЕсли; Если ИдентификаторСтроки <> Неопределено Тогда СтрокиПроекта = Проект.Транформация.НайтиСтроки(Новый Структура("ИдентификаторСтроки", ИдентификаторСтроки)); Иначе СтрокиПроекта = Проект.Транформация; КонецЕсли; Для каждого СтрокаПроекта Из СтрокиПроекта Цикл Если Не СтрокаПроекта.Выключено и СтрокаПроекта.ИспользоватьОчередьВыгрузки Тогда Обработчики = Проект.ОбработчикиСтроки.НайтиСтроки(Новый Структура("КлючСвязи, ОбработчикТип, Включено", СтрокаПроекта.КлючСвязи, Перечисления.Экс_ТипыОбработчиков.ПервичнаяИнициализация, Истина)); Для каждого СтрокаОбработчика Из Обработчики Цикл ОбработчикВид = СтрокаОбработчика.ОбработчикВид; Обработчик = Справочники.Экс_Обработчики.СтруктураОбработчика(СтрокаОбработчика.ОбработчикВид, СтрокаОбработчика.ОбработчикСсылка, СтрокаОбработчика.ОбработчикПредопределенный, СтрокаОбработчика.ОбработчикСтрока, СтрокаОбработчика.ОбработчикТип); Справочники.Экс_Обработчики.ВыполнитьОбработчикПервичнойИнициализацииОчередиСтрокиПроекта(Проект.Ссылка, СтрокаПроекта.ИдентификаторСтроки, Обработчик, СтрокаОбработчика.ОбработчикПараметры, ТекстОшибки); Если Не ПустаяСтрока(ТекстОшибки) Тогда ТекстОшибкиОбщий = ?(ПустаяСтрока(ТекстОшибкиОбщий), "", ТекстОшибкиОбщий + Символы.ПС) + ТекстОшибки; КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; Возврат ТекстОшибкиОбщий; КонецФункции ////////////////////////////////////////////////////////////// // ExecuteProject - процедура запуска выполнения проекта //Экс_МодульВыгрузки.ВыгрузитьПроект(Проект, ИдентификаторСтроки = Неопределено, ТекстОшибки, Знач ЗапускатьВФоне) //--------------------------запуск проекта, параметры процедуры: //Проект - это ссылка на проект //ИдентификаторСтроки - номер строки - можно не заполнять. Если передать номер строки, то выполнится только эта строка. //ТекстОшибки - в эту переменную записывается текст ошибки. //Если запущено в фоне, то возвращает идентификатор фонового задания, и тогда надо получать сообщения ФЗ. Если они есть - то это ошибки. //Также после запуска надо проанализировать ТекстОшибки, т.к. ФЗ могло не запуститься //Если запуск не в фоне, то ждем выполнения и анализируем ТекстОшибки //в нашем примере мы запустим проект не в фоне: ////////////////////////////////////////////////////////////// Функция ExecuteProject(Проект, ИдентификаторСтроки = Неопределено , ТекстОшибки = "", ЗапускатьВФоне = Истина) Экспорт ТекстОшибкиОбщий = ""; Если ИдентификаторСтроки = -1 ИЛИ ТипЗнч(ИдентификаторСтроки) <> Тип("Число") Тогда ИдентификаторСтроки = Неопределено; КонецЕсли; ИдентификаторФЗ = Экс_МодульВыгрузки.ВыгрузитьПроект(Проект, ИдентификаторСтроки, ТекстОшибки, ЗапускатьВФоне); Если ПустаяСтрока(ТекстОшибки) Тогда Если ЗначениеЗаполнено(ИдентификаторФЗ) Тогда ФЗ = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторФЗ); Попытка ФЗ.ОжидатьЗавершенияВыполнения(); Исключение ТекстОшибки = ОписаниеОшибки(); ТекстОшибкиОбщий = ?(ПустаяСтрока(ТекстОшибкиОбщий), "", ТекстОшибкиОбщий + Символы.ПС) + ТекстОшибки; КонецПопытки; Сообщения = ПолучитьСообщенияПользователю(); Для каждого Сообщение Из Сообщения Цикл ТекстОшибки = ТекстОшибки + Сообщение.Текст + Символы.ПС; КонецЦикла; Если Не ПустаяСтрока(ТекстОшибки) Тогда ТекстОшибкиОбщий = ?(ПустаяСтрока(ТекстОшибкиОбщий), "", ТекстОшибкиОбщий + Символы.ПС) + ТекстОшибки; КонецЕсли; КонецЕсли; Иначе ТекстОшибкиОбщий = ?(ПустаяСтрока(ТекстОшибкиОбщий), "", ТекстОшибкиОбщий + Символы.ПС) + ТекстОшибки; КонецЕсли; Возврат ТекстОшибкиОбщий; КонецФункции

Можете воспользоваться готовым скриптом модуля обработки

Пример обработки вызова команд инициализации очереди и выполнения проекта:

&НаСервере Процедура ВыполнитьНаСервере() Попытка Соединение = Новый COMОбъект ("V83.COMConnector"); Server = "Server"; // Сервер базы 1С Base = "Base"; //Имя базы 1С к которой выполняется Подключение Login = "Пользователь"; //Имя пользователя 1С для подключения к базе 1С Password = "Пароль"; //Пароль пользователя 1С для подключения к базе 1С Подключение = Соединение.connect("Srvr="""+Server+""";Ref="""+Base+""";usr="""+Login+""";Pwd="""+Password+""";"); //File="R:\bases\90223\7.0.46.2.2"; //строка подключения к файловой базе будет выглядеть примерно так: //Подключение = Соединитель.Connect("File=""c:\InfoBases\Trade"";Usr=""Director"";"); СоединениеУстановленоУспешно=Истина; Исключение СоединениеУстановленоУспешно=Ложь; КонецПопытки; Если СоединениеУстановленоУспешно Тогда // для нашего примера найдем какой-то проект по коду (Ссылку на проект) СсылкаПроекта=Подключение.Справочники.Экс_Проекты.НайтиПоКоду("85"); ТекстОшибки=""; Попытка Подключение.Экс_ВнешнийВызов.InitializeQueue(СсылкаПроекта,2); Подключение.Экс_ВнешнийВызов.ExecuteProject(СсылкаПроекта,2); Исключение Сообщить (ТекстОшибки); КонецПопытки; Сообщить ("Готово!"); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура КомандаВыполнить(Команда) ВыполнитьНаСервере(); КонецПроцедуры

Python-скрипт с примером использования методов для внешних вызовов:

from typing import Optional import pythoncom from traceback import print_exc import win32com.client class V83Extractor: def __init__(self, connection_string: str): self.connection_string = connection_string try: pythoncom.CoInitialize() self.com = win32com.client.Dispatch("V83.COMConnector") self.v83 = self.com.Connect(self.connection_string) print(f"Успешно подключились к 1С") except Exception as e: print(f"Error: {e}") print_exc() raise e self.ext_external_module = getattr(self.v83, "Экс_ВнешнийВызов") def query(self, q: str, properties: list[str]): query = self.v83.NewObject("Query", q) query_result = query.Execute().Choose() response = [] while query_result.next(): item = {} for prop in properties: item[prop] = getattr(query_result, prop) response.append(item) return response def get_project_ref(self, project_code: str): refs = getattr(self.v83, "Справочники") ex_projects = getattr(refs, "Экс_Проекты") project_ref = ex_projects.FindByCode(project_code) return project_ref def initialize_queue(self, project_ref, row_id: Optional[int] = None): """ Инициализировать очередь :param project_ref: Объект проекта :param row_id: Номер строки, для которой нужно инициализировать очередь. Если None, то инициализируется очередь для всего проекта """ self.ext_external_module.InitializeQueue(project_ref, row_id) def execute_project(self, project_ref, row_id: Optional[int] = None): """ Выполнить проект :param project_ref: Объект проекта :param row_id: Номер строки, которую нужно выполнить. Если None, то выполняется весь проект """ self.ext_external_module.ExecuteProject(project_ref, row_id) v83_extractor = V83Extractor(r"СТРОКА ПОДКЛЮЧЕНИЯ") project_42 = v83_extractor.get_project_ref("42") print(f"Наименование:", getattr(project_42, "Наименование")) v83_extractor.initialize_queue(project_42) v83_extractor.execute_project(project_42)