Версия для печати темы (https://pro1c.org.ua/index.php?s=0c2d9db6714fe5035ac0ccdf679b6632&showtopic=51009)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Создать несколько документов, заполнить, открыть, не записывать выполнить команду формы

Автор: Constantus 16.03.19, 11:33

Приветствую, Форумчане!

1с8.3.6, самописная, УФ

Делаю обработку, которая должна создать несколько документов на основании данных ТЧ

Требуется, например в ТЧ имеется 3 неких записей, создать 3-и документа, вывести все эти 3-и новых документа на экран, но при этом не сохранять, тем самым дать возможность пользователю решить, что с ними делать.

Кроме того, в этих документах есть некая кнопка, которая заполняет данные табличной части этого документа, т.е. требуется чтобы после создания этого документа сработала эта кнопка и заполнила эту табличную часть нового документа...

Как это сделать. Я нашел несколько методов, но они требуют сохранения документа, а нужно создать несколько документов, вывести на экран, не сохранять...

Автор: sava1 16.03.19, 12:07

создаем форму объекта, заполняем объект, открываем форму
каждую со своим уникальным идентификатором

Автор: Constantus 16.03.19, 14:23

sava1 @ Сегодня, 16:07 * ,

Вот попытался применить метод:

&НаКлиенте
Процедура СоздатьТабеляУчетаРабочегоВремени(Команда)
    // Вставить содержимое обработчика.
    Для Каждого Стр Из Объект.Подразделения Цикл
        Сообщить(Стр.Подразделение);
        Форма = ПолучитьФорму("Документ.ТабельУчетаРабочегоВремени.ФормаОбъекта");
        ДанныеФормы = Форма.Объект; // Получаем объект формы в переменную
        ЗаполнитьДокументНаСервере(ДанныеФормы, Стр.Подразделение); // Заполняем документ на сервере
        КопироватьДанныеФормы(ДанныеФормы, Форма.Объект); // копируем наш объект в объект формы и далее открываем ее
        Форма.Открыть();
        
    КонецЦикла;    
    
КонецПроцедуры

&НаСервереБезКонтекста

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

Док = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.ТабельУчетаРабочегоВремени")); // Получаем объект из данных формы ИЛИ

Док = Документы.ТабельУчетаРабочегоВремени.СоздатьДокумент();

Док.Подразделение = Отдел;
Док.Организация = ДанныеФормы.Организация;
Док.Дата = текущаяДата();
// Заполняем реквизиты объекта или другие действия ********

ЗначениеВДанныеФормы(Док,ДанныеФормы); // Кладем обратно в объект формы уже созданный документ

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


1. На экран выводит один документ, причем последний из цикла
2. Не сработал метод ДанныеФормы.Организация;



Добавил код

Форма = ПолучитьФорму("Документ.ТабельУчетаРабочегоВремени.ФормаОбъекта",,,Новый УникальныйИдентификатор());

Вроде открылось несколько

Как теперь правильно его заполнить?

ДанныеФормы.Дата = ТекущаяДата(); //сработало
ДанныеФормы.Подразделение = ???? Стр.Подразделение; // не сработало из цикла


+ Как запустить на этой открытой форме процедуру по кнопке?


Constantus @ Сегодня, 16:33 * ,

Вот что-то изменил:

&НаКлиенте
Процедура СоздатьТабеляУчетаРабочегоВремени(Команда)
    // Вставить содержимое обработчика.
    Для Каждого Стр Из Объект.Подразделения Цикл
        Сообщить(Стр.Подразделение);
        Форма = ПолучитьФорму("Документ.ТабельУчетаРабочегоВремени.ФормаОбъекта",,,Новый УникальныйИдентификатор(),);
        ДанныеФормы = Форма.Объект; // Получаем объект формы в переменную
        ЗаполнитьДокументНаСервере(ДанныеФормы, Стр.Подразделение, Объект); // Заполняем документ на сервере
        КопироватьДанныеФормы(ДанныеФормы, Форма.Объект); // копируем наш объект в объект формы и далее открываем ее
        Форма.Открыть();
        
    КонецЦикла;    
    
КонецПроцедуры
//БезКонтекста
&НаСервере
Функция ЗаполнитьДокументНаСервере(ДанныеФормы, СТЧ, Хрень);

ДанныеФормы.Дата = ТекущаяДата();
ДанныеФормы.Подразделение = СТЧ;
ДанныеФормы.Организация = СТЧ.Организация;
ДанныеФормы.ДатаНачалаПериода = Хрень.ДатаНачалаПериода;    
ДанныеФормы.ДатаОкончанияПериода = Хрень.ДатаОкончанияПериода;

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



Пытаюсь заполнить шапку новых документов, там равные реквизиты, что в обработке, что в документах...

ДанныеФормы.ДатаНачалаПериода = Хрень.ДатаНачалаПериода;    
ДанныеФормы.ДатаОкончанияПериода = Хрень.ДатаОкончанияПериода;


Не срабатывает...

Constantus @ Сегодня, 17:32 * ,


Док = РеквизитФормыВЗначение("Объект");

ДанныеФормы.Дата = ТекущаяДата();
ДанныеФормы.Подразделение = СТЧ;
ДанныеФормы.Организация = СТЧ.Организация;
ДанныеФормы.ДатаНачалаПериода = Док.ДатаНачалаПериода;    
ДанныеФормы.ДатаОкончанияПериода = Док.ДатаОкончанияПериода;
ДанныеФормы.ПериодРегистрации  = Док.ПериодРегистрации;
ДанныеФормы.ПериодВводаДанныхОВремени = Док.ПериодВводаДанныхОВремени;
//ДанныеФормы.МесяцРегистрацииСтрокой = Док.МесяцРегистрацииСтрокой;


Вот так сработало, кроме

ДанныеФормы.МесяцРегистрацииСтрокой = Док.МесяцРегистрацииСтрокой;


Этот реквизит является дополнительным реквизитом формы...

1. Как передать дополнительные реквизиты формы
2. И как программно запустить код на созданных формах:

УчетРабочегоВремениФормы.ТабельПериодВводаДанныхОВремениПриИзменении(ЭтаФорма);


Где ЭтаФорма - форма нового созданного документа



Автор: Constantus 16.03.19, 17:34

Constantus @ Сегодня, 18:23 * ,

Вроде решил задачу...

Осталось только одно: как передать данные дополнительного реквизита из обработки на новую форму...

//ДанныеФормы.МесяцРегистрацииСтрокой = Док.МесяцРегистрацииСтрокой;



Constantus @ Сегодня, 21:15 * ,

Ёлки-палки, оказывается всё много проще...


    Для Каждого Стр Из Объект.Подразделения Цикл
        
        Форма = ПолучитьФорму("Документ.ТабельУчетаРабочегоВремени.ФормаОбъекта",,,Новый УникальныйИдентификатор(),);
        ДанныеФормы = Форма.Объект; // Получаем объект формы в переменную
        //ЗаполнитьДокументНаСервере(ДанныеФормы, Стр.Подразделение);//, Объект); // Заполняем документ на сервере
        КопироватьДанныеФормы(ДанныеФормы, Форма.Объект); // копируем наш объект в объект формы и далее открываем ее
        Форма.Открыть();
        Форма.Заполнить();
        Форма.ПериодРегистрацииПриИзменении();
        Форма.МесяцРегистрацииСтрокой = МесяцРегистрацииСтрокой;
        Форма.Объект.ДатаОкончанияПериода
                = Объект.ДатаОкончанияПериода;
        
    КонецЦикла;


Вообще не нужно...
ЗаполнитьДокументНаСервере(ДанныеФормы, Стр.Подразделение);

Автор: Constantus 17.03.19, 8:09

Вот решение, которое меня полностью удовлетворило:

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

        Форма.Заполнить();
        Форма.ПериодРегистрацииПриИзменении();
        
    КонецЦикла;    
    
КонецПроцедуры


Форма = ПолучитьФорму("Документ.ТабельУчетаРабочегоВремени.ФормаОбъекта",,,Новый УникальныйИдентификатор());

Новый УникальныйИдентификатор() - обязательно, чтобы открывались несколько форм

Это вообще не нужно, я так и не понял, почему идет такая обширная реклама заполнения форм через сервер...
        //ДанныеФормы = Форма.Объект; // Получаем объект формы в переменную
        //ЗаполнитьДокументНаСервере(ДанныеФормы, Стр.Подразделение);//, Объект); // Заполняем документ на сервере
        //КопироватьДанныеФормы(ДанныеФормы, Форма.Объект); // копируем наш объект в объект формы и далее открываем ее



Форма.Объект.ПериодРегистрации  = Объект.ПериодРегистрации;

Форма.Объект.ХХХХ(реквизит) - обращение к реквизитам заполняемой формы
Объект.ХХХ(реквизит) - считывание данных реквизита с формы-источника

Форма.МесяцРегистрацииСтрокой = МесяцРегистрацииСтрокой;

Обращение и заполнение дополнительных реквизитов формы

Форма.Заполнить();

Обращение (запуск кнопки, процедур) на вновь созданных формах, но есть нюанс, нужно кое-что переделать в этих процедурах, если там используются "Кнопка"/"Элементы", что в скобках:

&НаКлиенте
Процедура Заполнить(Команда=Неопределено) Экспорт
        
    ЗаполнитьСотрудникамиОрганизацииНаСервере();
    
КонецПроцедуры


Команда=Неопределено - добавить в скобку (Элементы=Неопределено), чтобы в своем коде не обращать на это внимание
Экспорт - добавить к процедуре как экспортную

Автор: Constantus 17.03.19, 9:52

Таки без серверного выполнения не обойтись, если для заполнения данных требуется вставка данных из Справочников, Перечислений и т.д., т.е. если требуется заполнение, которое доступно только на стороне сервера...


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

Как быть?


Форма.Открыть();
Форма.Модифицированность = Истина;


Теперь выводит (*) и задается вопросом о дальнейшей судьбе документа

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua