8.2 - Контекст

Тема в разделе "1C и всё что с ней связано", создана пользователем unknown181538, 8 май 2010.

  1. unknown181538

    unknown181538 НеГуру
    1C Team

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

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

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Я бы не волновался с "рекомендациями". Размещать процедуру в Модуле Объекта имеет смысл, когда она нужна нескольким формам этого объекта.
     
  3. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Еще возможен случаей вызова процедуры без открытия формы.
    А если и так, у меня не получается к ней обратиться из модуля формы.
    И кажется странным работать с объектом через "Объект."
    :angry:
     
  4. Darlock

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    Вы можете предоставить код обращения к процедуре?
     
  5. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Модуль объекта:
    &НаКлиенте
    Процедура МояПроцедура()Экспорт
    ....



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

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

    Я пока в смятени
     
  6. Darlock

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    проверьте тип основного реквизита. Если это в форме обработки, то тип должен быть (ОбработкаОбъект.Имя).
     
  7. Дайнеко

    Дайнеко Well-Known Member
    1C Team

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

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Т.е. сработало, то, что я написал в своем посте?
     
  9. Darlock

    Darlock Well-Known Member
    1C Team

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

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Именно так и было. Мамой клянусь.
     
  11. unknown181538

    unknown181538 НеГуру
    1C Team

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

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

    Вложения:

  12. Darlock

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    В версии 8.2 приложение не работает непосредственно с локальными файлами, расположенными на компьютере. Файлы должны находиться на сервере.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Дайнеко Well-Known Member
    1C Team

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

    unknown181538 НеГуру
    1C Team

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


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

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    Обычные - да. А открытие файлов сделали через помещение во временное хранилище для того, чтоб пользователь БД мог переслать свой экземпляр отчета/обработки другому пользователю. Т.о. территориально удаленные друг от друга пользователи могут получать одинаковые данные через тонкого клиента, web-клиента и т.п. Пересылая ссылку на запись хранилища. В чем-то удобно, в чем-то нет.
     
  16. KSergei

    KSergei Гость

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

    Вложения:

    • _________1.rar
      Размер файла:
      5,4 КБ
      Просмотров:
      15
  17. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Спасибо. Недопонимание все-таки остается.
     
  18. Дайнеко

    Дайнеко Well-Known Member
    1C Team

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

    KSergei Гость

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

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

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Т.е. теперь больше процедур будет помещаться в модуль формы, и, при работе с объектом программно, будем обращаться через форму?
     
Загрузка...

Поделиться этой страницей