Базовый курс. МГ сессия от 15.11.10

Продолжаем отвечать на ваши вопросы. Представляем 9  видео-уроков.

Сегодня мы рассмотрели следующие вопросы.

1. Шаблоны текста.
Где хранятся стандартные шаблоны?
Как их можно отредактировать?

2. Открытие документа.
Столкнулся с проблемой открытия документа, созданного программно.
Процедура создания документа – на сервере. Вызываю так Док = Документы.Рейс.СоздатьДокумент(); Док.Заполнить(Заказы); // здесь вызывается процедура ОбработкаЗаполнения – таб часть заполняется переданными заказами.
А вот как дальше, не записывая документа, открыть его форму?
Ведь объект создан на сервере. Методы ПолучитьФорму и ОткрытьЗначение не работают.
Записывать документ сразу не целесообразно, поэтому пробую как то передать с сервера созданный объект обратно на клиента – не получается.
Есть выход?

3. Серверные переменные.
В  модуле формы серверная переменная сохраняет значение только на время  серверного  вызова  и не сохраняется между серверными вызовами, зачем она вообще нужна и где применяется на практике?

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

5. Данные заполнения.
В  упр.  формах  нет поиска, точнее это теперь не поиск, а отбор.
Тогда почему установив некоторый “поиск-отбор” при возникновении событии модуля объекта ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) ДанныеЗаполнения   =   Неопределено ?
К примеру я ставлю поиск документов по контрагенту Сидорову, на список документов накладывается соответствующий отбор, и при вводе нового документа оказывается что ДанныеЗаполнения    =    Неопределено  (!)  хотя  по логике там должен содержаться контрагент – Сидоров.
Почему так происходит ?

6. Работа со структурой.
Можно ли добавлять новые элементы структуры если  название ключа задавать текстовой переменной.
Как обращаться к значению  элемента структуры если название ключа будет известно только в процессе выполнения.

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.

комментариев 9 на “Базовый курс. МГ сессия от 15.11.10”

  1. Что то  я перемудрил,  можно ещё проще:
    &НаКлиенте
    Процедура КомандаОткрытьФорму(Команда)
    Форма = ПолучитьФорму(“Справочник.Пользователи.ФормаОбъекта”);
    ДанныеФормы = Форма.Объект;
    ЗаполнитьНаСервере(ДанныеФормы);
    КопироватьДанныеФормы(ДанныеФормы, Форма.Объект);
    Форма.Открыть();
    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура ЗаполнитьНаСервере(НовыйОбъект);
    НовыйОбъект.Наименование = “Новый элемент”;
    Для К=1 По 100 Цикл
    НоваяСтрока = НовыйОбъект.ТЧ.Добавить();
    НоваяСтрока.РеквизитТЧ = К;
    КонецЦикла;
    КонецПроцедуры

    • Изящное решение, спасибо!
      Для полной красоты можно еще установить модифицированность формы.

      Форма.Модифицированность = Истина;

    • А ведь можно пойти дальше и преобразовать ДанныеФормыСтруктура в ДокументОбъект, вызывать метод Заполнить(), а далее сделать обратное преобразование.

    • Вот такой вариант решает задачу автора.

      &НаКлиенте
      Процедура Ордер(Команда)

      Форма = ПолучитьФорму(“Документ.ПоступлениеТоваров.ФормаОбъекта”);
      ФормаОбъект = Форма.Объект;
      НаСервере(ФормаОбъект);
      Форма.Модифицированность = Истина;
      Форма.Открыть();

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

      &НаСервереБезКонтекста
      Процедура НаСервере(ФормаОбъект)

      Док = Документы.ПоступлениеТоваров.СоздатьДокумент();
      Док.Заполнить(Новый Структура(“Комментарий”, “Коммент”));
      ЗначениеВДанныеФормы(Док, ФормаОбъект);

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

      • После заполнения на сервере надо вызвать
        КопироватьДанныеФормы(ФормаОбъект, Форма.Объект);
        Без этого работать не будет, потому что опытным путем установлено, что при передаче на сервер ФормаОбъект система сделает копию этой структуры и передаст ссылку на эту НОВУЮ(!) структуру, а не на Форма.Объект
        Поэтому после выхода из процедуры надо скопировать ФормаОбъект->Форма.Объект

        • Можете опытным путем выполнить приведенный код :)
          Этим вопросом мы сильно-сильно забегаем в материал продвинутого курса..
          >Поэтому после выхода из процедуры надо скопировать ФормаОбъект->Форма.Объект
          В вашем случае нужно.
          В моем все уже скопировано.

          • В Вашем случае тоже нужно :)
            Только что проверил экспериментально.  Ваш код без КопироватьДанныеФормы(ФормаОбъект, Форма.Объект) не паполняет форму. Вышеуказанный код для чистоты эксперимента выполнял в  модуле формы внешней обработки.

            • Да, действительно, поторопился я с выводами.
              Копировать данные формы нужно в любом случае.
              Спасибо.

  2. Добрый день Евгений!
    Во втором вопросе этой мастер-группы Вы предлагаете механизм открытия формы программно созданного, но не записанного документа/элемента справочника.
    В очередной раз смею с Вами не согласится  и предлагаю свой способ, который в отличие от Вашего, позволяет решить эту задачу эту НЕ меняя ни модуля, ни формы самого объекта, и соответственно применимого во внешних обработках.
    &НаКлиенте
    Процедура Команда1(Команда)
    Форма = ПолучитьФорму(“Справочник.Пользователи.ФормаОбъекта”);
    ДанныеФормы = Форма.Объект;
    // Отвязываем данные от формы,
    // иначе передать их на сервер не удастся
    Форма = Неопределено;
    ЗаполнитьНаСервере(ДанныеФормы);
    Форма = ПолучитьФорму(“Справочник.Пользователи.ФормаОбъекта”);
    КопироватьДанныеФормы(ДанныеФормы, Форма.Объект);
    Форма.Открыть();
    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура ЗаполнитьНаСервере(НовыйОбъект);
    НовыйОбъект.Наименование = “А ВАМ СЛАБО ?”;
    Для К=1 По 100 Цикл
    НоваяСтрока = НовыйОбъект.ТЧ.Добавить();
    НоваяСтрока.РеквизитТЧ = К;
    КонецЦикла;
    КонецПроцедуры