Из com-соединения в &НаСервере

1. Areal 14 29.12.18 15:56 Сейчас в теме
Добрый день!

Платформа 1с 8.3.12, база серверная

Как вызвать процедуру из общего модуля с 1 галкой "Сервер" из внешнего соединения?

Если подробнее - Сторонней обработкой из внешнего соединения проводится документ(Док.Записать(РежимЗаписи и т.п.)) в базе.
В обработчике проведения(Документа) в числе вызываемых процедур есть несколько из общего модуля(с галкой "Сервер) и при вызове оных 1с ругается на попытку передачи мутабельных значений.
Если вызвать эти процедуры на сервере- проблем нет.

Изменить конфу не вариант, она типовая.
Есть идеи?
timeforlive; +1 Ответить
По теме из базы знаний
Найденные решения
15. spacecraft 29.12.18 18:09 Сейчас в теме
(14) вообще-то есть решение.
Раз платформа позволяет использовать расширения, то добавить расширение. В нем можно использовать общий модуль с "Вызов сервера". Прописать процедуру проведения документа через него, а во внешнем соединении использовать проведение через эту процедуру.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. oleg-x 27 29.12.18 16:33 Сейчас в теме
(1) Пока не поставите в модуле галку "Внешнее соединение" то ни как.
8. Areal 14 29.12.18 16:38 Сейчас в теме
(6)Неужели никак нельзя сменить контекст выполнения с внешнего соед.?
12. spacecraft 29.12.18 16:46 Сейчас в теме
(8)
Неужели никак нельзя сменить контекст выполнения с внешнего соед.?

Если бы это было возможно сделать извне, то это была бы Дыра всей безопасности. Только внутренними изменениями. Перевод вызова чисто серверного модуля через модуль "Вызов сервера".
2. Areal 14 29.12.18 16:20 Сейчас в теме
Пробежала мысль - м.б. проделать трюк, как при вызове процедуры модуля объекта из ее формы(ДанныеФормыВЗначение())?
В модуле создать процедуру-обертку с директивой &AtServer и в этом же модуле создать объект этого же модуля для вызова процедуры-обертки из внешнего соединения, но уже на сервере?

P.S. изврат какой-то...
3. DarkUser 29.12.18 16:26 Сейчас в теме
Входящее внешнее соединение и так выполняется на сервере, общие серверные модули вызываются без проблем. А то, что ругается на мутальные значения, значит вы в самом com соединении передаете что-то отличающиеся от простейших типов.
А вообще, желательно уходить от COM,на http сервисы например.
4. Areal 14 29.12.18 16:30 Сейчас в теме
(3) К сожалению, Cleverence не заморачивается качеством своих продуктов(Обработка их).
В том то и дело, что я не передаю никаких значений. Из внешнего соединения вызывается метод документа "Записать", который запускает целый ворох процедур, генерируя и пиная данные туда-сюда, среди которых есть и мутабельные
5. DarkUser 29.12.18 16:31 Сейчас в теме
(4) Значит где-то в процессе пинания возникает передача мутабельного значения. Надо смотреть отладчиком.
7. Areal 14 29.12.18 16:37 Сейчас в теме
(5)
Надо смотреть отладчиком

В принипе, я отловил момент передачи мутабельного значения, но проблема в том, что это значение генерируется ОбработчикомПроведения документа, который вызывается методом Документ.Записать(Режим записи и т.п.) из вн. соед, и все дальнейшие вызываемые ОбработчикомПроведения процедуры выполняются в контексте внешнего соединения
10. bad_wag 50 29.12.18 16:42 Сейчас в теме
(7) Сталкивался с подобной ситуацией при обмене, решить получилось только включением галки внешнее соединение у модуля, до этого, так же ругался на передачу мутабельного значения.
triviumfan; +1 Ответить
9. Areal 14 29.12.18 16:40 Сейчас в теме
(5)
Прикрепленные файлы:
11. DarkUser 29.12.18 16:46 Сейчас в теме
(9) А у модуля УчетОСВызовСервера признак Сервер стоит? Или только Вызов?
13. Areal 14 29.12.18 16:49 Сейчас в теме
(11)Признак Сервер стоит, как и Вызов
14. Areal 14 29.12.18 18:02 Сейчас в теме
Пока я не вижу простого способа даже "костылями" сменить контекст выполнения с внешнего соединения.
Создание метода-обертки (&НаСервере), даже в отдельной обработке, не поможет - вн. соединение его тупо не видит.
Схема: внешнее соединение ->&НаКлиенте->&НаСервере тоже не прокатит - его также не будет видно.


Ремарка для столкнувшихся с тем же:

1с - не ООП, можно пользоваться только предопределенными языком объектами, все, что вы создаете по сути чисто процедуры, оперирующие готовыми объектами. А среди них(объектов) я не нашел ни одного, кроме расширений(спасибо spacecraft ) способного сделать такой трюк.

Думаю, тема закрыта.
15. spacecraft 29.12.18 18:09 Сейчас в теме
(14) вообще-то есть решение.
Раз платформа позволяет использовать расширения, то добавить расширение. В нем можно использовать общий модуль с "Вызов сервера". Прописать процедуру проведения документа через него, а во внешнем соединении использовать проведение через эту процедуру.
16. Areal 14 29.12.18 18:14 Сейчас в теме
(15)Спасибо! Я не учел расширения. Вероятно, это единственный способ, хотя и самый сложный, в плане дальнейшей поддержки конфигурации(каждая обнова, как страшный сон)
17. spacecraft 29.12.18 18:18 Сейчас в теме
(16) вообще-то не так и страшен черт, как его малюют.
Процедура в расширении может только проводить. Через внешнее соединение можно сохранять все что нужно и получать ссылку и ее передавать в процедуру проведения через расширение. Можно даже сформировать что-то вроде дженерик метода. Тупо проведение любого документа по ссылке.
18. timeforlive 16 01.01.19 11:12 Сейчас в теме
Автор, а можешь скрины скинуть, как реализуешь через расширение7
19. Areal 14 02.01.19 17:59 Сейчас в теме
(18) На скринах мало что понятно будет. Просто нужно понять суть расширений - представь, ты раньше частично снимал конфу с поддержки и менял что-то в ее коде и молился Богу, чтобы не забыть снова накатить все свои доработки после обновы. Так вот, расширения - это, как слой в Photoshope, ты меняешь код конфы, как тебе нравится и выносишь его в расширение, как отдельный слой(вообще то последовательно наоборот, но суть та же), который не смоет обнова.
22. acanta 02.01.19 19:34 Сейчас в теме
(19)Если вы помните правовые базы данных, консультант или гарант, то там версии документов можно видеть с учетом вносимых исправлений. В расширении как бы то же самое, но опять мы видим только отдельный модуль основной конфигурации и отдельно изменения отдельно в каждом расширении.
20. timeforlive 16 02.01.19 18:15 Сейчас в теме
Честно, я вот только 29 декабря взял курсы по расширениям и, к великому сожалению, материалы не могу просмотреть в нормально виде. Сайт указывать не буду, чтобы не оказать медвежью услугу - уверен, что видео уроки качественные, но тех.поддержку придется ждать аж до 9 января.

Интересно было посмотреть саму реализацию задачи.

Как будет доступ, то поищу решение. А еще курсы дают возможность задать вопросы преподу :)
Автор, если проблема останется, то ты напиши мне в ЛС (это чтобы я не потерял твою тему, хотя я там в избранное, вроде добавил), то я попробую через преподавателя аккуратно выведать решение ;)
23. Areal 14 02.01.19 19:45 Сейчас в теме
(20)Спасибо) Я предпочитаю в кровь расшибить лоб, но самостоятельно найти решение и понять почему это работает именно так. Потом все врезается в память надолго)
21. Areal 14 02.01.19 18:53 Сейчас в теме
Испробовал 2 варианта обхода с расширениями

I.Первый вариант:
Перехват проблемного общего модуля с попыткой преобразовать в перехватчике мутабельное значение в немутабельное.

Итог: Не прокатило. В ХранилищеЗначений его без сериализации не запихнешь. Можно запихнуть в Стуктуру(HashMap), но внутри структуры все равно некоторые значения будут мутабельными. Единственный вариант - переписывать логику проведения, но это мазохизм.

Для себя сделал пару выводов по расширениям :

1) В расширении нельзя изменять почти все свойства объектов.В моем случае нельзя вынести проблемный Общий модуль в расширение, но уже с пометкой "Внешнее соединение"

2)В расширении существующие модели адаптации нового кода позволяют дополнять/переопределять целиком(!) старые процедуры/функции ("до", "после" или "вместо"). А это означает, что если в новой обнове именно в перехвачиваемой процедуре/функции добавлена новая строчка кода, с какой то новой логикой, то в расширение она не перенесется, а это значит, что вы можете далеко не сразу обнаружить проблему(если вообще поймете где ее искать)

II Второй вариант:
В расширении создать общий модуль с пометками "Сервер", "Вызов сервера", который содержит в себе только одну такую процедуру с двумя строками:

Процедура ПроведениеДока(Ссылка, РежимПроведенияДокумента) Экспорт
	Документ = Ссылка.ПолучитьОбъект();
	Документ.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента);
КонецПроцедуры


Процедура принимает ссылку на документ и режим проведения

и вызывается из com-соединения вместо метода Документ.Записать();

Итог: Успешно
Михаська; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот