Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   Альтернативный метод ЗавершитьРаботуСистемы(0) для Com-объекта? (http://forums.kuban.ru/f1040/al-ternativnyj_metod_zavershit-rabotusistemy_0_dlya_com-ob-ekta-6791310.html)

US1C 06.05.2015 13:27

Альтернативный метод ЗавершитьРаботуСистемы(0) для Com-объекта?
 
Ситуевина:
Подключаюсь из 7-й базы к 7-й по OLE, для закрытия OLE-базы использую метод:
ДБ.ЗавершитьРаботуСистемы(0)
Подключаюсь из 8-й базы к 7-й, не работает этот метод.
Как еще можно закрыть базу?

endfilm 06.05.2015 13:32

создать в 7ке функцию завершения и вызвать ее

endfilm 06.05.2015 13:39

попробовать через оле.ExecuteBatch("ЗавершитьРаботуСистемы(0)")

для "встроенных функций" желательно использовать Англоязычный синоним.

1С-Предприятие в качестве OLE Automation сервера имеет 4 метода:

Initialize() - выполнить инициализацию системы 1С-Предприятие.
CreateObject() - Создает объект агрегатного типа данных 1С-Предприятия и возвращает ссылку на него.
EvalExpr() - Вычислить выражение системы 1С-Предприятие.
ExecuteBatch() - Выполнить последовательность операторов системы 1С-Предприятие.

[url]http://www.softpoint.ru/article_prn_id90.htm[/url]

US1C 06.05.2015 13:58

(1) Вносить изменения в конфигу - нежелательно. Там баз под 300 шт.
(2) Не прошло через ExecuteBatch. База так и осталась висеть. Причем даже после закрытия обработки в 8-ке, откуда она открывалась. В аналогичной ситуации с 7-ой, при закрытии обработки - ОЛЕ-базы закрывались сами.

US1C 06.05.2015 14:26

(2) А сейчас сработало. Странно все как-то.

endfilm 06.05.2015 14:51

а какая разница откуда Оле вызывать? хоть из javascript.
главное правильно передавать команды и что бы принимающая сторона их понимала.

US1C 06.05.2015 15:09

(5) Да вот, тоже не понимаю, какая разница откуда. Но почему из 7.7 работает такой метод:
Ит.ИспользоватьСубконто(,,1);//где Ит = ДБ.CreateObject("БухгалтерскиеИтоги");
А из 8.3 на этой строке прекращается выполнение процедуры?

VZ 06.05.2015 15:10

4-US1C > Ничего странного. Надо просто вызвать этот метод, и он сработает. Проверено.
И еще надо чуточку подумать [b][em]как[/em][/b] он сработает ;)

endfilm 06.05.2015 15:23

6-US1C > из 8.3 с какой ошибкой прекращается?

повторюсь, OLE это "транспорт" и транспорт системы, поэтому лучше использовать аналоги латинские функций.

VZ 06.05.2015 15:26

6-US1C > При использовании OLE-компоненты надо держать в голове несколько правил. В частности, этой компоненте не доступен интерактивный контекст, который обязательно существует при вызове конфы в "штатном" режиме.
И OLE-компонента не любит пропущенные аргументы.

US1C 06.05.2015 15:35

(8) Использовал UseSubconto. Те же яйца, вид сбоку.
(9) Вот именно с такими (пропущенными) аргументами у меня работает обработка в 7.7. Такое чувство, что в 8-ке OLE-база ведет себя иначе. Например, в 7.7 канает такой вызов:
Ит.ИспользоватьПланСчетов(ДБ.ПланыСчетов.Основной);
А в 8-ке только так прошло:
Ит.ИспользоватьПланСчетов(ДБ.ПланыСчетов.ЗначениеПоИдентификатору("Основной"));

US1C 06.05.2015 15:37

