Создать в расширении серверную процедуру формы Экспорт
доброго дня, чего-то не нашел, потребовалось создать в расширении в модуле формы, заимствованную, свою независимую процедуру НаСервере с типом Экспорт, чтобы при программном открытие формы к ней можно было обратиться через точку. Не видит, зараза, эту процедуру, в самой конфе все экспортные доступны, в расширении нет...
По теме из базы знаний
- Расширения конфигурации. Нюансы поведения
- Динамическая модификация форм в расширении
- Последовательность выполнения расширений
- Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов
- Библиотека создания клиент-серверных приложений для сценарного языка OneScript
Найденные решения
(10)
Мы про расширения говорим. Поверьте, в расширениях именно так.
Создайте в модуле формы экспортную клиентскую процедуру, в которой сделать вызов серверной. И при получении формы вызывайте клиентскую процедуру.
Заблуждение
Мы про расширения говорим. Поверьте, в расширениях именно так.
Создайте в модуле формы экспортную клиентскую процедуру, в которой сделать вызов серверной. И при получении формы вызывайте клиентскую процедуру.
(8) ЗаполнитьРеквизитыПоИНННаСервере это серверная процедура?
тут получаете ФормаКлиентскогоПриложения с контекстом Клиент.
Через нее нельзя вызвать серверную процедуру модуля формы (которую получили). Это только внутри модуля формы возможно.
Форм = ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);
тут получаете ФормаКлиентскогоПриложения с контекстом Клиент.
Через нее нельзя вызвать серверную процедуру модуля формы (которую получили). Это только внутри модуля формы возможно.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Оффтоп
Второй вариант, если я правильно помню, дополнительно вызывает событие ПриОткрытии. ПолучитьФорму вызывает только ПриСозданииНаСервере.
Для некоторых форм это критично, поэтому проверьте на всякий случай.
Форм = ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);
Форм = ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);
Второй вариант, если я правильно помню, дополнительно вызывает событие ПриОткрытии. ПолучитьФорму вызывает только ПриСозданииНаСервере.
Для некоторых форм это критично, поэтому проверьте на всякий случай.
Я из неважно откуда, например, из внешней обработки получаю форму элемента основной конфигурации, которая дополнена процедурой в расширении, а из формы, через точку вызываю процедуру формы
и вот из расширения, экспортные процедуры, дописанные к этой форме, не находит
ПараметрыФормы = Новый Структура("Ключ", выб.Контрагент);
Форм = ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);
Форм.ЗаполнитьРеквизитыПоИНННаСервере(выб.ИНН);
и вот из расширения, экспортные процедуры, дописанные к этой форме, не находит
(7)В смысле? где это такое виданно в коде? С клиента вызывается серверная процедура, куда передается ТЕКСТОВЫЙ параметр. Когда разный контекст оно так и пишет, прочтите внимательнее. Предвосхищаю следующий вопрос - в расширении создается команда на клиенте, которая вызывает серверную процедуру на форме Экспорт (хотя там пофиг), из программно открытой формы не видит она этот Экспорт. Тут вопрос-то с хитринкой
(8) ЗаполнитьРеквизитыПоИНННаСервере это серверная процедура?
тут получаете ФормаКлиентскогоПриложения с контекстом Клиент.
Через нее нельзя вызвать серверную процедуру модуля формы (которую получили). Это только внутри модуля формы возможно.
Форм = ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);
тут получаете ФормаКлиентскогоПриложения с контекстом Клиент.
Через нее нельзя вызвать серверную процедуру модуля формы (которую получили). Это только внутри модуля формы возможно.
(9)Заблуждение. Это просто не совсем стандартный подход для ленивых, разработчики, думаю не совсем такое предусматривали, но кто знает, тот пользует. Если то-же самое сделать из внешней обработки т.е. получаем форму ссылки, то в ней доступен вызов всех процедур где стоит Экспорт (и идентификатор НаСервере). Вопрос в другом - если мы заимствуем форму в расширение, то по идее разработчиков в режиме юзера это должно быть единым целым, а это не так.
Из внешней обработки вот это все работает отлично
Из внешней обработки вот это все работает отлично
ПараметрыФормы = Новый Структура("Ключ", выб.Контрагент);
Форм = ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);
Форм.ЗаполнитьРеквизитыПоИНННаСервере(выб.ИНН);
//Форм.АдаптацияЗаполнитьРеквизитыПоИНННаСервере(выб.ИНН);
Форм.Записать();
Показать
(10)
Мы про расширения говорим. Поверьте, в расширениях именно так.
Создайте в модуле формы экспортную клиентскую процедуру, в которой сделать вызов серверной. И при получении формы вызывайте клиентскую процедуру.
Заблуждение
Мы про расширения говорим. Поверьте, в расширениях именно так.
Создайте в модуле формы экспортную клиентскую процедуру, в которой сделать вызов серверной. И при получении формы вызывайте клиентскую процедуру.
Я вот только одного не пойму никак понять...почему оно на 8.3.18.1959 работало? Был вызов из внешней обработки именно экспортной процедуры расширения модуля формы с директивой &НаСервере. Обновился на 8.3.22.2283, столкнулся с этой ошибкой, что и привело меня на эту ветку. Переделал на &НаКлиенте, все заработало.
Подитожу проблему как я ее вижу для широкого круга, хотя все может быть чуточку не так, но общий смысл думаю будет верный. Состоит проблема в скорости выпуска новых платформ, разработчики конфигурации должны протестировать что она работает на новой платформе стабильно. Так вот если они этого не хотят или не могут то есть выход - выставить в конфигурации "Режим совместимости" с той версией которая протестирована, например 8.3.18, и тогда база при запуске на версии скажем 8.3.21 будет работать как бы в сэмулированной версии 8.3.18, не пользуясь возможностями 8.3.21.
Если база простая или разработчикам все равно то они просто выставляют "Режим совместимости" в значение "Не использовать". Конечно если конфигурация пользуется функционалом 8.3.18 то на платформе 8.3.10 она не будет работать и тут нет механизма чтобы это ограничить, поэтому разработчики конфигурации делают ход конем и программно прописывают в обработчике конфигурации "ПередНачаломРаботыСистемы" или "где-то рядом" что нельзя запускать базу на более старой версии платформы - думаю это все видели.
В результате база для запуска ограничена версиями - на более низкой версии нельзя ее запустить, на более высокой она работает с функционалом нужной ей версии.
И вот случилось непонятное - до версии 8.3.18 (включительно) если в расширение перехватить форму объекта и добавить в нее экспортную процедуру "НаСервере" то она вызывалась снаружи - например из обработки. А выше этой версии уже нет, и приходится делать "костыль" (ну как обычно любят это делать разработчики платформы). Делается он так - в расширении добавляется еще одна процедура/функция "НаКлиенте" - назовем ее "прослойка", которая вызывает старую процедуру/функцию "НаСервере". И вот эту "прослойку" мы и вызываем.
В итоге если режим совместимости указан и до версии 8.3.18 (включительно) то будет работать на любой платформе вызов серверных экспортируемых процедур форм. Если режим совместимости "поднять" или платформа "выше", а режим совместимости стоит "Не использовать" то не будет и нужно делать "костыль".
Зачем так сделано разработчиками платформы не ясно. Может это вынужденная мера, а может просто "баг" который не отловили. Может где то даже написано как его обходить.
Если база простая или разработчикам все равно то они просто выставляют "Режим совместимости" в значение "Не использовать". Конечно если конфигурация пользуется функционалом 8.3.18 то на платформе 8.3.10 она не будет работать и тут нет механизма чтобы это ограничить, поэтому разработчики конфигурации делают ход конем и программно прописывают в обработчике конфигурации "ПередНачаломРаботыСистемы" или "где-то рядом" что нельзя запускать базу на более старой версии платформы - думаю это все видели.
В результате база для запуска ограничена версиями - на более низкой версии нельзя ее запустить, на более высокой она работает с функционалом нужной ей версии.
И вот случилось непонятное - до версии 8.3.18 (включительно) если в расширение перехватить форму объекта и добавить в нее экспортную процедуру "НаСервере" то она вызывалась снаружи - например из обработки. А выше этой версии уже нет, и приходится делать "костыль" (ну как обычно любят это делать разработчики платформы). Делается он так - в расширении добавляется еще одна процедура/функция "НаКлиенте" - назовем ее "прослойка", которая вызывает старую процедуру/функцию "НаСервере". И вот эту "прослойку" мы и вызываем.
В итоге если режим совместимости указан и до версии 8.3.18 (включительно) то будет работать на любой платформе вызов серверных экспортируемых процедур форм. Если режим совместимости "поднять" или платформа "выше", а режим совместимости стоит "Не использовать" то не будет и нужно делать "костыль".
Зачем так сделано разработчиками платформы не ясно. Может это вынужденная мера, а может просто "баг" который не отловили. Может где то даже написано как его обходить.
(16) режим совместимости 8.3.21. Даже такой "костыль" не работает.
Добавляю в расширение обработчик ПриИзменении одного из элементов формы.
Ошибка "Процедура или функция 'ЭтоПоручениеИзЗадачиПоВходящемуДокументуНаСервере' не определена", через промежуточную клиентскую экспортную процедуру вызываю
upd: отбой, всё работает, просто не поставил точку с запятой в одной из строк
Добавляю в расширение обработчик ПриИзменении одного из элементов формы.
Ошибка "Процедура или функция 'ЭтоПоручениеИзЗадачиПоВходящемуДокументуНаСервере' не определена", через промежуточную клиентскую экспортную процедуру вызываю
upd: отбой, всё работает, просто не поставил точку с запятой в одной из строк
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот