Создать в расширении серверную процедуру формы Экспорт

1. karamazoff 97 30.07.23 17:26 Сейчас в теме
доброго дня, чего-то не нашел, потребовалось создать в расширении в модуле формы, заимствованную, свою независимую процедуру НаСервере с типом Экспорт, чтобы при программном открытие формы к ней можно было обратиться через точку. Не видит, зараза, эту процедуру, в самой конфе все экспортные доступны, в расширении нет...
По теме из базы знаний
Найденные решения
11. spacecraft 30.07.23 22:34 Сейчас в теме
(10)
Заблуждение

Мы про расширения говорим. Поверьте, в расширениях именно так.
Создайте в модуле формы экспортную клиентскую процедуру, в которой сделать вызов серверной. И при получении формы вызывайте клиентскую процедуру.
Izumov; Raskad; aleksey2; GinGitsune; karamazoff; +5 Ответить
9. spacecraft 30.07.23 22:21 Сейчас в теме
(8) ЗаполнитьРеквизитыПоИНННаСервере это серверная процедура?

Форм = ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);

тут получаете ФормаКлиентскогоПриложения с контекстом Клиент.
Через нее нельзя вызвать серверную процедуру модуля формы (которую получили). Это только внутри модуля формы возможно.
Raskad; GinGitsune; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 35 30.07.23 18:07 Сейчас в теме
(1)Вы из кода конфигурации вызываете процедуру из расширения?
13. dandykry 10 31.07.23 15:45 Сейчас в теме
(1) Оффтоп

Форм = ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы); 

Форм = ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы); 


Второй вариант, если я правильно помню, дополнительно вызывает событие ПриОткрытии. ПолучитьФорму вызывает только ПриСозданииНаСервере.

Для некоторых форм это критично, поэтому проверьте на всякий случай.
14. karamazoff 97 31.07.23 16:42 Сейчас в теме
(13)форму открывать не нужно, вопрос решен
3. karamazoff 97 30.07.23 19:25 Сейчас в теме
Я из неважно откуда, например, из внешней обработки получаю форму элемента основной конфигурации, которая дополнена процедурой в расширении, а из формы, через точку вызываю процедуру формы
		ПараметрыФормы = Новый Структура("Ключ", выб.Контрагент);
		Форм = ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);
Форм.ЗаполнитьРеквизитыПоИНННаСервере(выб.ИНН);


и вот из расширения, экспортные процедуры, дописанные к этой форме, не находит
4. Sashares 35 30.07.23 20:34 Сейчас в теме
(3)у расширения безопасный режим и защита от опасных действий выключены?
5. karamazoff 97 30.07.23 21:17 Сейчас в теме
(4)первое да, второе нет, не думаю что в этом дело, но сейчас попробую
6. karamazoff 97 30.07.23 21:25 Сейчас в теме
(5)не влияет, так-же не видит оно ее, и даже Вместо то-же не видит
7. spacecraft 30.07.23 21:44 Сейчас в теме
(3)
Форм.ЗаполнитьРеквизитыПоИНННаСервере(выб.ИНН);

Обращение с клиента к серверной процедуре формы? Разный контекст.
Создайте клиентскую процедуру в модуле формы, через которую и вызывайте серверную.
8. karamazoff 97 30.07.23 22:04 Сейчас в теме
(7)В смысле? где это такое виданно в коде? С клиента вызывается серверная процедура, куда передается ТЕКСТОВЫЙ параметр. Когда разный контекст оно так и пишет, прочтите внимательнее. Предвосхищаю следующий вопрос - в расширении создается команда на клиенте, которая вызывает серверную процедуру на форме Экспорт (хотя там пофиг), из программно открытой формы не видит она этот Экспорт. Тут вопрос-то с хитринкой
9. spacecraft 30.07.23 22:21 Сейчас в теме
(8) ЗаполнитьРеквизитыПоИНННаСервере это серверная процедура?

Форм = ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);

