Добрый день!

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

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

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

Изменить конфу не вариант, она типовая.
Есть идеи?
---
вообще-то есть решение.
Раз платформа позволяет использовать расширения, то добавить расширение. В нем можно использовать общий модуль с "Вызов сервера". Прописать процедуру проведения документа через него, а во внешнем соединении использовать проведение через эту процедуру.
---
Пока не поставите в модуле галку "Внешнее соединение" то ни как.
---
Неужели никак нельзя сменить контекст выполнения с внешнего соед.?
---
Неужели никак нельзя сменить контекст выполнения с внешнего соед.?
Если бы это было возможно сделать извне, то это была бы Дыра всей безопасности. Только внутренними изменениями. Перевод вызова чисто серверного модуля через модуль "Вызов сервера".
---
Пробежала мысль - м.б. проделать трюк, как при вызове процедуры модуля объекта из ее формы(ДанныеФормыВЗначение())?
В модуле создать процедуру-обертку с директивой &AtServer и в этом же модуле создать объект этого же модуля для вызова процедуры-обертки из внешнего соединения, но уже на сервере?

P.S. изврат какой-то...
---
Входящее внешнее соединение и так выполняется на сервере, общие серверные модули вызываются без проблем. А то, что ругается на мутальные значения, значит вы в самом com соединении передаете что-то отличающиеся от простейших типов.
А вообще, желательно уходить от COM,на http сервисы например.
---
К сожалению, Cleverence не заморачивается качеством своих продуктов(Обработка их).
В том то и дело, что я не передаю никаких значений. Из внешнего соединения вызывается метод документа "Записать", который запускает целый ворох процедур, генерируя и пиная данные туда-сюда, среди которых есть и мутабельные
---
Значит где-то в процессе пинания возникает передача мутабельного значения. Надо смотреть отладчиком.
---
Надо смотреть отладчиком
В принипе, я отловил момент передачи мутабельного значения, но проблема в том, что это значение генерируется ОбработчикомПроведения документа, который вызывается методом Документ.Записать(Режим записи и т.п.) из вн. соед, и все дальнейшие вызываемые ОбработчикомПроведения процедуры выполняются в контексте внешнего соединения
---
Сталкивался с подобной ситуацией при обмене, решить получилось только включением галки внешнее соединение у модуля, до этого, так же ругался на передачу мутабельного значения.
---
А у модуля УчетОСВызовСервера признак Сервер стоит? Или только Вызов?
---
Признак Сервер стоит, как и Вызов
---
Пока я не вижу простого способа даже "костылями" сменить контекст выполнения с внешнего соединения.
Создание метода-обертки (&НаСервере), даже в отдельной обработке, не поможет - вн. соединение его тупо не видит.
Схема: внешнее соединение ->&НаКлиенте->&НаСервере тоже не прокатит - его также не будет видно.

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

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

Думаю, тема закрыта.
---
вообще-то есть решение.
Раз платформа позволяет использовать расширения, то добавить расширение. В нем можно использовать общий модуль с "Вызов сервера". Прописать процедуру проведения документа через него, а во внешнем соединении использовать проведение через эту процедуру.
---
Спасибо! Я не учел расширения. Вероятно, это единственный способ, хотя и самый сложный, в плане дальнейшей поддержки конфигурации(каждая обнова, как страшный сон)
---
вообще-то не так и страшен черт, как его малюют.
Процедура в расширении может только проводить. Через внешнее соединение можно сохранять все что нужно и получать ссылку и ее передавать в процедуру проведения через расширение. Можно даже сформировать что-то вроде дженерик метода. Тупо проведение любого документа по ссылке.
---
Автор, а можешь скрины скинуть, как реализуешь через расширение7
---
На скринах мало что понятно будет. Просто нужно понять суть расширений - представь, ты раньше частично снимал конфу с поддержки и менял что-то в ее коде и молился Богу, чтобы не забыть снова накатить все свои доработки после обновы. Так вот, расширения - это, как слой в Photoshope, ты меняешь код конфы, как тебе нравится и выносишь его в расширение, как отдельный слой(вообще то последовательно наоборот, но суть та же), который не смоет обнова.
---
Если вы помните правовые базы данных, консультант или гарант, то там версии документов можно видеть с учетом вносимых исправлений. В расширении как бы то же самое, но опять мы видим только отдельный модуль основной конфигурации и отдельно изменения отдельно в каждом расширении.
---
Честно, я вот только 29 декабря взял курсы по расширениям и, к великому сожалению, материалы не могу просмотреть в нормально виде. Сайт указывать не буду, чтобы не оказать медвежью услугу - уверен, что видео уроки качественные, но тех.поддержку придется ждать аж до 9 января.

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

Как будет доступ, то поищу решение. А еще курсы дают возможность задать вопросы преподу :)
Автор, если проблема останется, то ты напиши мне в ЛС (это чтобы я не потерял твою тему, хотя я там в избранное, вроде добавил), то я попробую через преподавателя аккуратно выведать решение ;)
---
Спасибо) Я предпочитаю в кровь расшибить лоб, но самостоятельно найти решение и понять почему это работает именно так. Потом все врезается в память надолго)
---
Испробовал 2 варианта обхода с расширениями

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

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

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

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

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

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

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

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

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

Итог: Успешно