Базовый курс. МГ сессия от 15.11.10
Продолжаем отвечать на ваши вопросы. Представляем 9 видео-уроков.
Сегодня мы рассмотрели следующие вопросы.
1. Шаблоны текста.
Где хранятся стандартные шаблоны?
Как их можно отредактировать?
2. Открытие документа.
Столкнулся с проблемой открытия документа, созданного программно.
Процедура создания документа – на сервере. Вызываю такДок = Документы.Рейс.СоздатьДокумент();Док.Заполнить(Заказы); // здесь вызывается процедураОбработкаЗаполнения – таб часть заполняется переданными заказами.
А вот как дальше, не записывая документа, открыть его форму?
Ведь объект создан на сервере. Методы ПолучитьФорму и ОткрытьЗначение не работают.
Записывать документ сразу не целесообразно, поэтому пробую как то передать с сервера созданный объект обратно на клиента – не получается.
Есть выход?
3. Серверные переменные.
В модуле формы серверная переменная сохраняет значение только на время серверного вызова и не сохраняется между серверными вызовами,зачем она вообще нужна и где применяется на практике?
4. Данные формы на сервере.
При работе с формой (для оптимизации) мне нужно некоторые данные закэшировать насервере, чтобы не передавать их каждый раз с клиента, как это сделать?
Без использования параметров сеанса и повторного использованиявозвращаемых значений.
5. Данные заполнения.
В упр. формах нет поиска, точнее это теперь не поиск, а отбор.
Тогда почему установив некоторый “поиск-отбор” при возникновении событии модуля объекта ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) ДанныеЗаполнения = Неопределено ?
К примеру я ставлю поиск документов по контрагенту Сидорову, на список документов накладываетсясоответствующий отбор, и при вводе нового документа оказывается что ДанныеЗаполнения = Неопределено (!) хотя по логике там должен содержаться контрагент – Сидоров.
Почему так происходит ?
6. Работа со структурой.
Можно ли добавлять новые элементы структуры если название ключа задавать текстовой переменной.
Как обращаться к значению элемента структуры если название ключа будет известно только в процессе выполнения.
Что то я перемудрил, можно ещё проще:
&НаКлиенте
Процедура КомандаОткрытьФорму(Команда)
Форма = ПолучитьФорму(“Справочник.Пользователи.ФормаОбъекта”);
ДанныеФормы = Форма.Объект;
ЗаполнитьНаСервере(ДанныеФормы);
КопироватьДанныеФормы(ДанныеФормы, Форма.Объект);
Форма.Открыть();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ЗаполнитьНаСервере(НовыйОбъект);
НовыйОбъект.Наименование = “Новый элемент”;
Для К=1 По 100 Цикл
НоваяСтрока = НовыйОбъект.ТЧ.Добавить();
НоваяСтрока.РеквизитТЧ = К;
КонецЦикла;
КонецПроцедуры
Изящное решение, спасибо!
Для полной красоты можно еще установить модифицированность формы.
Форма.Модифицированность = Истина;
А ведь можно пойти дальше и преобразовать ДанныеФормыСтруктура в ДокументОбъект, вызывать метод Заполнить(), а далее сделать обратное преобразование.
Вот такой вариант решает задачу автора.
&НаКлиенте
Процедура Ордер(Команда)
Форма = ПолучитьФорму(“Документ.ПоступлениеТоваров.ФормаОбъекта”);
ФормаОбъект = Форма.Объект;
НаСервере(ФормаОбъект);
Форма.Модифицированность = Истина;
Форма.Открыть();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура НаСервере(ФормаОбъект)
Док = Документы.ПоступлениеТоваров.СоздатьДокумент();
Док.Заполнить(Новый Структура(“Комментарий”, “Коммент”));
ЗначениеВДанныеФормы(Док, ФормаОбъект);
КонецПроцедуры
После заполнения на сервере надо вызвать
КопироватьДанныеФормы(ФормаОбъект, Форма.Объект);
Без этого работать не будет, потому что опытным путем установлено, что при передаче на сервер ФормаОбъект система сделает копию этой структуры и передаст ссылку на эту НОВУЮ(!) структуру, а не на Форма.Объект
Поэтому после выхода из процедуры надо скопировать ФормаОбъект->Форма.Объект
Можете опытным путем выполнить приведенный код :)
Этим вопросом мы сильно-сильно забегаем в материал продвинутого курса..
>Поэтому после выхода из процедуры надо скопировать ФормаОбъект->Форма.Объект
В вашем случае нужно.
В моем все уже скопировано.
В Вашем случае тоже нужно :)
Только что проверил экспериментально. Ваш код без КопироватьДанныеФормы(ФормаОбъект, Форма.Объект) не паполняет форму. Вышеуказанный код для чистоты эксперимента выполнял в модуле формы внешней обработки.
Да, действительно, поторопился я с выводами.
Копировать данные формы нужно в любом случае.
Спасибо.
Добрый день Евгений!
Во втором вопросе этой мастер-группы Вы предлагаете механизм открытия формы программно созданного, но не записанного документа/элемента справочника.
В очередной раз смею с Вами не согласится и предлагаю свой способ, который в отличие от Вашего, позволяет решить эту задачу эту НЕ меняя ни модуля, ни формы самого объекта, и соответственно применимого во внешних обработках.
&НаКлиенте
Процедура Команда1(Команда)
Форма = ПолучитьФорму(“Справочник.Пользователи.ФормаОбъекта”);
ДанныеФормы = Форма.Объект;
// Отвязываем данные от формы,
// иначе передать их на сервер не удастся
Форма = Неопределено;
ЗаполнитьНаСервере(ДанныеФормы);
Форма = ПолучитьФорму(“Справочник.Пользователи.ФормаОбъекта”);
КопироватьДанныеФормы(ДанныеФормы, Форма.Объект);
Форма.Открыть();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ЗаполнитьНаСервере(НовыйОбъект);
НовыйОбъект.Наименование = “А ВАМ СЛАБО ?”;
Для К=1 По 100 Цикл
НоваяСтрока = НовыйОбъект.ТЧ.Добавить();
НоваяСтрока.РеквизитТЧ = К;
КонецЦикла;
КонецПроцедуры