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