тут получаете ФормаКлиентскогоПриложения с контекстом Клиент.
Через нее нельзя вызвать серверную процедуру модуля формы (которую получили). Это только внутри модуля формы возможно.
Raskad; GinGitsune; +2 Ответить
10. karamazoff 97 30.07.23 22:30 Сейчас в теме
(9)Заблуждение. Это просто не совсем стандартный подход для ленивых, разработчики, думаю не совсем такое предусматривали, но кто знает, тот пользует. Если то-же самое сделать из внешней обработки т.е. получаем форму ссылки, то в ней доступен вызов всех процедур где стоит Экспорт (и идентификатор НаСервере). Вопрос в другом - если мы заимствуем форму в расширение, то по идее разработчиков в режиме юзера это должно быть единым целым, а это не так.
Из внешней обработки вот это все работает отлично
		ПараметрыФормы = Новый Структура("Ключ", выб.Контрагент);
		Форм = ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);				
				
		Форм.ЗаполнитьРеквизитыПоИНННаСервере(выб.ИНН); 		
		//Форм.АдаптацияЗаполнитьРеквизитыПоИНННаСервере(выб.ИНН); 		
		
		Форм.Записать();
Показать
11. spacecraft 30.07.23 22:34 Сейчас в теме
(10)
Заблуждение

Мы про расширения говорим. Поверьте, в расширениях именно так.
Создайте в модуле формы экспортную клиентскую процедуру, в которой сделать вызов серверной. И при получении формы вызывайте клиентскую процедуру.
Izumov; Raskad; aleksey2; GinGitsune; karamazoff; +5 Ответить
12. karamazoff 97 30.07.23 22:52 Сейчас в теме
(11)Да, в расширениях действительно так работает. Работает! Большая вам от меня благодарность, дружище!!!!
18. Izumov 13 05.04.24 16:14 Сейчас в теме
(11) Дай тебе бог здоровья)
15. Raskad 10 01.11.23 12:39 Сейчас в теме
Я вот только одного не пойму никак понять...почему оно на 8.3.18.1959 работало? Был вызов из внешней обработки именно экспортной процедуры расширения модуля формы с директивой &НаСервере. Обновился на 8.3.22.2283, столкнулся с этой ошибкой, что и привело меня на эту ветку. Переделал на &НаКлиенте, все заработало.
16. CaSH_2004 372 07.11.23 23:19 Сейчас в теме
Подитожу проблему как я ее вижу для широкого круга, хотя все может быть чуточку не так, но общий смысл думаю будет верный. Состоит проблема в скорости выпуска новых платформ, разработчики конфигурации должны протестировать что она работает на новой платформе стабильно. Так вот если они этого не хотят или не могут то есть выход - выставить в конфигурации "Режим совместимости" с той версией которая протестирована, например 8.3.18, и тогда база при запуске на версии скажем 8.3.21 будет работать как бы в сэмулированной версии 8.3.18, не пользуясь возможностями 8.3.21.

Если база простая или разработчикам все равно то они просто выставляют "Режим совместимости" в значение "Не использовать". Конечно если конфигурация пользуется функционалом 8.3.18 то на платформе 8.3.10 она не будет работать и тут нет механизма чтобы это ограничить, поэтому разработчики конфигурации делают ход конем и программно прописывают в обработчике конфигурации "ПередНачаломРаботыСистемы" или "где-то рядом" что нельзя запускать базу на более старой версии платформы - думаю это все видели.

В результате база для запуска ограничена версиями - на более низкой версии нельзя ее запустить, на более высокой она работает с функционалом нужной ей версии.

И вот случилось непонятное - до версии 8.3.18 (включительно) если в расширение перехватить форму объекта и добавить в нее экспортную процедуру "НаСервере" то она вызывалась снаружи - например из обработки. А выше этой версии уже нет, и приходится делать "костыль" (ну как обычно любят это делать разработчики платформы). Делается он так - в расширении добавляется еще одна процедура/функция "НаКлиенте" - назовем ее "прослойка", которая вызывает старую процедуру/функцию "НаСервере". И вот эту "прослойку" мы и вызываем.

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

Зачем так сделано разработчиками платформы не ясно. Может это вынужденная мера, а может просто "баг" который не отловили. Может где то даже написано как его обходить.
LomayaZakat; Raskad; +2 Ответить
17. nayd 9 08.12.23 01:15 Сейчас в теме
(16) режим совместимости 8.3.21. Даже такой "костыль" не работает.
Добавляю в расширение обработчик ПриИзменении одного из элементов формы.
Ошибка "Процедура или функция 'ЭтоПоручениеИзЗадачиПоВходящемуДокументуНаСервере' не определена", через промежуточную клиентскую экспортную процедуру вызываю

upd: отбой, всё работает, просто не поставил точку с запятой в одной из строк
Оставьте свое сообщение

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