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

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

В процессе разработки в среде 1С:Предприятие 8.3 на управляемых формах часто возникает задача по обработке группы документов. Типичный сценарий: пользователь открывает список документов, применяет определенные фильтры или выделяет несколько строк мышкой, после чего хочет запустить внешнюю обработку для выполнения массовых действий (например, группового переименования номеров или изменения реквизитов). В этой статье мы подробно разберем, как правильно организовать передачу данных между формой списка и внешней обработкой, используя современные механизмы платформы.

Метод 1. Передача массива выделенных строк через параметры формы

Рассмотрим самый простой и наиболее часто используемый способ, когда нам нужно передать только те документы, которые пользователь выделил в списке вручную. Для этого нам понадобится программно открыть форму внешней обработки и передать в нее структуру параметров.

На стороне формы списка документов создадим команду, в которой выполним следующий код:


&НаКлиенте
Процедура КомандаОткрытьОбработку(Команда)
    
    // Получаем массив ссылок на выделенные строки
    МассивВыделенныхСсылок = Элементы.Список.ВыделенныеСтроки;
    
    Если МассивВыделенныхСсылок.Количество() = 0 Тогда
        ПоказатьПредупреждение(, "Пожалуйста, выделите хотя бы один документ.");
        Возврат;
    КонецЕсли;

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

Теперь проанализируем, как принять эти данные внутри внешней обработки. В модуле формы обработки нам необходимо перехватить переданные параметры в обработчике ПриСозданииНаСервере.


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

Метод 2. Использование механизмов БСП (Библиотеки стандартных подсистем)

Если ваша конфигурация разработана на базе БСП, мы рекомендуем использовать штатный механизм дополнительных отчетов и обработок. Это наиболее профессиональный подход, так как он позволяет интегрировать обработку в интерфейс без внесения изменений в основную конфигурацию.

Разберем основные шаги реализации этого метода:

  1. В модуле объекта внешней обработки необходимо реализовать функцию СведенияОВнешнейОбработке, указав вид обработки как ДополнительнаяОбработка или ЗаполнениеОбъекта.
  2. Для выполнения команды должна быть создана экспортная процедура ВыполнитьКоманду.

В этом случае система автоматически передает массив ссылок в параметр ОбъектыНазначения. Посмотрим на пример кода в модуле объекта:


Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
    
    // ОбъектыНазначения — это уже готовый массив ссылок на выделенные документы
    Для Каждого ТекущийДокумент Из ОбъектыНазначения Цикл
        // Здесь мы можем реализовать логику, например, переименование номера
        ОбъектДок = ТекущийДокумент.ПолучитьОбъект();
        // Алгоритм изменения номера...
        ОбъектДок.Записать();
    КонецЦикла;
    
КонецПроцедуры

Метод 3. Передача через временное хранилище

Иногда количество передаваемых документов исчисляется тысячами. Передача огромного массива через структуру параметров может привести к существенным задержкам. Проанализируем более эффективный способ — использование ВременноеХранилище.

Алгоритм действий следующий:

  1. На форме списка помещаем массив во временное хранилище и получаем адрес.
  2. Передаем только адрес (строку) в форму обработки.
  3. В обработке считываем данные по адресу.

Рассмотрим пример реализации на форме списка:


&НаСервере
Функция ПоместитьСписокВоХранилище(МассивСсылок)
    Возврат ПоместитьВоВременноеХранилище(МассивСсылок, ЭтаФорма.УникальныйИдентификатор);
КонецФункции

&НаКлиенте
Процедура ВыполнитьПередачу(Команда)
    МассивДанных = Элементы.Список.ВыделенныеСтроки;
    АдресХранилища = ПоместитьСписокВоХранилище(МассивДанных);
    
    ПараметрыОткрытия = Новый Структура("АдресДанных", АдресХранилища);
    ОткрытьФорму("ВнешняяОбработка.МояОбработка.Форма", ПараметрыОткрытия);
КонецПроцедуры

Метод 4. Получение полного списка с учетом пользовательских отборов

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

Выясним, как программно получить схему компоновки и настройки ДинамическийСписок:


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

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

Важные нюансы при изменении номеров документов

Поскольку исходная задача автора заключалась в изменении номера документа (например, К0000006881 на 13D00006881), необходимо учитывать специфику работы платформы с нумерацией.

Во-первых, при программном изменении номера рекомендуется использовать режим загрузки данных. Это позволит избежать лишних проверок и срабатывания событий при записи, что значительно ускорит процесс обработки большого массива данных.


ОбъектДокумент = СсылкаНаДокумент.ПолучитьОбъект();
ОбъектДокумент.Номер = "13D" + Сред(ОбъектДокумент.Номер, 2);
ОбъектДокумент.ОбменДанными.Загрузка = Истина; 
ОбъектДокумент.Записать();

Во-вторых, после массового переименования может нарушиться механизм автоматической генерации новых номеров. Чтобы система корректно определяла следующий свободный номер, обязательно используйте метод ОбновитьНумерациюОбъектов.


// Вызывается для конкретного типа метаданных
ОбновитьНумерациюОбъектов(Метаданные.Документы.РеализацияТоваровУслуг);

Подводя итог, выбор метода передачи списка во внешнюю обработку зависит от ваших задач. Для простых действий достаточно передачи ВыделенныеСтроки, а для сложных системных инструментов лучше использовать возможности БСП или работу с КомпоновщикНастроек.

← На главную