Добрый день!
Платформа 1с 8.3.12, база серверная
Как вызвать процедуру из общего модуля с 1 галкой "Сервер" из внешнего соединения?
Если подробнее - Сторонней обработкой из внешнего соединения проводится документ(Док.Записать(РежимЗаписи и т.п.)) в базе.
В обработчике проведения(Документа) в числе вызываемых процедур есть несколько из общего модуля(с галкой "Сервер) и при вызове оных 1с ругается на попытку передачи мутабельных значений.
Если вызвать эти процедуры на сервере- проблем нет.
Изменить конфу не вариант, она типовая.
Есть идеи?
Платформа 1с 8.3.12, база серверная
Как вызвать процедуру из общего модуля с 1 галкой "Сервер" из внешнего соединения?
Если подробнее - Сторонней обработкой из внешнего соединения проводится документ(Док.Записать(РежимЗаписи и т.п.)) в базе.
В обработчике проведения(Документа) в числе вызываемых процедур есть несколько из общего модуля(с галкой "Сервер) и при вызове оных 1с ругается на попытку передачи мутабельных значений.
Если вызвать эти процедуры на сервере- проблем нет.
Изменить конфу не вариант, она типовая.
Есть идеи?
По теме из базы знаний
- 1С8:борьба - личный опыт работы с платформой 1с8
- Знакомство с 1С:Документооборот. История автоматизации и доработок. Печатная форма Лист согласования
- Подключение двух и более COMConnector'ов (COM-соединений) к различным релизам сервера 1С:Предприятие 8.3 на одном компьютере
- Обработка для адаптивного переноса данных между базами через XML
- Особенности работы с COM-соединением
Найденные решения
(14) вообще-то есть решение.
Раз платформа позволяет использовать расширения, то добавить расширение. В нем можно использовать общий модуль с "Вызов сервера". Прописать процедуру проведения документа через него, а во внешнем соединении использовать проведение через эту процедуру.
Раз платформа позволяет использовать расширения, то добавить расширение. В нем можно использовать общий модуль с "Вызов сервера". Прописать процедуру проведения документа через него, а во внешнем соединении использовать проведение через эту процедуру.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Пробежала мысль - м.б. проделать трюк, как при вызове процедуры модуля объекта из ее формы(ДанныеФормыВЗначение())?
В модуле создать процедуру-обертку с директивой &AtServer и в этом же модуле создать объект этого же модуля для вызова процедуры-обертки из внешнего соединения, но уже на сервере?
P.S. изврат какой-то...
В модуле создать процедуру-обертку с директивой &AtServer и в этом же модуле создать объект этого же модуля для вызова процедуры-обертки из внешнего соединения, но уже на сервере?
P.S. изврат какой-то...
Входящее внешнее соединение и так выполняется на сервере, общие серверные модули вызываются без проблем. А то, что ругается на мутальные значения, значит вы в самом com соединении передаете что-то отличающиеся от простейших типов.
А вообще, желательно уходить от COM,на http сервисы например.
А вообще, желательно уходить от COM,на http сервисы например.
(3) К сожалению, Cleverence не заморачивается качеством своих продуктов(Обработка их).
В том то и дело, что я не передаю никаких значений. Из внешнего соединения вызывается метод документа "Записать", который запускает целый ворох процедур, генерируя и пиная данные туда-сюда, среди которых есть и мутабельные
В том то и дело, что я не передаю никаких значений. Из внешнего соединения вызывается метод документа "Записать", который запускает целый ворох процедур, генерируя и пиная данные туда-сюда, среди которых есть и мутабельные
(5)
В принипе, я отловил момент передачи мутабельного значения, но проблема в том, что это значение генерируется ОбработчикомПроведения документа, который вызывается методом Документ.Записать(Режим записи и т.п.) из вн. соед, и все дальнейшие вызываемые ОбработчикомПроведения процедуры выполняются в контексте внешнего соединения
Надо смотреть отладчиком
В принипе, я отловил момент передачи мутабельного значения, но проблема в том, что это значение генерируется ОбработчикомПроведения документа, который вызывается методом Документ.Записать(Режим записи и т.п.) из вн. соед, и все дальнейшие вызываемые ОбработчикомПроведения процедуры выполняются в контексте внешнего соединения
Пока я не вижу простого способа даже "костылями" сменить контекст выполнения с внешнего соединения.
Создание метода-обертки (&НаСервере), даже в отдельной обработке, не поможет - вн. соединение его тупо не видит.
Схема: внешнее соединение ->&НаКлиенте->&НаСервере тоже не прокатит - его также не будет видно.
Ремарка для столкнувшихся с тем же:
1с - не ООП, можно пользоваться только предопределенными языком объектами, все, что вы создаете по сути чисто процедуры, оперирующие готовыми объектами. А среди них(объектов) я не нашел ни одного, кроме расширений(спасибо spacecraft ) способного сделать такой трюк.
Думаю, тема закрыта.
Создание метода-обертки (&НаСервере), даже в отдельной обработке, не поможет - вн. соединение его тупо не видит.
Схема: внешнее соединение ->&НаКлиенте->&НаСервере тоже не прокатит - его также не будет видно.
Ремарка для столкнувшихся с тем же:
1с - не ООП, можно пользоваться только предопределенными языком объектами, все, что вы создаете по сути чисто процедуры, оперирующие готовыми объектами. А среди них(объектов) я не нашел ни одного, кроме расширений(спасибо spacecraft ) способного сделать такой трюк.
Думаю, тема закрыта.
(14) вообще-то есть решение.
Раз платформа позволяет использовать расширения, то добавить расширение. В нем можно использовать общий модуль с "Вызов сервера". Прописать процедуру проведения документа через него, а во внешнем соединении использовать проведение через эту процедуру.
Раз платформа позволяет использовать расширения, то добавить расширение. В нем можно использовать общий модуль с "Вызов сервера". Прописать процедуру проведения документа через него, а во внешнем соединении использовать проведение через эту процедуру.
(16) вообще-то не так и страшен черт, как его малюют.
Процедура в расширении может только проводить. Через внешнее соединение можно сохранять все что нужно и получать ссылку и ее передавать в процедуру проведения через расширение. Можно даже сформировать что-то вроде дженерик метода. Тупо проведение любого документа по ссылке.
Процедура в расширении может только проводить. Через внешнее соединение можно сохранять все что нужно и получать ссылку и ее передавать в процедуру проведения через расширение. Можно даже сформировать что-то вроде дженерик метода. Тупо проведение любого документа по ссылке.
(18) На скринах мало что понятно будет. Просто нужно понять суть расширений - представь, ты раньше частично снимал конфу с поддержки и менял что-то в ее коде и молился Богу, чтобы не забыть снова накатить все свои доработки после обновы. Так вот, расширения - это, как слой в Photoshope, ты меняешь код конфы, как тебе нравится и выносишь его в расширение, как отдельный слой(вообще то последовательно наоборот, но суть та же), который не смоет обнова.
(19)Если вы помните правовые базы данных, консультант или гарант, то там версии документов можно видеть с учетом вносимых исправлений. В расширении как бы то же самое, но опять мы видим только отдельный модуль основной конфигурации и отдельно изменения отдельно в каждом расширении.
Честно, я вот только 29 декабря взял курсы по расширениям и, к великому сожалению, материалы не могу просмотреть в нормально виде. Сайт указывать не буду, чтобы не оказать медвежью услугу - уверен, что видео уроки качественные, но тех.поддержку придется ждать аж до 9 января.
Интересно было посмотреть саму реализацию задачи.
Как будет доступ, то поищу решение. А еще курсы дают возможность задать вопросы преподу :)
Автор, если проблема останется, то ты напиши мне в ЛС (это чтобы я не потерял твою тему, хотя я там в избранное, вроде добавил), то я попробую через преподавателя аккуратно выведать решение ;)
Интересно было посмотреть саму реализацию задачи.
Как будет доступ, то поищу решение. А еще курсы дают возможность задать вопросы преподу :)
Автор, если проблема останется, то ты напиши мне в ЛС (это чтобы я не потерял твою тему, хотя я там в избранное, вроде добавил), то я попробую через преподавателя аккуратно выведать решение ;)
Испробовал 2 варианта обхода с расширениями
I.Первый вариант:
Перехват проблемного общего модуля с попыткой преобразовать в перехватчике мутабельное значение в немутабельное.
Итог: Не прокатило. В ХранилищеЗначений его без сериализации не запихнешь. Можно запихнуть в Стуктуру(HashMap), но внутри структуры все равно некоторые значения будут мутабельными. Единственный вариант - переписывать логику проведения, но это мазохизм.
Для себя сделал пару выводов по расширениям :
1) В расширении нельзя изменять почти все свойства объектов.В моем случае нельзя вынести проблемный Общий модуль в расширение, но уже с пометкой "Внешнее соединение"
2)В расширении существующие модели адаптации нового кода позволяют дополнять/переопределять целиком(!) старые процедуры/функции ("до", "после" или "вместо"). А это означает, что если в новой обнове именно в перехвачиваемой процедуре/функции добавлена новая строчка кода, с какой то новой логикой, то в расширение она не перенесется, а это значит, что вы можете далеко не сразу обнаружить проблему(если вообще поймете где ее искать)
II Второй вариант:
В расширении создать общий модуль с пометками "Сервер", "Вызов сервера", который содержит в себе только одну такую процедуру с двумя строками:
Процедура принимает ссылку на документ и режим проведения
и вызывается из com-соединения вместо метода Документ.Записать();
Итог: Успешно
I.Первый вариант:
Перехват проблемного общего модуля с попыткой преобразовать в перехватчике мутабельное значение в немутабельное.
Итог: Не прокатило. В ХранилищеЗначений его без сериализации не запихнешь. Можно запихнуть в Стуктуру(HashMap), но внутри структуры все равно некоторые значения будут мутабельными. Единственный вариант - переписывать логику проведения, но это мазохизм.
Для себя сделал пару выводов по расширениям :
1) В расширении нельзя изменять почти все свойства объектов.В моем случае нельзя вынести проблемный Общий модуль в расширение, но уже с пометкой "Внешнее соединение"
2)В расширении существующие модели адаптации нового кода позволяют дополнять/переопределять целиком(!) старые процедуры/функции ("до", "после" или "вместо"). А это означает, что если в новой обнове именно в перехвачиваемой процедуре/функции добавлена новая строчка кода, с какой то новой логикой, то в расширение она не перенесется, а это значит, что вы можете далеко не сразу обнаружить проблему(если вообще поймете где ее искать)
II Второй вариант:
В расширении создать общий модуль с пометками "Сервер", "Вызов сервера", который содержит в себе только одну такую процедуру с двумя строками:
Процедура ПроведениеДока(Ссылка, РежимПроведенияДокумента) Экспорт
Документ = Ссылка.ПолучитьОбъект();
Документ.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента);
КонецПроцедуры
Процедура принимает ссылку на документ и режим проведения
и вызывается из com-соединения вместо метода Документ.Записать();
Итог: Успешно
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот