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