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