Думал куда добавить в статьи, или в обработки. Добавил в обработки.
Возникла тут у меня необходимость заполнять контрагентов в скидках с отбором по различным критериям. СКД для этого отлично подходит, но СКД не подключается в моей базовой платформе (УПП 1.2.14.1 - да старая, первый этап обновления уже прошел, скоро в 1-2 скачка до 19 или 22 дойдем) к табличной части. Решил написать обработку...Подумал ещё и сделал её более универсальной. В результате получилась обработка, которую можно подключить к любой табличной части не меняя код. Модифицируется только внешние параметры обработки, которые регулируют подключение источника строк для заполнения и соответствие колонок. Пишется внешняя обработка или отчет, который в итоге при закрытии основной формы выдает таблицу значений. Эта таблица и впихивается в табличную часть.
Параметры:
ВнешнийФайл (булево) - истина, если обработка с диска, а не из справочника внешних обработок,
КодПутьОбработкиЗаполнения (строка) - код обработки из справочника или полный путь к обработке на диске
СКД (булево) - является ли подключаемый файл отчетом или обработкой
ПолеТабличнойЧасти (строка) - наименование поля табличной части, которое нужно заполнять
ПолеСКД (строка) - наименование поля таблицы значений из которого брать значения
Если одно из последних двух полей не заполнено, то обработка проходит по всем полям таблицы значений и пытается вставить по совпадающим именам полей
Код обработки:
Процедура Инициализировать(Объект,ИмяТабличнойЧасти,ТабличноеПолеОбъекта) Экспорт;
Попытка
Если ДополнительныеПараметры.ВнешнийФайл Тогда //если файл на диске,
ИмяФайла=ДополнительныеПараметры.КодПутьОбработкиЗаполнения; //то просто записываем пусть в имя файла
Иначе //иначе в хранилище
ВыбраннаяСтрока=Справочники.ВнешниеОбработки.НайтиПоКоду(ДополнительныеПараметры.КодПутьОбработкиЗаполнения); //тогда находим по коду
ИмяФайла = ПолучитьИмяВременногоФайла(); //получаем имя временного файла
ДвоичныеДанные = ВыбраннаяСтрока.ХранилищеВнешнейОбработки.Получить(); //достаем из хранилища
ДвоичныеДанные.Записать(ИмяФайла); //сохраняем во временный файл
КонецЕсли;
Если ДополнительныеПараметры.СКД Тогда //если это СКД
Форма = ВнешниеОтчеты.ПолучитьФорму(ИмяФайла); //открываем как внешний отчет
Иначе
Форма = ВнешниеОбработки.ПолучитьФорму(ИмяФайла); //открываем как обработку
КонецЕсли;
Если Не Форма = Неопределено Тогда
ТаблицаЗначений=Форма.ОткрытьМодально(); //открываем основную форму, где выполняется обработку и возвращается таблица
КонецЕсли;
Если НЕ ДополнительныеПараметры.ВнешнийФайл Тогда //если файл создавался временно,
УдалитьФайлы(ИмяФайла); //то удаляем его
КонецЕсли;
Исключение
Предупреждение("Выбранный файл не соответствует заявленному типу.
|Либо данная обработка не предназначена для
|запуска в этой конфигурации.");
КонецПопытки;
Если ТаблицаЗначений=Неопределено Тогда
Возврат;
КонецЕсли;
СсылкаНаТабЧасть=Объект[ИмяТабличнойЧасти];
Ответ=Вопрос("Очистить список контрагентов?", РежимДиалогаВопрос.ДаНет);
Если Ответ=КодВозвратаДиалога.Да Тогда
СсылкаНаТабЧасть.Очистить();
КонецЕсли;
Для Каждого стр из ТаблицаЗначений Цикл //собственно заполнение
стр1=СсылкаНаТабЧасть.Добавить();
Если ДополнительныеПараметры.ПолеТабличнойЧасти<>"" И ДополнительныеПараметры.ПолеСКД<>"" Тогда
Попытка
стр1[ДополнительныеПараметры.ПолеТабличнойЧасти]=стр[ДополнительныеПараметры.ПолеСКД]; //название заполняемого поля берется из дополнительных параметров
Исключение
Сообщить("Не найдено "+ДополнительныеПараметры.ПолеТабличнойЧасти+" или "+ДополнительныеПараметры.ПолеСКД);
КонецПопытки
Иначе
Для Каждого Кол из ТаблицаЗначений.Колонки Цикл
Попытка
стр1[Кол.Имя]=стр[Кол.Имя];
Исключение
Сообщить("Не найдено "+Кол.Имя);
КонецПопытки;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры;
В форме СКД нужно добавить кнопку которая будет выгружать таблицу значений.
Процедура ДействияФормыЗаполнитьТабЧасть(Кнопка)
КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек.Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки=Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода= Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТаблицаЗначений=ПроцессорВывода.Вывести(ПроцессорКомпоновки);
ЭтаФорма.Закрыть(ТаблицаЗначений);
КонецПроцедуры
К СКД прицеплены характеристики с запросом. Проверьте, чтобы верный был. Может отличаться в различных конфах.