(8) перехватил ошибку:
Не удалось получить обороты по счетам 1-й группы. ({Форма.Форма.Форма(336)**: Ошибка при вызове метода контекста (UseSubconto): Типы не совпадают (1))

VZ 06.05.2015 15:38

8-endfilm > В принципе, можно и по русски :) Но помнить про ключ локализации при этом. Винда не обязана знать (и не знает) такие тонкости.
Безопаснее, конечно, использовать команды на латинице, но и это ничего не гарантирует, ибо поисковый индекс по наименованиям в "семерке" зависит от локализации.
Поэтому 1С [b]не рекомендует[/b] OLE в роли связующего звена.
P.S. При использовании клиента и сервера на локализованных виндах трудностей с русскоязычными командами не возникало.

endfilm 06.05.2015 15:39

10-US1C >
в 8ке провели унификацию.
а в 7ке использовали "постановки", там был не чистый OLE, а с "препроцессором".
Вот и понимала она твои переходы по объектам через "."

endfilm 06.05.2015 15:41

11-US1C > вот тебе и ответ - пропущенный параметр (1) преобразован не пойми во что.

endfilm 06.05.2015 15:44

12-VZ >
согласен с PS.
Но в отдельном случае, с исторически доставшимся обменом по ОЛЕ, натыкаюсь на то что в отладчике на русские имена ругается, и тут же на английские отвечает.
Винда и там и там локализованная.

US1C 06.05.2015 15:48

(14) А как мне передать пустой параметр (1)? Если бы какое-то конкретное значение - еще туда-сюда. Мне же нужно именно опустить значение, чтобы запрос по бухитогам собрал данные по всем субконто у требуемых счетов.

endfilm 06.05.2015 15:53

16-US1C >
4. Методы: EvalExpr() - вычислить выражение.

Синтаксис метода такой: EvalExpr(<СтрокаВыражения>), где:
<СтрокаВыражения> - строковое выражение, записанное на встроенном языке 1С-Предприятия.

Результатом выражения может быть число, строка, дата или значение любого агрегатного типа данных. Результат с неопределенным типом преобразуется к строковому типу.

endfilm 06.05.2015 15:54

хотя в этом случает ExecuteBatch()

VZ 06.05.2015 15:55

14-endfilm > Этот пропущенный параметр просто не контролирует незавершенные интерактивные сеансы.
Не в этом дело.
Правильно обратить внимание на [b]предопределенную[/b] функцию (которая есть во всех типовых) [b]ПриЗавершенииРаботыСистемы()[/b]

endfilm 06.05.2015 15:55

БазаОЛЕ.ExecuteBatch("Ит.ИспользоватьСубконто(,,1);");

endfilm 06.05.2015 15:57

19-VZ > а если не типовая? если нет так такой "предопределенной"?

VZ 06.05.2015 16:03

16-US1C > Нет такой сущности, как "пустой" параметр. Это кухонный язык.
Правильно: "значение по умолчанию". Часто совпадает с "желаемым". Но только "[em]часто[/em]". А если "дефолтное" хоть как-то зависит от "контекста"... В общем, OLE много имеет общего с шаманством. Бубен, заячья лапка, и бусы из CD :D

VZ 06.05.2015 16:05

21-endfilm > Что значит "если"? Тебе при разработке завязывают глаза?

endfilm 06.05.2015 16:13

23-VZ > если говорить в частном случае то конечно знаешь функции конфигурации и другие ее прелести.

но в рамках темы:
US1C (1) Вносить изменения в конфигу - нежелательно. Там баз под 300 шт.

US1C 06.05.2015 16:19

(22) В данном случае именно "пустой". В нем нужно передать ВидСубконто, по которому будет сделан запрос. Мне же нужно, чтобы запрос обошел все субконто указанных счетов.
(20) Попробую так. Я делал несколько иначе:
Ит.ExecuteBatch("ИспользоватьСубконто(,,1)");
Не взлетело.

US1C 06.05.2015 16:24

(20) Спасибо. Так сработало.
Теперь засел на "ВыполнитьЗапрос()".
Это какая-то засада.

VZ 06.05.2015 16:35

