@maestro_danya

Можно ли передать процедуру на выполнение в базу 1С через Python?

Приветствую!
Начинаю знакомиться с Python и выгрузками, с работой запросов в 1С в принципе не знаком.
Я хочу подключиться к базе 1С и выгрузить из нее данные через Python. (использую библиотеку win32com.client).
В службах компонентов все настроил, подключился к 1С и выгрузил данные со следующим запросом:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
 ФизическиеЛицаКонтактнаяИнформация.Тип КАК Тип,
 ФизическиеЛицаКонтактнаяИнформация.Вид КАК Вид,
 ФизическиеЛицаКонтактнаяИнформация.Представление КАК Представление,
 ФизическиеЛицаКонтактнаяИнформация.НомерТелефона КАК НомерТелефона
ИЗ
 Справочник.ФизическиеЛица.КонтактнаяИнформация КАК ФизическиеЛицаКонтактнаяИнформация"


Все работает, отлично.
Могу ли я передать не просто запрос 1с "Выбрать ЧТО-то Из ЧЕГО-ТО", а целую процедуру с циклами и прочим? или проще договориться с 1С-программистом, чтобы переписал под формат обычного запроса?
Прошу не писать про web-сервис, выкладывать в сеть базу мне не дадут)).

Скрипт "километровой" процедурки на языке 1С:
Сразу извините за внешний вид скрипта, пришлось пожертвовать несколькими группировками и выводом столбцов, чтобы уложиться в 10к символов вопроса)) Прошу оценить именно функциональность скрипта и возможность использования его через python. В данном виде он работать явно не будет.

