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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Рассмотрим задачу, с которой часто сталкиваются разработчики в 1С: необходимо на основании одной записи справочника с табличной частью создать сразу несколько документов — по одному для каждой уникальной организации, указанной в строках табличной части. Стандартный механизм «Ввод на основании» здесь не подходит, так как он рассчитан на создание одного объекта, поэтому разберем, как реализовать это решение через собственную команду.

Основные принципы реализации

Чтобы реализовать данную задачу, нам потребуется отойти от стандартных кнопок системы и создать собственную команду (кнопку) на форме справочника. Суть подхода заключается в том, чтобы программно сгруппировать данные, создать контекст для каждого документа и открыть отдельные формы для пользователя.

Важно понимать, что при открытии нескольких форм в цикле 1С может попытаться открыть их в одном и том же окне. Чтобы избежать «затирания» предыдущих форм, мы будем использовать уникальный ключ.

Алгоритм работы

Для корректной реализации предлагаем выполнить следующие шаги:

  1. На клиенте вызвать серверную функцию для получения данных.
  2. На сервере выполнить запрос к табличной части справочника, сгруппировать данные по организациям.
  3. Вернуть на клиент массив структур, где каждая структура содержит данные для заполнения одного документа.
  4. На клиенте запустить цикл, в котором для каждого элемента массива вызывается метод ОткрытьФорму().

Пример программной реализации

Рассмотрим, как это выглядит на практике. Сначала мы подготавливаем данные на сервере, а затем открываем формы на клиенте.

В модуле формы справочника создадим команду, которая вызывает серверную функцию получения списка организаций:


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

Обратите внимание: мы передаем параметр ЗначенияЗаполнения. Платформа 1С автоматически подхватит эту структуру и передаст её в обработчик ОбработкаЗаполнения нового документа. Это позволяет заполнить документ данными из справочника, не записывая его предварительно в базу данных, что исключает появление «мусора» в системе, если пользователь закроет форму без сохранения.

Почему не стоит использовать запись в цикле?

Иногда возникает искушение сначала создать объект, записать его, а потом открыть. Мы не рекомендуем этот подход, так как:

Ограничения и рекомендации

При использовании данного метода помните об ограничениях производительности. Если в табличной части справочника содержится небольшое количество организаций (до 10-15), предложенный метод будет работать быстро и корректно. Если же записей очень много, открытие каждой формы создает новый клиент-серверный вызов, что может привести к зависанию интерфейса.

Совет: Если ожидается большое количество документов, рассмотрите вариант пакетного создания документов на сервере в фоновом задании, а пользователю выводите только форму списка документов с установленным отбором по сформированным объектам.

Используя ОткрытьФорму() с уникальным ключом, вы обеспечиваете удобный интерфейс, где каждая организация представлена в отдельном окне, что значительно упрощает работу пользователя с данными.

← На главную