К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

Альтернативный метод ЗавершитьРаботуСистемы(0) для Com-объекта?

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



Гость
1 - 06.05.2015 - 13:32
создать в 7ке функцию завершения и вызвать ее
Гость
2 - 06.05.2015 - 13:39
попробовать через оле.ExecuteBatch("ЗавершитьРаботуСистемы(0)")

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

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

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

http://www.softpoint.ru/article_prn_id90.htm
Гость
3 - 06.05.2015 - 13:58
(1) Вносить изменения в конфигу - нежелательно. Там баз под 300 шт.
(2) Не прошло через ExecuteBatch. База так и осталась висеть. Причем даже после закрытия обработки в 8-ке, откуда она открывалась. В аналогичной ситуации с 7-ой, при закрытии обработки - ОЛЕ-базы закрывались сами.
Гость
4 - 06.05.2015 - 14:26
(2) А сейчас сработало. Странно все как-то.
Гость
5 - 06.05.2015 - 14:51
а какая разница откуда Оле вызывать? хоть из javascript.
главное правильно передавать команды и что бы принимающая сторона их понимала.
Гость
6 - 06.05.2015 - 15:09
(5) Да вот, тоже не понимаю, какая разница откуда. Но почему из 7.7 работает такой метод:
Ит.ИспользоватьСубконто(,,1);//где Ит = ДБ.CreateObject("БухгалтерскиеИтоги");
А из 8.3 на этой строке прекращается выполнение процедуры?
Гость
7 - 06.05.2015 - 15:10
4-US1C > Ничего странного. Надо просто вызвать этот метод, и он сработает. Проверено.
И еще надо чуточку подумать как он сработает ;)
Гость
8 - 06.05.2015 - 15:23
6-US1C > из 8.3 с какой ошибкой прекращается?

повторюсь, OLE это "транспорт" и транспорт системы, поэтому лучше использовать аналоги латинские функций.
Гость
9 - 06.05.2015 - 15:26
6-US1C > При использовании OLE-компоненты надо держать в голове несколько правил. В частности, этой компоненте не доступен интерактивный контекст, который обязательно существует при вызове конфы в "штатном" режиме.
И OLE-компонента не любит пропущенные аргументы.
Гость
10 - 06.05.2015 - 15:35
(8) Использовал UseSubconto. Те же яйца, вид сбоку.
(9) Вот именно с такими (пропущенными) аргументами у меня работает обработка в 7.7. Такое чувство, что в 8-ке OLE-база ведет себя иначе. Например, в 7.7 канает такой вызов:
Ит.ИспользоватьПланСчетов(ДБ.ПланыСчетов.Основной) ;
А в 8-ке только так прошло:
Ит.ИспользоватьПланСчетов(ДБ.ПланыСчетов.ЗначениеП оИдентификатору("Основной"));
Гость
11 - 06.05.2015 - 15:37
(8) перехватил ошибку:
Не удалось получить обороты по счетам 1-й группы. ({Форма.Форма.Форма(336)**: Ошибка при вызове метода контекста (UseSubconto): Типы не совпадают (1))
Гость
12 - 06.05.2015 - 15:38
8-endfilm > В принципе, можно и по русски :) Но помнить про ключ локализации при этом. Винда не обязана знать (и не знает) такие тонкости.
Безопаснее, конечно, использовать команды на латинице, но и это ничего не гарантирует, ибо поисковый индекс по наименованиям в "семерке" зависит от локализации.
Поэтому 1С не рекомендует OLE в роли связующего звена.
P.S. При использовании клиента и сервера на локализованных виндах трудностей с русскоязычными командами не возникало.
Гость
13 - 06.05.2015 - 15:39
10-US1C >
в 8ке провели унификацию.
а в 7ке использовали "постановки", там был не чистый OLE, а с "препроцессором".
Вот и понимала она твои переходы по объектам через "."
Гость
14 - 06.05.2015 - 15:41
11-US1C > вот тебе и ответ - пропущенный параметр (1) преобразован не пойми во что.
Гость
15 - 06.05.2015 - 15:44
12-VZ >
согласен с PS.
Но в отдельном случае, с исторически доставшимся обменом по ОЛЕ, натыкаюсь на то что в отладчике на русские имена ругается, и тут же на английские отвечает.
Винда и там и там локализованная.
Гость
16 - 06.05.2015 - 15:48
(14) А как мне передать пустой параметр (1)? Если бы какое-то конкретное значение - еще туда-сюда. Мне же нужно именно опустить значение, чтобы запрос по бухитогам собрал данные по всем субконто у требуемых счетов.
Гость
17 - 06.05.2015 - 15:53
16-US1C >
4. Методы: EvalExpr() - вычислить выражение.

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

