8.2 - Контекст

  • Автор темы unknown181538
  • Дата начала
U

unknown181538

Пишу обработку по чтению txt файла. Пока есть один реквизит "Путь".
В контексте модуля формы реквизит оказывается доступным только через "Объект".
Если переместить процедуру в модуль объекта, как было принято в 8.1, ее не получается вызвать из модуля формы (или я что-то делаю не так?).
Куда идеологически вернее помещать теперь процедуры?
В демо-УТ не нашел вызовов процедур модуля объекта из модуля формы.

PS. В целом, платформа удивила множеством новшеств. Изучать и изучать...
 
Д

Дайнеко

Я бы не волновался с "рекомендациями". Размещать процедуру в Модуле Объекта имеет смысл, когда она нужна нескольким формам этого объекта.
 
U

unknown181538

Я бы не волновался с "рекомендациями". Размещать процедуру в Модуле Объекта имеет смысл, когда она нужна нескольким формам этого объекта.
Еще возможен случаей вызова процедуры без открытия формы.
А если и так, у меня не получается к ней обратиться из модуля формы.
И кажется странным работать с объектом через "Объект."
:angry:
 
D

Darlock

Вы можете предоставить код обращения к процедуре?
 
U

unknown181538

Модуль объекта:
&НаКлиенте
Процедура МояПроцедура()Экспорт
....



Модуль формы:
&НаКлиенте
Процедура Команда1(Команда)
МояПроцедура();

Вообще, как я прочитал, объект не доступаен на клиенте, нужно вызвать сервер...

Я пока в смятени
 
D

Darlock

проверьте тип основного реквизита. Если это в форме обработки, то тип должен быть (ОбработкаОбъект.Имя).
 
Д

Дайнеко

Не поленился, написал тестовую обработку.
Сработало! Детали такие:
- Директиву &НаКлиенте написал только перед проц-ой в мод. объекта. Иначе банально ругался синтаксис на Предупреждение() внутри нее.
- "Процедура МояПроцедура() Экспорт" слово Экспорт тоже написал. Без него смешно получалось: модуль формы синтаксических ошибок не выдает, а при выполнении ругается, что не знает процедуры.
 
U

unknown181538

Т.е. сработало, то, что я написал в своем посте?
 
D

Darlock

Не поленился, написал тестовую обработку.
Сработало! Детали такие:
- Директиву &НаКлиенте написал только перед проц-ой в мод. объекта. Иначе банально ругался синтаксис на Предупреждение() внутри нее.
- "Процедура МояПроцедура() Экспорт" слово Экспорт тоже написал. Без него смешно получалось: модуль формы синтаксических ошибок не выдает, а при выполнении ругается, что не знает процедуры.

Указание директивы "&НаКлиенте" вполне правильно, потому как подход в платформе 8.2 изменен. В 8.1 все выполнялось на клиенте, поэтому перенос функционала на сервер приходилось помечать "#Если Сервер". В 8.2 сделали наоборот, по умолчанию вся нагрузка на сервере, поэтому взаимодействие с пользовательским интерфейсом запрещено (Предупреждение(), Вопрос(), Состояние()).
 
U

unknown181538

"{Форма.Форма.Форма(4,3)}: Процедура или функция с указанным именем не определена (прочитатьДД)
<<?>>прочитатьДД(); (Проверка: Тонкий клиент)"

Что же я делаю не так?
Обработку приложил.
 

Вложения

  • ________________1.rar
    5,4 КБ · Просмотры: 161
D

Darlock

В версии 8.2 приложение не работает непосредственно с локальными файлами, расположенными на компьютере. Файлы должны находиться на сервере.

Поэтому для открытия внешней обработки нужно выполнить следующую последовательность действий:

* Передать файл внешней обработки на сервер
* Подключить внешнюю обработку
* Открыть форму внешней обработки

Чтобы передать файл на сервер, его нужно поместить во временное хранилище. Для этого сначала на клиенте, в обработчике команды открытия внешней обработки, методом глобального контекста ПоместитьФайл() мы помещаем файл из локальной файловой системы во временное хранилище.

В четвертом параметре этого метода указывается признак интерактивного режима выбора файла внешней обработки. Если этот параметр Истина, то появляется диалог выбора файла, в котором можно выбрать файл для помещения в хранилище. В нашем примере этот параметр - Ложь, а путь к файлу, данные из которого будут помещены во временное хранилище, явно задан во втором параметре метода.

