Как программно заполнить и открыть форму нового документа?

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Hiterix, 29 сен 2014.

  1. TopicStarter Overlay
    Hiterix
    Offline

    Hiterix

    Регистрация:
    25 окт 2013
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Всем доброго дня!
    Думаю, что информация в данной теме будет очень полезна многим посетителям этого форума.
    Долгое время не мог решить задачу – как открыть форму нового документа так, чтобы она открылась не пустая, а уже частично заполненная программно, при этом сам документ еще не записан в базу? Очень много времени потратил на поиски решения данной проблемы в интернете, посетил много форумов, на которых поднимался данный вопрос, но лишь на немногих из них попадались варианты решения. Самый простой из них – сначала программно создать новый документ, программно заполнить нужные его реквизиты, записать документ в базу, и потом уже открыть его пользователю. А что, если пользователь не захочет его сохранять? Что, если он передумает, и закроет открытую форму? В этом случае уже записанный документ так и останется в базе данных. А кому нужны в базе лишние документы?
    А если же не сохранять документ, то самый популярный вариант – использовать метод ПолучитьФорму(«Документы.НужныйВидДокумента.ФормаДокумента»). Но в этом случае можно получить пустую форму документа и просто вывести на экран методом Открыть(). Это тоже не вариант…
    Спустя какое-то время задачу удалось решить с помощью функции глобального контекста «ЗаполнитьЗначенияСвойств».

    Глобальный контекст
    ЗаполнитьЗначенияСвойств (FillPropertyValues)
    Синтаксис:
    ЗаполнитьЗначенияСвойств(<Приемник>, <Источник>, <Список свойств>, <Исключая свойства>)
    Описание:
    Копирует значения свойств <Источника> в свойства <Приемника>. Сопоставление производится по именам свойств.



    На примере своей задачи хотел бы объяснить, как можно использовать эту функцию для заполнения формы нового документа. Задача была в следующем – Имеется один документ (Заказ-наряд), реквизитом табличной части которого является другой документ (Оказание услуг). Так вот, нужно было сделать так, чтобы при добавлении в табличную часть «Заказ-наряда» нового документа «Оказание услуг», на экран выводилась форма нового документа «Оказание услуг» с уже заполненными реквизитами, взятыми из того заказ-наряда, из которого было вызвано создание. При этом, чтобы сам новый документ, на момент появления его формы на экране, еще не был записан в базу. Это нужно было сделать, если пользователь вдруг решит не заполнять документ и просто закроет форму.
    Вот фрагмент кода с решением задачи:
    Код:
    &НаКлиенте
    Процедура ВвестиЗапись()
      ФормаЗаписи = ПолучитьФорму("Документ.ОказаниеМедУслуг.ФормаОбъекта");
      ЗаполнитьЗначенияСвойств(ФормаЗаписи.Объект,Объект,"Дата,Специалист,Специализация,МедСестра,СтатусИсполнения",); // Заполняем значения реквизитов, имена которых совпадают в обоих документах
      ТекСтр =  Элементы.Прием.ТекущиеДанные; //Данные текущей строки документа-источника
      СтруктураСвойств = Новый Структура; // Структура содержит значения тех реквизитов, которые нужно заполнить на форме нового документа, но которых нет в документе-источнике
      СтруктураСвойств.Вставить("НарядЗапись",Объект.Ссылка);
      СтруктураСвойств.Вставить("ВремяПриема",ТекСтр.ВремяПриема);
      ЗаполнитьЗначенияСвойств(ФормаЗаписи.Объект,СтруктураСвойств,"НарядЗапись,ВремяПриема",);
      ФормаЗаписи.Открыть();
    КонецПроцедуры
    То есть, все операции делаем непосредственно на клиенте, без обращения к серверу, в пределах одной самостоятельно созданной процедуры. По сути, таким способом можно заполнить и открыть форму как любого документа, так и справочника. Сначала я заполнил реквизиты из одной формы в другую, используя объекты форм, а затем, с помощью объекта «Структура», в который вставил недостающие реквизиты, заполнил еще некоторые реквизиты открываемой формы, а затем открыл форму.
    Надеюсь, что эта темя сэкономит время многим, кто столкнулся с подобной задачей!
  2. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Недавно сталкивался с такой задачей. Ваше решение имеет право на существование. Но есть одно НО. Такой код не отработает, если, допустим, из обычной формы открывать управляемую:). Ну да ладно, это все лирика...
    Оставляем или удаляем тему ?
  3. TopicStarter Overlay
    Hiterix
    Offline

    Hiterix

    Регистрация:
    25 окт 2013
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Из обычной открывать управляемую форму - это уже ньюансы, которые встречаются реже обычных... :)
    А по поводу того, оставить или удалить - решать вам, как хозяевам форума. Если посчитаете, что информация этой темы неактуальна или бесполезна, то конечно удаляйте. Но, я разместил эту тему здесь, так как, в принципе, по этой теме вариантов решения встречается не так много, хотя сама тема поднималась на многих форумах. Вот я и решил поделиться своим вариантом решения данной темы, так как ресурс ваш популярный и интересный, и я сам несколько раз обращался здесь за помощью и всегда находил ответ.
  4. ExtreMe
    Offline

    ExtreMe Опытный в 1С

    Регистрация:
    13 сен 2014
    Сообщения:
    76
    Симпатии:
    7
    Баллы:
    29
    А что, у вас все темы с пометкой "РЕШЕНО" удаляются? пускай останется как вариант решения.

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