Результатом выражения может быть число, строка, дата или значение любого агрегатного типа данных. Результат с неопределенным типом преобразуется к строковому типу.
Гость
18 - 06.05.2015 - 15:54
хотя в этом случает ExecuteBatch()
Гость
19 - 06.05.2015 - 15:55
14-endfilm > Этот пропущенный параметр просто не контролирует незавершенные интерактивные сеансы.
Не в этом дело.
Правильно обратить внимание на предопределенную функцию (которая есть во всех типовых) ПриЗавершенииРаботыСистемы()
Гость
20 - 06.05.2015 - 15:55
БазаОЛЕ.ExecuteBatch("Ит.ИспользоватьСубконто(,,1) ;");
Гость
21 - 06.05.2015 - 15:57
19-VZ > а если не типовая? если нет так такой "предопределенной"?
Гость
22 - 06.05.2015 - 16:03
16-US1C > Нет такой сущности, как "пустой" параметр. Это кухонный язык.
Правильно: "значение по умолчанию". Часто совпадает с "желаемым". Но только "часто". А если "дефолтное" хоть как-то зависит от "контекста"... В общем, OLE много имеет общего с шаманством. Бубен, заячья лапка, и бусы из CD :D
Гость
23 - 06.05.2015 - 16:05
21-endfilm > Что значит "если"? Тебе при разработке завязывают глаза?
Гость
24 - 06.05.2015 - 16:13
23-VZ > если говорить в частном случае то конечно знаешь функции конфигурации и другие ее прелести.

но в рамках темы:
US1C (1) Вносить изменения в конфигу - нежелательно. Там баз под 300 шт.
Гость
25 - 06.05.2015 - 16:19
(22) В данном случае именно "пустой". В нем нужно передать ВидСубконто, по которому будет сделан запрос. Мне же нужно, чтобы запрос обошел все субконто указанных счетов.
(20) Попробую так. Я делал несколько иначе:
Ит.ExecuteBatch("ИспользоватьСубконто(,,1)");
Не взлетело.
Гость
26 - 06.05.2015 - 16:24
(20) Спасибо. Так сработало.
Теперь засел на "ВыполнитьЗапрос()".
Это какая-то засада.
Гость
27 - 06.05.2015 - 16:35
24-endfilm > И не надо. Я в OLE-передачах именно для ЗавершитьРаботуСистемы() предусмотрел наличие предопределенной функции, и обошелся без модификации ГМ.
Именно в этом случае это вполне возможно.
И опять же: ставить параметр (0) - вредно. Это очень скверно, если прерываешь какие-то процессы.
Еще: при OLE недопустимо вызывать формы. Если без этого нельзя обойтись (напр. служебная обработка задействована) изволь озаботится закрытием этой формы.
И иногда нужно дать возможность завершить неконтролируемый процесс (напр. длительное перепроведение) - через задание паузы.
Всякие есть методы для избежания "Не работает!". Лучший из них: выпрямление рук ;)
Гость
28 - 06.05.2015 - 16:44
26-US1C > Запрос активно использует контекст. Его специально надо конструировать, чтоб он не требовал локальных переменных. Запрос их не увидит. Напоминаю: локального контекста для OLE нет.
Гость
29 - 06.05.2015 - 16:44
27-VZ > Франч?
Гость
30 - 06.05.2015 - 16:45
26-US1C > говори что там за засада?
в общем то тоже решается все достаточно элементарно.
Гость
31 - 06.05.2015 - 16:51
26-US1C >
посмотри здесь пример, что бы меньше собирать по крупицам
http://www.lockator.com.ua/config1s/...uhzaprole.html
Гость
32 - 06.05.2015 - 16:55
29-endfilm > Нет. Сын ошибок трудных.
Гость
33 - 06.05.2015 - 17:03
(28) Это все понятно. Говорю же, что у меня нормально работает обработка из 7.7 по сбору бух.данных из 7-х и 8-х баз. Стал делать аналогичную обработку для сбора данных из 8-ки и практически все методы работы с ОЛЕ-базами 7-ки не работают. Каждый приходится допиливать методом тыка.
(30) Не работает такая конструкция:
ФлагРасчитаныБИ = ДБ.ExecuteBatch("Ит.ВыполнитьЗапрос("+Объект.НачДа та+", "+Объект.КонДата+",СчетаБУ,,,,""Месяц"",);");
Если ФлагРасчитаныБИ = 0 Тогда
Возврат;
КонецЕсли;
Это уже переделаный метод, который в 7-ке работал так:
Если Ит.ВыполнитьЗапрос(НачДатаО, КонДатаО,СчетаБУ,,,,"Месяц",)=0 Тогда
ФлагРасчитаныБИ = 0;
Возврат;
КонецЕсли;
Гость
34 - 06.05.2015 - 17:04
(31) Там ничего нового не увидел. Через все это прошел раньше, когда мастырил обработку на 7.7
Гость
35 - 06.05.2015 - 17:10
32-VZ > Хм. Тем более странно. Оле уже десятки лет и чужих граблей достаточно что бы своих ошибок не делать.
Это просто "транспортный уровень управления процессом",
И никак не связан с принципами работы 1С.

"прерывание процессов", "открытие форм" и прочие "перепроведения и паузы" полностью на ответственности разработчика 1С, и если он берет на себя ее то сам решает что использовать.
Гость
36 - 06.05.2015 - 17:14
33-US1C > Эххх. и не запустится.
Гость
37 - 06.05.2015 - 17:19
(36) Это я уже понял. А как запустить-то?
P.S. Параметр СчетаБУ подправил (вывел за кавычки). Но воз и ныне там.
Гость
38 - 06.05.2015 - 17:30
33-US1C >
1. ExecuteBatch - это просто выполнение кода.
Если с возвратом значения то EvalExpr

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

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

3. все что ты пишешь внутри кавычек ДБ.ExecuteBatch("") то выполняется на стороне оле-экземпляра.
Гость
39 - 06.05.2015 - 17:33
(38) Спасибо. Буду править дальше.


К списку вопросов






Copyright ©, Все права защищены