24-endfilm > И не надо. Я в OLE-передачах именно для ЗавершитьРаботуСистемы() предусмотрел наличие предопределенной функции, и обошелся без модификации ГМ.
Именно в этом случае это вполне возможно.
И опять же: ставить параметр (0) - [b]вредно[/b]. Это очень скверно, если прерываешь какие-то процессы.
Еще: при OLE [b]недопустимо[/b] вызывать формы. Если без этого нельзя обойтись (напр. служебная обработка задействована) изволь озаботится закрытием этой формы.
И иногда нужно дать возможность завершить неконтролируемый процесс (напр. длительное перепроведение) - через задание паузы.
Всякие есть методы для избежания "Не работает!". Лучший из них: выпрямление рук ;)

VZ 06.05.2015 16:44

26-US1C > Запрос активно использует контекст. Его специально надо конструировать, чтоб он не требовал локальных переменных. Запрос их не увидит. Напоминаю: локального контекста для OLE [b]нет[/b].

endfilm 06.05.2015 16:44

27-VZ > Франч?

endfilm 06.05.2015 16:45

26-US1C > говори что там за засада?
в общем то тоже решается все достаточно элементарно.

endfilm 06.05.2015 16:51

26-US1C >
посмотри здесь пример, что бы меньше собирать по крупицам
[url]http://www.lockator.com.ua/config1s/integration/71-buhzaprole.html[/url]

VZ 06.05.2015 16:55

29-endfilm > Нет. Сын ошибок трудных.

US1C 06.05.2015 17:03

(28) Это все понятно. Говорю же, что у меня нормально работает обработка из 7.7 по сбору бух.данных из 7-х и 8-х баз. Стал делать аналогичную обработку для сбора данных из 8-ки и практически все методы работы с ОЛЕ-базами 7-ки не работают. Каждый приходится допиливать методом тыка.
(30) Не работает такая конструкция:
ФлагРасчитаныБИ = ДБ.ExecuteBatch("Ит.ВыполнитьЗапрос("+Объект.НачДата+", "+Объект.КонДата+",СчетаБУ,,,,""Месяц"",);");
Если ФлагРасчитаныБИ = 0 Тогда
Возврат;
КонецЕсли;
Это уже переделаный метод, который в 7-ке работал так:
Если Ит.ВыполнитьЗапрос(НачДатаО, КонДатаО,СчетаБУ,,,,"Месяц",)=0 Тогда
ФлагРасчитаныБИ = 0;
Возврат;
КонецЕсли;

US1C 06.05.2015 17:04

(31) Там ничего нового не увидел. Через все это прошел раньше, когда мастырил обработку на 7.7

endfilm 06.05.2015 17:10

32-VZ > Хм. Тем более странно. Оле уже десятки лет и чужих граблей достаточно что бы своих ошибок не делать.
Это просто "транспортный уровень управления процессом",
И никак не связан с принципами работы 1С.

"прерывание процессов", "открытие форм" и прочие "перепроведения и паузы" полностью на ответственности разработчика 1С, и если он берет на себя ее то сам решает что использовать.

endfilm 06.05.2015 17:14

33-US1C > Эххх. и не запустится.

US1C 06.05.2015 17:19

(36) Это я уже понял. А как запустить-то?
P.S. Параметр СчетаБУ подправил (вывел за кавычки). Но воз и ныне там.

endfilm 06.05.2015 17:30

33-US1C >
1. ExecuteBatch - это просто выполнение кода.
Если с возвратом значения то EvalExpr

2.
связка 7.7<->7.7 имеет общие типовые объекты (строка,число,дата и тд). А если конфа единая то тем более.

связка 8.х<->7.7 ничего общего не имеет, кроме числа, строки, и булево. Даже даты разные.

3. все что ты пишешь внутри кавычек ДБ.ExecuteBatch("") то выполняется на стороне оле-экземпляра.

US1C 06.05.2015 17:33

(38) Спасибо. Буду править дальше.


Текущее время: 02:48. Часовой пояс GMT +3.