доброго дня, чего-то не нашел, потребовалось создать в расширении в модуле формы, заимствованную, свою независимую процедуру НаСервере с типом Экспорт, чтобы при программном открытие формы к ней можно было обратиться через точку. Не видит, зараза, эту процедуру, в самой конфе все экспортные доступны, в расширении нет...
---
Заблуждение
Мы про расширения говорим. Поверьте, в расширениях именно так.
Создайте в модуле формы экспортную клиентскую процедуру, в которой сделать вызов серверной. И при получении формы вызывайте клиентскую процедуру.
---
ЗаполнитьРеквизитыПоИНННаСервере это серверная процедура?

Форм = ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);
тут получаете ФормаКлиентскогоПриложения с контекстом Клиент.
Через нее нельзя вызвать серверную процедуру модуля формы (которую получили). Это только внутри модуля формы возможно.
---
Вы из кода конфигурации вызываете процедуру из расширения?
---
Оффтоп

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

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

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

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

```1c
    ПараметрыФормы = Новый Структура("Ключ", выб.Контрагент);
    Форм = ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);
    Форм.ЗаполнитьРеквизитыПоИНННаСервере(выб.ИНН);
```

и вот из расширения, экспортные процедуры, дописанные к этой форме, не находит
---
у расширения безопасный режим и защита от опасных действий выключены?
---
первое да, второе нет, не думаю что в этом дело, но сейчас попробую
---
не влияет, так-же не видит оно ее, и даже Вместо то-же не видит
---
Форм.ЗаполнитьРеквизитыПоИНННаСервере(выб.ИНН);
Обращение с клиента к серверной процедуре формы? Разный контекст.
Создайте клиентскую процедуру в модуле формы, через которую и вызывайте серверную.
---
В смысле? где это такое виданно в коде? С клиента вызывается серверная процедура, куда передается ТЕКСТОВЫЙ параметр. Когда разный контекст оно так и пишет, прочтите внимательнее. Предвосхищаю следующий вопрос - в расширении создается команда на клиенте, которая вызывает серверную процедуру на форме Экспорт (хотя там пофиг), из программно открытой формы не видит она этот Экспорт. Тут вопрос-то с хитринкой
---
ЗаполнитьРеквизитыПоИНННаСервере это серверная процедура?

Форм = ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);
тут получаете ФормаКлиентскогоПриложения с контекстом Клиент.
Через нее нельзя вызвать серверную процедуру модуля формы (которую получили). Это только внутри модуля формы возможно.
---
Заблуждение. Это просто не совсем стандартный подход для ленивых, разработчики, думаю не совсем такое предусматривали, но кто знает, тот пользует. Если то-же самое сделать из внешней обработки т.е. получаем форму ссылки, то в ней доступен вызов всех процедур где стоит Экспорт (и идентификатор НаСервере). Вопрос в другом - если мы заимствуем форму в расширение, то по идее разработчиков в режиме юзера это должно быть единым целым, а это не так.
Из внешней обработки вот это все работает отлично

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

    Форм.ЗаполнитьРеквизитыПоИНННаСервере(выб.ИНН);
    //Форм.АдаптацияЗаполнитьРеквизитыПоИНННаСервере(выб.ИНН);

    Форм.Записать();
```
---
Заблуждение
Мы про расширения говорим. Поверьте, в расширениях именно так.
Создайте в модуле формы экспортную клиентскую процедуру, в которой сделать вызов серверной. И при получении формы вызывайте клиентскую процедуру.
---
Да, в расширениях действительно так работает. Работает! Большая вам от меня благодарность, дружище!!!!
---
Дай тебе бог здоровья)
---
Я вот только одного не пойму никак понять...почему оно на 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.21. Даже такой "костыль" не работает.
Добавляю в расширение обработчик ПриИзменении одного из элементов формы.
Ошибка "Процедура или функция 'ЭтоПоручениеИзЗадачиПоВходящемуДокументуНаСервере' не определена", через промежуточную клиентскую экспортную процедуру вызываю

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