Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   Com-соединение и подписки на события, которые мешают создать документ. (http://forums.kuban.ru/f1040/com-soedinenie_i_podpiski_na_sobytiya_kotorye_meshayut_sozdat-_dokument-8589289.html)

profi85 31.01.2018 20:54

Com-соединение и подписки на события, которые мешают создать документ.
 
Есть 2 базы в клиент-серверном варианте, УТ 11.2 и УТ11.3. Создаю COM-соединение (на сервере) из одной базы к другой. Из первой базы пытаюсь создать документ Заказ клиента во второй подключаемой базе. При попытке создания документа вываливаются ошибки, типа Метод обработчика события (название события) не найден. Долго искал решение и выяснил, что в свойствах всех подписках для данного документа не стоит галка Вызов сервера. Установил ее везде. Ошибки данного типа исчезли. Но при попытки записать этот документ вылезла другая ошибка:
Ошибка при вызове метода контекста (Записать): Произошла исключительная ситуация (1C:Enterprise 8.3.9.1818): Ошибка при выполнении обработчика - 'ПередЗаписью'
Попытка передачи с клиента на сервер мутабельного значения 1-го параметра метода ЗаписатьВерсиюДокумента ().
Как это победить?

profi85 01.02.2018 10:21

Проблема всё еще актуальна. Уточню немного, у меня такой код, выполняется на сервере, выделил только основные моменты:
Base1С = Новый COMОбъект("V83.Application");
Соединение = Base1С.Connect("Srvr=""" + ИмяСервера + """;Ref=""" + НазваниеБазы + """;Usr=""" + ПользовательБД + """; Pwd=""" + ПарольБД + """;");
ДокЗаказыКлиента_Base1С = Base1С.NewObject("ДокументМенеджер.ЗаказКлиента");
ДокОбъект_Base1С = ДокЗаказыКлиента_Base1С.СоздатьДокумент();
ДокОбъект_Base1С.Записать();

У кого-то получалось создать в УТ11 какой-либо документ или справочник при подобном подключении? Или я что-то не доделал?

USSR 01.02.2018 10:58

Попробуй записать документ с реквизитом ОбменДанными.Загрузка = Истина, в этом случае по монему обработчик ПриЗаписи отключается, и потом посмотришь что у тебя запишется и что в документе не так

profi85 01.02.2018 11:16

(2)Допустим мы отключим все подписки, происходящие при записи, что вроде как не совсем правильно, ведь они то нужны, чтобы дозаполнить какие-либо данные, зарегистрировать изменения и тд. Но у меня есть еще заполнение документа до записи:
ДокОбъект_Base1С.Заполнить(СтруктураЗаполнения_Base1С);
И тут тоже вызывается подписка на событие и обработчик ОбработкаЗаполнения, и вылазит точно такая же ошибка с передачей мутабельных типов.

То есть я не понимаю, разработчики УТ11 не предусмотрели создание объектов при Com-соединении в клиент-серверном варианте?

profi85 01.02.2018 12:01

Если логически порассуждать:
1) Подключаемая база открывается в режиме толстого клиента.
2) У всех модулей обработчиков подписок на события данного документа установлены галки Сервер, Внешнее соединение, Клиент (обычное приложение) плюс Вызов сервера - я установил.

Судя по ошибке, получается что документ создается на клиенте, а подписка вызывается на сервере? Есть варианты, как перенаправить и создание документа на сервер, чтоли?

roma n 01.02.2018 12:32

(0) обязательно задействовать Application? COMConnector не кошерно?

profi85 01.02.2018 13:00

(5) Проверил, да, COMConnector полностью решает данную проблему, спасибо!
А по-поводу Application, странно конечно, но получается что разработчики отрубили возможность использовать его в УТ11.

roma n 01.02.2018 17:01

(6) Ничего не отрубили... Используй на здоровье. Только помни про особенности клиент-серверного взаимодействия: при создании объекта в толстом клиенте он "живёт" на стороне клиента. Если ты интерактивно запустишься [b]в таком же режиме[/b] - словишь ровно те же ошибки :)

profi85 01.02.2018 21:56

(7) Про "отрубили" я имел в виду именно создание объектов, и по той причине, что не нашел решение, как обойти эту ошибку подписок. И да, про толстый клиент я уже тоже понял... Если подскажешь, как учесть особенности клиент-серверного взаимодействия, и создавать объекты используя Application, то думаю, эта информация будет не лишней ни для кого :)

roma n 02.02.2018 09:21

(8) как учесть?.. ПЕРЕпроектировать и исправлять прикладное решение так чтоб оно работало в нужном режиме: типовые сейчас под толстый не пишутся и их работоспособность в таком режиме запуска не гарантируется.
Основная засада в том что в случае толстого клиента модули прикладных объектов компилируются на клиенте, а в тонком - на сервере. Отсюда следует что передача управления с клиента на сервер происходит для разных клиентов на различающихся участках кода :( Управляемости можно добиться, например, используя директивы компиляции. Типа #Если Клиент Тогда ...<тут особый код, обеспечивающий работу в нужном режиме>

Но, ИМХО, легче застрелиться

roma n 02.02.2018 09:29

Вдогонку: самое главное чуть не забыл!
OLE Aytomation поддерживает не только V83.Application, но и V83[u]C[/u].Application

profi85 02.02.2018 10:37

(9) Так вот оно ключевое слово "типовые сейчас под толстый не пишутся", а V83.Application как-раз таки и открывает базу в толстом клиенте, ведь так? :) То есть приходим к выводу, что УТ11 и др. типовые конфигурации не поддерживают создание объектов в подключаемой базе через V83.Application (без доработок)?
В любом случае, спасибо за инфу.
С V83C.Application не знаком, но вроде как он открывает базу в режиме тонкого клиента? То есть с первого взгляда, эта проблема в подписках по передачи мутабельных значений с клиента на сервер сохранится?


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