Нач=НачДата;
Кон=КонДата;
Макет=ПолучитьМакет("Макет");
ОбластьШапка=Макет.ПолучитьОбласть("Шапка");
ОбластьЗаголовок=Макет.ПолучитьОбласть("Заголовок");
ОбластьСтрока=Макет.ПолучитьОбласть("Строка");
ОбластьСтрока1=Макет.ПолучитьОбласть("Строка1");
ОбластьШапка.Параметры.Организация=Организация;
ОбластьШапка.Параметры.Период=ПредставлениеПериода(Нач,Кон);
ЕслиНЕрассылка="РАССЫЛКА"Тогда
ТабДок.Вывести(ОбластьШапка);
КонецЕсли;
ТабДок.Вывести(ОбластьЗаголовок);
Тел=НовыйТаблицаЗначений;
Тел.Колонки.Добавить("ФЛ");
Тел.Колонки.Добавить("Вид");
Тел.Колонки.Добавить("Представление");
Мэйл=НовыйТаблицаЗначений;
Мэйл.Колонки.Добавить("ФЛ");
Мэйл.Колонки.Добавить("Вид");
Мэйл.Колонки.Добавить("Представление");
Запрос=НовыйЗапрос;
Запрос.Текст=
"ВЫБРАТЬРАЗРЕШЕННЫЕ
|ФизическиеЛицаКонтактнаяИнформация.СсылкаКАКФЛ,
|ФизическиеЛицаКонтактнаяИнформация.ТипКАКТип,
|ИЗ
|Справочник.ФизическиеЛица.КонтактнаяИнформацияКАКФизическиеЛицаКонтактнаяИнформация
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.УстановитьПараметр("ПометкаУдаления",Ложь);
РезультатЗапроса=Запрос.Выполнить();
ВыборкаДетальныеЗаписи=РезультатЗапроса.Выбрать();
ПокаВыборкаДетальныеЗаписи.Следующий()Цикл
Если(СокрЛП(ВыборкаДетальныеЗаписи.Тип)="Телефон")и(СокрЛП(ВыборкаДетальныеЗаписи.Представление)<>"")Тогда
НоваяСтрока=Тел.Добавить();
НоваяСтрока.ФЛ=ВыборкаДетальныеЗаписи.ФЛ;
КонецЕсли;
Если(СокрЛП(ВыборкаДетальныеЗаписи.Тип)="Адресэлектроннойпочты")и(СокрЛП(ВыборкаДетальныеЗаписи.Представление)<>"")Тогда
НоваяСтрока=Мэйл.Добавить();
НоваяСтрока.Представление=ВыборкаДетальныеЗаписи.Представление;
КонецЕсли;
КонецЦикла;
//Получимтаблицуподоп.образованиюфиз.лиц
Образование=НовыйТаблицаЗначений;
Образование.Колонки.Добавить("ФЛ");
Образование.Колонки.Добавить("УчебноеЗаведение");
Запрос=НовыйЗапрос;
Запрос.Текст=
"ВЫБРАТЬ
|ОбразованиеФизическихЛиц.ВладелецКАКВладелец,
|ОбразованиеФизическихЛиц.УчебноеЗаведениеКАКУчебноеЗаведение,
|ИЗ
|Справочник.ОбразованиеФизическихЛицКАКОбразованиеФизическихЛиц
|ГДЕ
|ОбразованиеФизическихЛиц.ПометкаУдаления=&ПометкаУдаления
|УПОРЯДОЧИТЬПО
|Владелец
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.УстановитьПараметр("ПометкаУдаления",Ложь);
ПокаВыборкаДетальныеЗаписи.Следующий()Цикл
НоваяСтрока=Образование.Добавить();
КонецЦикла;
//Основнойзапрос
Запрос=НовыйЗапрос;
Запрос.Текст="
|ВЫБРАТЬРАЗРЕШЕННЫЕРАЗЛИЧНЫЕ
|ДанныеДляПодбораСотрудников.СотрудникКАКСотрудник,
|ДанныеДляПодбораСотрудников.ДолжностьКАКДолжность,
|ПОМЕСТИТЬДолжностьВидЗанятостиСтавка
|ИЗ
|РегистрСведений.ДанныеДляПодбораСотрудниковКАКДанныеДляПодбораСотрудников
|ЛЕВОЕСОЕДИНЕНИЕ(ВЫБРАТЬ
|ДанныеДляПодбораСотрудников.СотрудникКАКСотрудник,
|МАКСИМУМ(ДанныеДляПодбораСотрудников.Начало)КАКНачало
|ИЗ
|РегистрСведений.ДанныеДляПодбораСотрудниковКАКДанныеДляПодбораСотрудников
|ГДЕ
|ДанныеДляПодбораСотрудников.Организация=&Организация
|ИДанныеДляПодбораСотрудников.Начало<=&ДатаКон
|СГРУППИРОВАТЬПО
|ДанныеДляПодбораСотрудников.Сотрудник)КАКВложенныйЗапрос
|ПО(ДанныеДляПодбораСотрудников.Сотрудник=ВложенныйЗапрос.Сотрудник)
|ГДЕ
|ДанныеДляПодбораСотрудников.Организация=&Организация
|ИДанныеДляПодбораСотрудников.Начало=ВложенныйЗапрос.Начало
|ВЫБРАТЬРАЗРЕШЕННЫЕРАЗЛИЧНЫЕ
|ДанныеДляПодбораСотрудников.СотрудникКАКСотрудник,
|ДанныеДляПодбораСотрудников.ДолжностьКАКДолжностьДо,
|ИЗ
|РегистрСведений.ДанныеДляПодбораСотрудниковКАКДанныеДляПодбораСотрудников
|ЛЕВОЕСОЕДИНЕНИЕ(ВЫБРАТЬ
|ДанныеДляПодбораСотрудников.СотрудникКАКСотрудник,
|МАКСИМУМ(ДанныеДляПодбораСотрудников.Начало)КАКНачало
|ИЗ
|РегистрСведений.ДанныеДляПодбораСотрудниковКАКДанныеДляПодбораСотрудников
|ГДЕ
|ДанныеДляПодбораСотрудников.Организация=&Организация
|ИДанныеДляПодбораСотрудников.Начало<&ДатаНач
|ВЫБРАТЬРАЗРЕШЕННЫЕ
|СостоянияСотрудниковСрезПоследних.СотрудникКАКСотрудник,
|ПОМЕСТИТЬСтатусКон
|ИЗ
|РегистрСведений.СостоянияСотрудников.СрезПоследних(&ДатаКон,)КАКСостоянияСотрудниковСрезПоследних
|ЛЕВОЕСОЕДИНЕНИЕ(ВЫБРАТЬ
|СостоянияСотрудниковСрезПоследних.СотрудникКАКСотрудник,
|МАКСИМУМ(СостоянияСотрудниковСрезПоследних.Период)КАКПериодКон
|ИЗ
|РегистрСведений.СостоянияСотрудников.СрезПоследних(&ДатаКон,)КАКСостоянияСотрудниковСрезПоследних
|ВЫБРАТЬРАЗРЕШЕННЫЕ
|СостоянияСотрудниковСрезПоследних.СотрудникКАКСотрудник,
|СостоянияСотрудниковСрезПоследних.СостояниеКАКСостояние,
|СостоянияСотрудниковСрезПоследних.ПериодКАКПериод
|ПОМЕСТИТЬСтатусНач
|ИЗ
|РегистрСведений.СостоянияСотрудников.СрезПоследних(&ДатаНач,)КАКСостоянияСотрудниковСрезПоследних
|ЛЕВОЕСОЕДИНЕНИЕ(ВЫБРАТЬ
|ИЗ
|РегистрСведений.СостоянияСотрудников.СрезПоследних(&ДатаНач,)КАКСостоянияСотрудниковСрезПоследних
|СГРУППИРОВАТЬПО
|СостоянияСотрудниковСрезПоследних.Сотрудник)КАКВложенныйЗапрос
|ПОСостоянияСотрудниковСрезПоследних.Сотрудник=ВложенныйЗапрос.Сотрудник
|ГДЕ
|СостоянияСотрудниковСрезПоследних.Период=ВложенныйЗапрос.ПериодНач
|ИСостоянияСотрудниковСрезПоследних.Состояние<>&Уволен
|;
|ВЫБРАТЬ
|Медосмотры.ВладелецКАКВладелец,
|Медосмотры.ДатаОсмотраКАКДатаОсмотра,
|Медосмотры.ПримечаниеКАКПримечание
|ПОМЕСТИТЬМедосмотры
|ИЗ
|(ВЫБРАТЬ
|Медосмотры.ВладелецКАКВладелец,
|МАКСИМУМ(Медосмотры.ДатаОсмотра)КАКДатаОсмотра
|ИЗ
|Справочник.МедосмотрыКАКМедосмотры
|ГДЕ
|Медосмотры.ПометкаУдаления=&ПометкаУдаления
|СГРУППИРОВАТЬПО
|Медосмотры.Владелец)КАКВложенныйЗапрос
|ВЫБРАТЬ
|ТекущиеКадровыеДанныеСотрудников.СотрудникКАКСотрудник,
|ТекущиеКадровыеДанныеСотрудников.ДатаПриемаКАКДатаПриема,
|ТекущиеКадровыеДанныеСотрудников.ДатаУвольненияКАКДатаУвольнения
|ПОМЕСТИТЬПриемУвольнение
|ИЗ
|РегистрСведений.ТекущиеКадровыеДанныеСотрудниковКАКТекущиеКадровыеДанныеСотрудников
|ВЫБРАТЬРАЗРЕШЕННЫЕ
|ДолжностьВидЗанятостиСтавка.Сотрудник.ФизическоеЛицоКАКФИО,
|ДолжностьВидЗанятостиСтавка.ДолжностьКАКДолжность,
|ВЫБОР
|КОГДАПриемУвольнение.ДатаУвольнения>=&ДатаНач
|ИЛИПриемУвольнение.ДатаУвольнения=ДАТАВРЕМЯ(1,1,1,0,0,0)
|ТОГДАИСТИНА
|ИНАЧЕЛОЖЬ
|КОНЕЦКАКФильтрУвольнение,
|ВЫБОР
|КОГДАПриемУвольнение.ДатаПриема<=&ДатаКон
|ТОГДАИСТИНА
|ИНАЧЕЛОЖЬ
|КОНЕЦКАКФильтрПрием,
|ВЫБОР
|КОГДАПриемУвольнение.ДатаУвольнения>=&ДатаКон
|ИЛИПриемУвольнение.ДатаУвольнения=ДАТАВРЕМЯ(1,1,1,0,0,0)
|ТОГДА1
|ИНАЧЕ0
|КОНЕЦКАКРабота,
|ДолжностьВидЗанятостиСтавкаДо.ДолжностьДоКАКДолжностьДо,
|ДолжностьВидЗанятостиСтавкаДо.ВидЗанятостиДоКАКВидЗанятостиДо,
|ПОМЕСТИТЬПочтиГотово
|ИЗ
|ДолжностьВидЗанятостиСтавкаКАКДолжностьВидЗанятостиСтавка
|ЛЕВОЕСОЕДИНЕНИЕМедосмотрыКАКМедосмотры
|СГРУППИРОВАТЬПО
|ДолжностьВидЗанятостиСтавка.ВидЗанятости,
|ДолжностьВидЗанятостиСтавка.Должность,
|ДолжностьВидЗанятостиСтавка.КоличествоСтавок;

|ВЫБРАТЬ
|ПочтиГотово.ФИОКАКФИО,
|ГДЕ
|ПочтиГотово.ФильтрУвольнение
|
|УПОРЯДОЧИТЬПО
|ФИО
|АВТОУПОРЯДОЧИВАНИЕ";

Запрос.УстановитьПараметр("ПометкаУдаления",Ложь);
Запрос.УстановитьПараметр("ДатаКон",Кон);
РезультатЗапроса=Запрос.Выполнить();
ВыборкаОбщие=РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ПокаВыборкаОбщие.Следующий()Цикл
Если(ВыборкаОбщие.Должность<>ВыборкаОбщие.ДолжностьДо)или(ВыборкаОбщие.КоличествоСтавок<>ВыборкаОбщие.КоличествоСтавокДо)или(ВыборкаОбщие.ВидЗанятости<>ВыборкаОбщие.ВидЗанятостиДо)Тогда
Область=ОбластьСтрока1;
Иначе
Область=ОбластьСтрока
КонецЕсли;

Область.Параметры.ДолжностьДо=ВыборкаОбщие.ДолжностьДо;
Область.Параметры.СтавкаДо=ВыборкаОбщие.КоличествоСтавокДо;
Область.Параметры.ВидЗанятостиДо=ВыборкаОбщие.ВидЗанятостиДо;
Область.Параметры.Клиника=Организация;
Область.Параметры.КодКлиники=ВыборкаОбщие.КодКлиники;
Область.Параметры.СНИЛС=ВыборкаОбщие.СНИЛС;
ЕслиВыборкаОбщие.СостояниеКон=Перечисления.СостоянияСотрудника.ОтпускПоУходуЗаРебенкомТогда
Область.Параметры.ВОтпуске="Да";
Иначе
Область.Параметры.ВОтпуске="Нет";
КонецЕсли;
ЕслиРольДоступна("АдминистраторСистемы")Тогда
Область.Параметры.КС=ВыборкаОбщие.КС;
Иначе
Область.Параметры.КС="";
КонецЕсли;
//Сертификат
ОтборФЛ=НовыйСтруктура;
ОтборФЛ.Вставить("ФЛ",ВыборкаОбщие.ФИО);
ОбразованиеФЛ=Образование.НайтиСтроки(ОтборФЛ);
Сертификат="";
ДляКаждогоСтрИзОбразованиеФЛЦикл
Сертификат=Сертификат+СокрЛП(стр.ВидДокумента)+"Серия"+СокрЛП(стр.Серия)+"№"+СокрЛП(Стр.Номер)+"выдан"+СокрЛП(стр.ДатаВыдачи)+"Квалификация"+СокрЛП(стр.Квалификация+"Учебноезаведение:"+стр.УчебноеЗаведение)+";"+Символы.ПС+Символы.ПС;
КонецЦикла;
Область.Параметры.Сертификат=Сертификат;
Область.Параметры.Период=ПредставлениеПериода(Нач,Кон);
ТабДок.Вывести(Область);
КонецЦикла;
КонецПроцедуры
  • Вопрос задан
  • 127 просмотров
Пригласить эксперта
Ответы на вопрос 1
Mi11er
@Mi11er
A human...
Не очень понятно, у вас есть подключение по COM , но нет по HTTP локально ?
Конечно тут напрашивается HTTP сервис без лишнего гемора...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы