gifts2017

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

Опубликовал Александр Медведев (anig99) в раздел Обработки - Обработка документов

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

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

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

Параметры:

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

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

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

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

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

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

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

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

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

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

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

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

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Zapolnitel.epf
.1245841386 5,21Kb
28.08.14
177
.1245841386 5,21Kb 177 Бесплатно
OtchetPoKontragentam_.erf
.1245841488 9,57Kb
28.08.14
103
.1245841488 9,57Kb 103 Бесплатно

См. также

Подписаться Добавить вознаграждение

Комментарии

1. igor_gk (igor_gk) 01.07.09 17:17
Чувствую - нужная вещь, плюсану, пожалуй :)
2. Telepat (Telepat) 06.08.09 05:16
Мне реально помогло, плюс однозначно.
3. Алекс Маслюков (Alex_1066) 31.08.09 14:09
Как и (1) что-то чувствую... Но хотелось, чтобы бы в описание программы автор вставлял не код, чуда, им сотворённого, а что-то типа "Help". Что бы любой смертный мог попробовать воспользоваться сим произведением. Но, впрочем, задумка понятна и интерессна. Плюсанём...
4. Александр Медведев (anig99) 31.08.09 16:04
(2) так вроде написано (: Нужно написать обработку с основной формой, которая при закрытии возвращает некоторую таблицу значений. Далее нужно заполнить 4 параметра в справочнике внешних обработок для этой обработки и указать откуда её вызывать и для какой табличной части. Всё.
5. Александр Медведев (anig99) 31.08.09 16:05
(2)упс...
(3) чуть выше, это для тебя
6. Алекс Маслюков (Alex_1066) 31.08.09 16:29
(5) Ага, спасибочки, кажется понял - буду пробовать...
7. Алекс Маслюков (Alex_1066) 01.09.09 15:49
Получилось. Ещё вопросик в развитие...
Возможна ли, при всём при этом, в данном примере передача дополнительных параметров из документа, определяющих условия для СКД (например: заполнение ТЧ остатков по значению склада, счета, МОЛ и т.д... )?
8. Александр Медведев (anig99) 01.09.09 16:29
Подумаю... Теоретически можно. (7) Точное решение скоро выложу
9. Сергей Тучин (SergeyT2006) 02.09.09 05:12
10. Александр Медведев (anig99) 02.09.09 08:03
(9) Система компоновки данных - альтернатива Универсального отчета, но более продвинутая и настраиваемая. По дефолту сложнее универсального отчета для пользователей, но если в нём разобраться, но намного лучше.
11. Pavel Nevzorov (MrXaN) 23.09.11 14:16
12. Николай Денисов (dentoma51) 18.10.11 13:30
До конца не понял,но что хотел получить-получил.
Есть отчет на СКД. Добавил табличную часть ПродажиАвтомобилей,в которой разместил реквизиты результата запроса СКД.
Добавил форму отчета и автоматически разместил на ней все элементы управления. В результате построено ПолеТабличногоДокумента с именем Результат и табличное поле ПродажиАвтомобилей с колонками ,собственно,полей табличной части ПродажиАвтомобилей.
Далее,добавил кнопку с именем ЗаполнитьТЗ,к которой по нажатию привязал процедуру,которую приводит автор,в конце которой загружаю из ТаблицыЗначений свою табличную часть,то есть


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

Процедура работает,если в настройках отчета выбирать Список.
Если выбрать Таблица,то процедура дает ошибку генерации макета
Форма.ФормаОтчета(4)}: Ошибка при вызове метода контекста (Выполнить): Ошибка компоновки макета
МакетКомпоновки=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек.Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
по причине:
Ошибка компоновки макета
по причине:
Ошибка генерации макета
по причине:
Не поддерживается вывод таблиц, диаграмм и вложенных отчетов в универсальную коллекцию значений

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