Открытие управляемой формы незаписанного документа в 1С 8.2
Нередко необходимо программно создать новый документ или элемент справочника и заполнить его данными. А затем, НЕ ЗАПИСЫВАЯ его в базу данных, открыть форму для того чтобы пользователь получил возможность его отредактировать и потом сам принял решение о его записи в БД(или отказался от записи). На платформах 8.0, 8.1 (и даже 7.7) это не представляло никакой сложности, а вот в тонком клиенте управляемого приложения 8.2 эта задача уже ни кажется столь тривиальной.
Первый способ заключается в том, что необходимо заранее подготовить некую структуру, которая будет содержать данные для заполнения документа, передать эту структуру в открываемую форму, а уже в самой форме в событии ПриСозданииНаСервере() заполнять вновь открываемую форму переданными в неё данными. Этот способ не нов, но у него есть один серьезный недостаток — необходимо изменить модуль формы самого объекта, чтобы добавить/изменить событие формы ПриСозданииНаСервере(), это очень не понравится тем кто работает с типовыми конфигурациями находящимися на поддержке. Кроме того этот подход не применим во внешних обработках, что сильно сокращает потенциал его применения.
Второй способ решения этой задачи лишен вышеупомянутых недостатков:
&НаКлиенте Процедура КомандаОткрытьФорму(Команда) Форма = ПолучитьФорму("Справочник.Пользователи.ФормаОбъекта"); ДанныеФормы = Форма.Объект; ЗаполнитьНаСервере(ДанныеФормы); КопироватьДанныеФормы(ДанныеФормы, Форма.Объект); Форма.Открыть(); КонецПроцедуры &НаСервереБезКонтекста Процедура ЗаполнитьНаСервере(НовыйОбъект); НовыйОбъект.Наименование = "Новый элемент"; Для К=1 По 100 Цикл НоваяСтрока = НовыйОбъект.ТЧ.Добавить(); НоваяСтрока.РеквизитТЧ = К; КонецЦикла; КонецПроцедуры
Если публикация помогла Вам справится с проблемой, решить задачу или расширить свои знания - поддержите автора.
Комментарии:
Чтобы оставить комментарий, Вы должны войти в систему.
Как потом вызвать процедуры документ?
НовыйОбъект.ПроцедураДокумента();
Надо так
&НаКлиенте
Процедура СоздатьДокумент(Команда)
Форма = ПолучитьФорму(«Документ.Реализация.ФормаОбъекта»);
ДанныеФормы = Форма.Объект;
ЗаполнитьДокументНаСервере(ДанныеФормы);
КопироватьДанныеФормы(ДанныеФормы, Форма.Объект);
Форма.Открыть();
КонецПроцедуры
&НаСервере
Функция ЗаполнитьДокументНаСервере(ДанныеФормы);
Док = ДанныеФормыВЗначение(ДанныеФормы, Тип(«ДокументОбъект.Реализация));
Для каждого Стр Из ТЗ Цикл
СтрДок = Док.Товары.Добавить();
СтрДок.Количество = Стр.Количество;
СтрДок.Номенклатура = Стр.Номенклатура;
КонецЦикла;
ЗначениеВДанныеФормы(Док,ДанныеФормы);
КонецФункции
Класс!!искал часа 2 по инету как мне передать данные из первой формы во вторую. нашел. спасибо большое!!
Огромное спасибо! Очень помогло!
Спасибо!!!
Спасибо, помогло.
А у меня на клиенте нету Форма.Объект…
Все отлично работает!
В моем случае только пришлось изменить режим работы функции на &НаСервере.
СпасиБО!
Спасибо, действительно помогло, искал долго 🙂
Спасибо, помогло.
Спасибо огромное!!!
Откуда вы берёте Форма.Объект?
Говорит нет такого
Разобрался — в моём конкретном случае было что у меня доставалась обычная форма, а ни управляемая.
ПолучитьФорму(“Документ.Реализация.Форма.ФормаУправляемая”)
Вот так заработало.
Спасибо огромное автору статьи — именно то, что нужно! И ничего лишнего.
Не работает с табличной частью дополнительные реквизиты.
Спасибо. Вам и Эдуарду. Очень полезная информация. Очень.
Спасибо тебе огромное, автор этой статьи, я уже три рабочих дня бьюсь над проблемой, которая на обычных формах делалась одной строчкой кода. В тонком клиенте нет типа «Таблица значений», следовательно его в структуру не поместишь. Поэтому первым способом документ создается без табличной части. Если решить через служебный реквизит формы с видом ТаблицаЗначений и передать его в структуру, то передается тип «Коллекция реквизитов формы» и приходится менять модуль типового документа, а этого я делать категорически не хочу. Остается только второй способ описанный в это статье. Еще раз спасибо.
Спасибо автору!
СПАСИБИЩЕ!!!