В процессе разработки в среде 1С:Предприятие 8.3 на управляемых формах часто возникает задача по обработке группы документов. Типичный сценарий: пользователь открывает список документов, применяет определенные фильтры или выделяет несколько строк мышкой, после чего хочет запустить внешнюю обработку для выполнения массовых действий (например, группового переименования номеров или изменения реквизитов). В этой статье мы подробно разберем, как правильно организовать передачу данных между формой списка и внешней обработкой, используя современные механизмы платформы.
Рассмотрим самый простой и наиболее часто используемый способ, когда нам нужно передать только те документы, которые пользователь выделил в списке вручную. Для этого нам понадобится программно открыть форму внешней обработки и передать в нее структуру параметров.
На стороне формы списка документов создадим команду, в которой выполним следующий код:
&НаКлиенте
Процедура КомандаОткрытьОбработку(Команда)
// Получаем массив ссылок на выделенные строки
МассивВыделенныхСсылок = Элементы.Список.ВыделенныеСтроки;
Если МассивВыделенныхСсылок.Количество() = 0 Тогда
ПоказатьПредупреждение(, "Пожалуйста, выделите хотя бы один документ.");
Возврат;
КонецЕсли;
// Формируем параметры для передачи
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("МассивДокументов", МассивВыделенныхСсылок);
// Открываем форму внешней обработки
// Путь должен указывать на форму вашей внешней обработки
ОткрытьФорму("ВнешняяОбработка.НаименованиеВашейОбработки.Форма.Форма", ПараметрыФормы);
КонецПроцедуры
Теперь проанализируем, как принять эти данные внутри внешней обработки. В модуле формы обработки нам необходимо перехватить переданные параметры в обработчике ПриСозданииНаСервере.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем наличие параметра
Если Параметры.Свойство("МассивДокументов") Тогда
// Заполняем таблицу значений на форме обработки для визуализации
Для Каждого СсылкаИзСписка Из Параметры.МассивДокументов Цикл
НоваяСтрока = Объект.ТаблицаДокументов.Добавить();
НоваяСтрока.ДокументСсылка = СсылкаИзСписка;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Если ваша конфигурация разработана на базе БСП, мы рекомендуем использовать штатный механизм дополнительных отчетов и обработок. Это наиболее профессиональный подход, так как он позволяет интегрировать обработку в интерфейс без внесения изменений в основную конфигурацию.
Разберем основные шаги реализации этого метода:
СведенияОВнешнейОбработке, указав вид обработки как ДополнительнаяОбработка или ЗаполнениеОбъекта.ВыполнитьКоманду.В этом случае система автоматически передает массив ссылок в параметр ОбъектыНазначения. Посмотрим на пример кода в модуле объекта:
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
// ОбъектыНазначения — это уже готовый массив ссылок на выделенные документы
Для Каждого ТекущийДокумент Из ОбъектыНазначения Цикл
// Здесь мы можем реализовать логику, например, переименование номера
ОбъектДок = ТекущийДокумент.ПолучитьОбъект();
// Алгоритм изменения номера...
ОбъектДок.Записать();
КонецЦикла;
КонецПроцедуры
Иногда количество передаваемых документов исчисляется тысячами. Передача огромного массива через структуру параметров может привести к существенным задержкам. Проанализируем более эффективный способ — использование ВременноеХранилище.
Алгоритм действий следующий:
Рассмотрим пример реализации на форме списка:
&НаСервере
Функция ПоместитьСписокВоХранилище(МассивСсылок)
Возврат ПоместитьВоВременноеХранилище(МассивСсылок, ЭтаФорма.УникальныйИдентификатор);
КонецФункции
&НаКлиенте
Процедура ВыполнитьПередачу(Команда)
МассивДанных = Элементы.Список.ВыделенныеСтроки;
АдресХранилища = ПоместитьСписокВоХранилище(МассивДанных);
ПараметрыОткрытия = Новый Структура("АдресДанных", АдресХранилища);
ОткрытьФорму("ВнешняяОбработка.МояОбработка.Форма", ПараметрыОткрытия);
КонецПроцедуры
Часто возникает ситуация, когда пользователю нужно обработать не только выделенные строки, а все документы, которые попали в текущий динамический список с учетом всех установленных фильтров. В этом случае нам нужно извлечь настройки компоновщика данных.
Выясним, как программно получить схему компоновки и настройки ДинамическийСписок:
&НаСервере
Функция ПолучитьВсеДокументыИзСписка()
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТаблицаРезультат = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат ТаблицаРезультат.ВыгрузитьКолонку("Ссылка");
КонецФункции
Этот метод позволяет внешней обработке "видеть" ровно те же данные, что видит пользователь на экране, включая результат поиска и сложные отборы.
Поскольку исходная задача автора заключалась в изменении номера документа (например, К0000006881 на 13D00006881), необходимо учитывать специфику работы платформы с нумерацией.
Во-первых, при программном изменении номера рекомендуется использовать режим загрузки данных. Это позволит избежать лишних проверок и срабатывания событий при записи, что значительно ускорит процесс обработки большого массива данных.
ОбъектДокумент = СсылкаНаДокумент.ПолучитьОбъект();
ОбъектДокумент.Номер = "13D" + Сред(ОбъектДокумент.Номер, 2);
ОбъектДокумент.ОбменДанными.Загрузка = Истина;
ОбъектДокумент.Записать();
Во-вторых, после массового переименования может нарушиться механизм автоматической генерации новых номеров. Чтобы система корректно определяла следующий свободный номер, обязательно используйте метод ОбновитьНумерациюОбъектов.
// Вызывается для конкретного типа метаданных
ОбновитьНумерациюОбъектов(Метаданные.Документы.РеализацияТоваровУслуг);
Подводя итог, выбор метода передачи списка во внешнюю обработку зависит от ваших задач. Для простых действий достаточно передачи ВыделенныеСтроки, а для сложных системных инструментов лучше использовать возможности БСП или работу с КомпоновщикНастроек.