При вызове метода ПоместитьФайл() первым его параметром, АдресХранилища, мы указываем пустую строку. После выполнения метода в нее будет помещен путь к файлу внешней обработки во временном хранилище. Этот путь мы используем для того, чтобы подключить внешнюю обработку.

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

Для открытия формы внешней обработки используется метод глобального контекста ОткрытьФорму(), в который передается имя формы в виде следующей строки: "ВнешняяОбработка."+ ИмяОбработки +".Форма". В приведенном варианте открывается основная форма обработки. Можно открыть также и неосновную форму обработки - об этом рассказывается в вопросе Как получить неосновную форму обработки?.

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

//Помещаем обработку во временном хранилище
АдресХранилища = "";
Результат = ПоместитьФайл(АдресХранилища, "C:\ВнешняяОбработка.epf", , Ложь);
ИмяОбработки = ПодключитьВнешнююОбработку(АдресХранилища);

// Откроем форму подключенной внешней обработки
ОткрытьФорму("ВнешняяОбработка."+ ИмяОбработки +".Форма");

КонецПроцедуры

&НаСервере
Функция ПодключитьВнешнююОбработку(АдресХранилища)

Возврат ВнешниеОбработки.Подключить(АдресХранилища);

КонецФункции

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

Подробнее о режиме безопасного исполнения программного кода можно прочитать в документации: 1С:Предприятие 8.2. Руководство разработчика, Раздел 5.5.4.3: Объекты конфигурации - Ветвь конфигурации «Общие» - Роли и права доступа - Безопасный режим работы.

Подробнее об использовании метода ПоместитьФайл() можно прочитать в синтакс-помощнике: Глобальный контекст - Процедуры и функции работы с файлами.

Подробнее об использовании метода Подключить() можно прочитать в синтакс-помощнике: Прикладные объекты - Внешние обработки и отчеты - ВнешниеОбработкиМенеджер - Методы.
 
Д

Дайнеко

unknown181538! Проверил твою обработку. Не работает! Готов заплакать вместе с тобой. Спасибо Darlock за длинное письмо по работе с файлами - почитаю по-подробнее. Но на первый взгляд уже тошнит.
Но по контексту действительно не понятная картина. Дело в том, что я проверял аналогичный пример в Обычной форме. Там процедура видна из Форма. А выходит в Управляемой будет попа. Что делать...
 
U

unknown181538

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


Дело в том, что я проверял аналогичный пример в Обычной форме.
Вот оно в чем дело.
Обычные, наверное, работают как в 8.1.
 
D

Darlock

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



Вот оно в чем дело.
Обычные, наверное, работают как в 8.1.

Обычные - да. А открытие файлов сделали через помещение во временное хранилище для того, чтоб пользователь БД мог переслать свой экземпляр отчета/обработки другому пользователю. Т.о. территориально удаленные друг от друга пользователи могут получать одинаковые данные через тонкого клиента, web-клиента и т.п. Пересылая ссылку на запись хранилища. В чем-то удобно, в чем-то нет.
 
K

KSergei

Немного поправил, теперь работает
 

Вложения

  • _________1.rar
    5,4 КБ · Просмотры: 176
Д

Дайнеко

Немного поправил, теперь работает

Посмотрел отчет и обращение .
Код:
	Обработка = РеквизитФормыВЗначение("Объект");
Обработка.прочитатьДД();
ЗначениеВРеквизитФормы(Обработка, "Объект");
Тоска. Я понял так, чтобы вызывать процедуру прочитатьДД() из Модуля Объекта первая строка получает доступ к своему же отчету. Вторя строка вызывает так, через ... А третья зачем? Описание читал. Аж зло берет от непонимания. :angry2: Что еще в форму нужно записывать? Ведь процедура отработала. Спасибо, конечно, KSergei. Но это и есть единственный и правильный способ вызова процедуры?
 
K

KSergei

ЗначениеВРеквизитФормы() - выполняет преобразование объекта прикладного типа в заданный реквизит формы.
РеквизитФормыВЗначение() - преобразует реквизит данных формы в объект прикладного типа.

Но это и есть единственный и правильный способ вызова процедуры?
К сожилению другого способа вызвать из управляемой формы процедуру/функцию из модуля объекта нет ;) только так...
 
U

unknown181538

К сожилению другого способа вызвать из управляемой формы процедуру/функцию из модуля объекта нет только так...
Т.е. теперь больше процедур будет помещаться в модуль формы, и, при работе с объектом программно, будем обращаться через форму?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!