Открытие управляемой формы незаписанного документа в 1С 8.2

Нередко необходимо программно создать новый документ или элемент справочника и заполнить его данными. А затем, НЕ ЗАПИСЫВАЯ его в базу данных, открыть форму для того чтобы пользователь получил возможность его отредактировать и потом сам принял решение о его записи в БД(или отказался от записи). На платформах 8.0, 8.1 (и даже 7.7) это не представляло никакой сложности, а вот в тонком клиенте управляемого приложения 8.2 эта задача уже ни кажется столь тривиальной.

Первый способ заключается в том, что необходимо заранее подготовить некую структуру, которая будет содержать данные для заполнения документа, передать эту структуру в открываемую форму, а уже в самой форме в событии ПриСозданииНаСервере() заполнять вновь открываемую форму переданными в неё данными. Этот способ не нов, но у него есть один серьезный недостаток – необходимо изменить модуль формы самого объекта, чтобы добавить/изменить событие формы ПриСозданииНаСервере(), это очень не понравится тем кто работает с типовыми конфигурациями находящимися на поддержке. Кроме того этот подход не применим во внешних обработках, что сильно сокращает потенциал его применения.

Второй способ решения этой задачи лишен вышеупомянутых недостатков:

&НаКлиенте
Процедура КомандаОткрытьФорму(Команда)
	Форма = ПолучитьФорму("Справочник.Пользователи.ФормаОбъекта");
	ДанныеФормы = Форма.Объект;
	ЗаполнитьНаСервере(ДанныеФормы);
	КопироватьДанныеФормы(ДанныеФормы, Форма.Объект);
	Форма.Открыть();
КонецПроцедуры

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

Если публикация показалась Вам полезной и интересной не забывайте оставлять свои отзывы и комментарии, так же Вы можете выразить свою благодарность материально.

Комментарии:

  1. Phace пишет:

    СПАСИБИЩЕ!!!

  2. Aleksandrs пишет:

    Спасибо автору!

  3. Алексей пишет:

    Спасибо тебе огромное, автор этой статьи, я уже три рабочих дня бьюсь над проблемой, которая на обычных формах делалась одной строчкой кода. В тонком клиенте нет типа “Таблица значений”, следовательно его в структуру не поместишь. Поэтому первым способом документ создается без табличной части. Если решить через служебный реквизит формы с видом ТаблицаЗначений и передать его в структуру, то передается тип “Коллекция реквизитов формы” и приходится менять модуль типового документа, а этого я делать категорически не хочу. Остается только второй способ описанный в это статье. Еще раз спасибо.

  4. Юлия пишет:

    Спасибо. Вам и Эдуарду. Очень полезная информация. Очень.

  5. capitannemo пишет:

    Не работает с табличной частью дополнительные реквизиты.

  6. kuz пишет:

    Спасибо огромное автору статьи – именно то, что нужно! И ничего лишнего.

  7. Kooaei пишет:

    Откуда вы берёте Форма.Объект?
    Говорит нет такого

    1. Kooaei пишет:

      Разобрался – в моём конкретном случае было что у меня доставалась обычная форма, а ни управляемая.

      ПолучитьФорму(“Документ.Реализация.Форма.ФормаУправляемая”)

      Вот так заработало.

  8. Kamil пишет:

    Спасибо огромное!!!

  9. Егор пишет:

    Спасибо, помогло.

  10. Алексей пишет:

    Спасибо, действительно помогло, искал долго :)

  11. Андрей пишет:

    Все отлично работает!
    В моем случае только пришлось изменить режим работы функции на &НаСервере.
    СпасиБО!

  12. Ярик пишет:

    А у меня на клиенте нету Форма.Объект…

  13. АннаПам пишет:

    Спасибо, помогло.

  14. concent пишет:

    Спасибо!!!

  15. mir-mup пишет:

    Огромное спасибо! Очень помогло!

  16. jorelingo пишет:

    Класс!!искал часа 2 по инету как мне передать данные из первой формы во вторую. нашел. спасибо большое!!

  17. Эдуард пишет:

    Надо так

    &НаКлиенте
    Процедура СоздатьДокумент(Команда)

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

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

    &НаСервере
    Функция ЗаполнитьДокументНаСервере(ДанныеФормы);

    Док = ДанныеФормыВЗначение(ДанныеФормы, Тип(“ДокументОбъект.Реализация));

    Для каждого Стр Из ТЗ Цикл
    СтрДок = Док.Товары.Добавить();
    СтрДок.Количество = Стр.Количество;
    СтрДок.Номенклатура = Стр.Номенклатура;

    КонецЦикла;

    ЗначениеВДанныеФормы(Док,ДанныеФормы);

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

  18. Эдуард пишет:

    Как потом вызвать процедуры документ?
    НовыйОбъект.ПроцедураДокумента();

Оставить комментарий