Универсальное заполнение табличных частей на основе внешнего отчета или обработки (с примером для СКД на УПП)


Заполнение табличных частей и СКД — можно ли вместе?

Думал куда добавить в статьи, или в обработки. Добавил в обработки.

Возникла тут у меня необходимость заполнять контрагентов в скидках с отбором по различным критериям. СКД для этого отлично подходит, но СКД не подключается в моей базовой платформе (УПП 1.2.14.1 — да старая, первый этап обновления уже прошел, скоро в 1-2 скачка до 19 или 22 дойдем) к табличной части. Решил написать обработку…Подумал ещё и сделал её более универсальной. В результате получилась обработка, которую можно подключить к любой табличной части не меняя код. Модифицируется только внешние параметры обработки, которые регулируют подключение источника строк для заполнения и соответствие колонок. Пишется внешняя обработка или отчет, который в итоге при закрытии основной формы выдает таблицу значений. Эта таблица и впихивается в табличную часть.

Параметры:

 ВнешнийФайл (булево) — истина, если обработка с диска, а не из справочника внешних обработок,

 КодПутьОбработкиЗаполнения (строка) — код обработки из справочника или полный путь к обработке на диске

 СКД (булево) — является ли подключаемый файл отчетом или обработкой

 ПолеТабличнойЧасти (строка) — наименование поля табличной части, которое нужно заполнять

 ПолеСКД (строка) — наименование поля таблицы значений из которого брать значения

Если одно из последних двух полей не заполнено, то обработка проходит по всем полям таблицы значений и пытается вставить по совпадающим именам полей

Код обработки:

Процедура Инициализировать(Объект,ИмяТабличнойЧасти,ТабличноеПолеОбъекта) Экспорт;
    Попытка
        Если ДополнительныеПараметры.ВнешнийФайл Тогда //если файл на диске,
            ИмяФайла=ДополнительныеПараметры.КодПутьОбработкиЗаполнения; //то просто записываем пусть в имя файла
        Иначе //иначе в хранилище
            ВыбраннаяСтрока=Справочники.ВнешниеОбработки.НайтиПоКоду(ДополнительныеПараметры.КодПутьОбработкиЗаполнения); //тогда находим по коду
            ИмяФайла = ПолучитьИмяВременногоФайла(); //получаем имя временного файла
            ДвоичныеДанные = ВыбраннаяСтрока.ХранилищеВнешнейОбработки.Получить(); //достаем из хранилища
            ДвоичныеДанные.Записать(ИмяФайла); //сохраняем во временный файл
        КонецЕсли;

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

В форме СКД нужно добавить кнопку которая будет выгружать таблицу значений.

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

К СКД прицеплены характеристики с запросом. Проверьте, чтобы верный был. Может отличаться в различных конфах.

12 Comments

  1. igor_gk

    Чувствую — нужная вещь, плюсану, пожалуй 🙂

    Reply
  2. Telepat

    Мне реально помогло, плюс однозначно.

    Reply
  3. Alex_1066

    Как и (1) что-то чувствую… Но хотелось, чтобы бы в описание программы автор вставлял не код, чуда, им сотворённого, а что-то типа «Help». Что бы любой смертный мог попробовать воспользоваться сим произведением. Но, впрочем, задумка понятна и интерессна. Плюсанём…

    Reply
  4. anig99

    (2) так вроде написано (: Нужно написать обработку с основной формой, которая при закрытии возвращает некоторую таблицу значений. Далее нужно заполнить 4 параметра в справочнике внешних обработок для этой обработки и указать откуда её вызывать и для какой табличной части. Всё.

    Reply
  5. anig99

    (2)упс…

    (3) чуть выше, это для тебя

    Reply
  6. Alex_1066

    (5) Ага, спасибочки, кажется понял — буду пробовать…

    Reply
  7. Alex_1066

    Получилось. Ещё вопросик в развитие…

    Возможна ли, при всём при этом, в данном примере передача дополнительных параметров из документа, определяющих условия для СКД (например: заполнение ТЧ остатков по значению склада, счета, МОЛ и т.д… )?

    Reply
  8. anig99

    Подумаю… Теоретически можно. (7) Точное решение скоро выложу

    Reply
  9. SergeyT2006

    Что такое СКД?

    Reply
  10. anig99

    (9) Система компоновки данных — альтернатива Универсального отчета, но более продвинутая и настраиваемая. По дефолту сложнее универсального отчета для пользователей, но если в нём разобраться, но намного лучше.

    Reply
  11. MrXaN

    Автору большой плюс

    Reply
  12. dentoma51

    До конца не понял,но что хотел получить-получил.

    Есть отчет на СКД. Добавил табличную часть ПродажиАвтомобилей,в которой разместил реквизиты результата запроса СКД.

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

    Далее,добавил кнопку с именем ЗаполнитьТЗ,к которой по нажатию привязал процедуру,которую приводит автор,в конце которой загружаю из ТаблицыЗначений свою табличную часть,то есть

    Процедура ДействияФормыЗаполнитьТабЧасть(Кнопка)

    КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных;

    МакетКомпоновки=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек.Настройки,,,Тип(«ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений»));

    ПроцессорКомпоновки=Новый ПроцессорКомпоновкиДанных;

    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

    ПроцессорВывода= Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

    ТаблицаЗначений=ПроцессорВывода.Вывести(ПроцессорКомпоновки);

    ПродажиАвтомобилей.Загрузить(ТаблицаЗначений);

    // в итоге выводится результат запроса и в ТабличноеПоле результат и в в табличное поле ПродажиАвтомобилей

    КонецПроцедуры

    Процедура работает,если в настройках отчета выбирать Список.

    Если выбрать Таблица,то процедура дает ошибку генерации макета

    Форма.ФормаОтчета(4)}: Ошибка при вызове метода контекста (Выполнить): Ошибка компоновки макета

    МакетКомпоновки=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек.Настройки,,,Тип(«ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений»));

    по причине:

    Ошибка компоновки макета

    по причине:

    Ошибка генерации макета

    по причине:

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

    Автору большой плюс. Надо теперь попытаться осмыслить глобальное назначение разработки

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *