Как программно сформировать отчет СКД указав параметры и на выходе получить таблице значений? В одном документе для расчета потребовалось получать данные из отчета на СКД, реализовал следующим образом:
Код 1C v 8.х //Програмное формирование отчета СКД
СхемаОст = Отчеты.ТоннажПоЭкспедиторам.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикНастроекНастройки = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроекНастройки.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаОст));
КомпоновщикНастроекНастройки.ЗагрузитьНастройки(СхемаОст.НастройкиПоУмолчанию);
КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", НачалоМесяца(МесяцРасчета));
КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", КонецМесяца(МесяцРасчета));
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаОст, КомпоновщикНастроекНастройки.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ДанныеТЗ = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ДанныеТЗ);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
ТоннажПоЭкспедиторам.Очистить();
// ДанныеТЗ.ВыбратьСтроку();
Для каждого СтрокаТЗ Из ДанныеТЗ Цикл
Если ЗначениеЗаполнено(СтрокаТЗ.Экспедитор) и СтрокаТЗ.Доставка=Неопределено Тогда
нСтр = ТоннажПоЭкспедиторам.Добавить();
ЗаполнитьЗначенияСвойств(нСтр,СтрокаТЗ);
нСтр.Сотрудник=СтрокаТЗ.Экспедитор;
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
Категория:
Схема Компоновки Данных Как программно установить отбор в СКД Код 1C v 8.х Процедура ВашРеквизитПриИзменении(Элемент)
СоответствиеПоискаОтбора = Новый Соответствие;
СоответствиеПоискаОтбора.Вставить("ЛевоеЗначение",Новый ПолеКомпоновкиДанных("%Нужное поле компоновки%"));
СоответствиеПоискаОтбора.Вставить("ВидСравнения",ВидСравненияКомпоновкиДанных.ВСписке); //сюда впихнуть нужный вид сравнения
СоответствиеПоискаОтбора.Вставить("Использование",Истина);
СоответствиеНовогоОтбора = Новый Соответствие;
СоответствиеНовогоОтбора.Вставить("ЛевоеЗначение",Новый ПолеКомпоновкиДанных("%Нужное поле компоновки%"));
СоответствиеНовогоОтбора.Вставить("ВидСравнения",ВидСравненияКомпоновкиДанных.ВСписке); // вид сравнения
Если ЗначениеЗаполнено(Кампейны) тогда
СоответствиеНовогоОтбора.Вставить("Использование",Истина);
Иначе
СоответствиеНовогоОтбора.Вставить("Использование",Ложь);
КонецЕсли;
СоответствиеНовогоОтбора.Вставить("Значение",Кампейны);
ИзменитьОтбор(КомпоновщикНастроек,СоответствиеПоискаОтбора,СоответствиеНовогоОтбора);
КонецПроцедуры
Процедура ИзменитьОтбор(ЭлементСтруктуры, СоответствиеПоискаОтбора = Неопределено, СоответствиеНовогоОтбора) Экспорт
Если ТипЗнч(ЭлементСтруктуры) = Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
Отбор = ЭлементСтруктуры.Настройки.Отбор;
Иначе
Отбор = ЭлементСтруктуры;
КонецЕсли;
Если ТипЗнч(СоответствиеНовогоОтбора["ЛевоеЗначение"]) = Тип("Строка") Тогда
нПоле = Новый ПолеКомпоновкиДанных(СоответствиеНовогоОтбора.ЛевоеЗначение);
Иначе
нПоле = СоответствиеНовогоОтбора["ЛевоеЗначение"];
КонецЕсли;
Если СоответствиеНовогоОтбора.Получить("ВидСравнения") = Неопределено Тогда
нВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Иначе
нВидСравнения = СоответствиеНовогоОтбора["ВидСравнения"];
КонецЕсли;
Если СоответствиеНовогоОтбора.Получить("Использование") = Неопределено Тогда
нИспользование = Истина;
Иначе
нИспользование = СоответствиеНовогоОтбора["Использование"];
КонецЕсли;
нЗначение = СоответствиеНовогоОтбора["Значение"];
ТолькоПоЛевомуЗначению = Ложь;
Если СоответствиеПоискаОтбора = Неопределено Тогда
ТолькоПоЛевомуЗначению = Истина;
КонецЕсли;
сЛевоеЗначение = СоответствиеПоискаОтбора.Получить("ЛевоеЗначение");
Если сЛевоеЗначение = Неопределено Тогда
сЛевоеЗначение = нПоле;
КонецЕсли;
сВидСравнения = СоответствиеПоискаОтбора.Получить("ВидСравнения");
Если ВидСравнения = Неопределено Тогда
сВидСравнения = ВидСравнения;
КонецЕсли;
сИспользование = СоответствиеПоискаОтбора.Получить("Использование");
Если сИспользование = Неопределено Тогда
сИспользование = нИспользование;
КонецЕсли;
Для каждого ЭлементОтбора Из Отбор.Элементы Цикл
Если ТолькоПоЛевомуЗначению Тогда
НайденныйОтбор = ЭлементОтбора;
Прервать;
Иначе
Если (ЭлементОтбора.ЛевоеЗначение = сЛевоеЗначение)
И (ЭлементОтбора.ВидСравнения = сВидСравнения)
Тогда
НайденныйОтбор = ЭлементОтбора;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если НайденныйОтбор <> Неопределено Тогда
НайденныйОтбор.ЛевоеЗначение = нПоле;
НайденныйОтбор.Использование = нИспользование;
НайденныйОтбор.ВидСравнения = нВидСравнения;
НайденныйОтбор.ПравоеЗначение = нЗначение;
Иначе
НовыйЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ПолеОтбора = Новый ПолеКомпоновкиДанных(нПоле);
НовыйЭлементОтбора.ЛевоеЗначение = нПоле;
НовыйЭлементОтбора.Использование = нИспользование;
НовыйЭлементОтбора.ВидСравнения = нВидСравнения;
НовыйЭлементОтбора.ПравоеЗначение = нЗначение;
КонецЕсли;
КонецПроцедуры
Категория:
Схема Компоновки Данных Печатная форма с использованием СКД Создаем макет СКД, там произвольно или с какими-нибудь условиями выбираем в наборе данных поля табличной части, ставим условие на документ владелец, и задаем оформление. В форме документа добавляем кнопку печать, прописываем в параметрах наш документ и оп-ля - печатная форма готова
Код 1C v 8.х Процедура ОсновныеДействияФормыПечать(Кнопка)
Если Ссылка = Документы.РасчетЗаказа.ПустаяСсылка() тогда
Предупреждение("Документ не записан");
Возврат;
Иначе
Схема = ПолучитьМакет("Макет1");
Настройки = Схема.НастройкиПоУмолчанию;
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных();
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
ПараметрДок = Новый ПараметрКомпоновкиДанных("документ");
ЗначениеПараметраДок = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрДок);
ЗначениеПараметраДок.Значение = Ссылка;
ЗначениеПараметраДок.Использование = Истина;
Настройки = КомпоновщикНастроек.Настройки;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
ДокументРезультат = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
ДокументРезультат.ОтображатьЗаголовки = Ложь;
ДокументРезультат.ОтображатьСетку = Ложь;
ДокументРезультат.АвтоМасштаб = Истина;
ДокументРезультат.Показать();
КонецЕсли;
КонецПроцедуры
Автор:
sanja Категория:
Схема Компоновки Данных Пример программного вызова СКД отчета Пример использования СКД отчета для заполнения табличного документа.
Вызываем отчет “Маркетинговый план” сделаного на основе СКД.
Установка параметр “Вероятность”. И отбора по ключу “Основание.МВЗ.СПО”
Код 1C v 8.х Отчет = Отчеты.МаркетинговыйПлан.Создать();
Схема = Отчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ТабДок = Новый ТабличныйДокумент;
// Типы переменных:
// Схема - СхемаКомпоновкиДанных
// Настройки - НастройкиКомпоновкиДанных
// насПланЕБП - ЗначениеПараметраНастроекКомпоновкиДанных
// Макет - МакетКомпоновкиДанных
ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема);
КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек);
// --- установка параметров
Настройки = Схема.НастройкиПоУмолчанию;
насВероятнось = Настройки.ПараметрыДанных.Элементы.Найти("Вероятность");
насВероятнось.Использование = Истина;
насВероятнось.Значение = Веротяность;
// --- установка отборов
Если ЗначениеЗаполнено(СПО) тогда
ПолеОтбораСПО = Новый ПолеКомпоновкиДанных("Основание.МВЗ.СПО");
ОтборПоСПО = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборПоСПО.ЛевоеЗначение = ПолеОтбораСПО;
ОтборПоСПО.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборПоСПО.ПравоеЗначение = СПО;
ОтборПоСПО.Использование = Истина;
КонецЕсли;
// --- компануем
Макет = КомпоновщикМакета.Выполнить(Схема, Настройки);
ПроцессорКомпоновки.Инициализировать(Макет,,,Истина);
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Категория:
Схема Компоновки Данных Использование двух Схем Компоновки Данных - загрузка, получение параметров и настроек Есть две схемы, основная и не основная:
Код 1C v 8.х
//Как для формирования отчета испольновать не основную СКД? так:
НоваяСхема = ПолучитьМакет(НеОсновнаяСхемаКомпоновкиДанных);
Отчет.СхемаКомпоновкиДанных = НоваяСхема;
//Загрузим настройки СКД
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(НоваяСхема.НастройкиПоУмолчанию);
Код 1C v 8.х //Как программно получить параметры не основной СКД? так:
Схема = ПолучитьМакет("НеОсновнаяСхемаКомпоновкиДанных");
ПараметрыСхемы = Схема.Параметры;
Код 1C v 8.х // Абазин Антон: мне иногда лень городить программное заполнение схемы,
// я ее делаю в режиме предприятия, сохраняю в xml,
// потом этот xml помещаю в макет как двоичные данные
// потом в коде сохраняю xml из макета в tmp и подставляю ее в скд ))
Макет = ПолучитьМакет("Настройка");
Макет.Записать(ИмяФайла);
Чтение = Новый ЧтениеXML;
НовыйСXDTO = Новый СериализаторXDTO(ФабрикаXDTO);
Чтение.ОткрытьФайл(ИмяФайла);
Настройки = НовыйСXDTO.ПрочитатьXML(Чтение);
КомпоновщикНастроек1 = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек1.ЗагрузитьНастройки(Настройки);//СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
Категория:
Схема Компоновки Данных Как программно Изменить Отбор в отчете СКД Эта тема тоже достаточна распространена. Нюанс программного изменения отбора заключается в том, что коллекция:
Код 1C v 8.х КомпоновщикНастроек.Настройки.Отбор.Элементы
в отличие от аналогичной коллекции параметров, не имеет метода Найти(). Можно конечно изменять отбор «в лоб», т.е. по индексу, но это не есть хорошо. Самый оптимальный вариант, обходить все поля отбора в цикле.
Приведу пример универсальной функции для изменения отбор компоновки данных:
Код 1C v 8.х //Ищет отбор в компоновщике настроек по параметрам, заданным через
//"СоответствиеПоискаОтбора", и заменяет
//на отбор с параметрами, указанными в "СоответствиеНовогоОтбора"
Процедура ИзменитьОтбор(ЭлементСтруктуры,
СоответствиеПоискаОтбора = Неопределено, СоответствиеНовогоОтбора) Экспорт
Если ТипЗнч(ЭлементСтруктуры) = Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
Отбор = ЭлементСтруктуры.Настройки.Отбор;
Иначе
Отбор = ЭлементСтруктуры;
КонецЕсли;
Если ТипЗнч(СоответствиеНовогоОтбора["ЛевоеЗначение"]) = Тип("Строка") Тогда
нПоле = Новый ПолеКомпоновкиДанных(СоответствиеНовогоОтбора.ЛевоеЗначение);
Иначе
нПоле = СоответствиеНовогоОтбора["ЛевоеЗначение"];
КонецЕсли;
Если СоответствиеНовогоОтбора.Получить("ВидСравнения") = Неопределено Тогда
нВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Иначе
нВидСравнения = СоответствиеНовогоОтбора["ВидСравнения"];
КонецЕсли;
Если СоответствиеНовогоОтбора.Получить("Использование") = Неопределено Тогда
нИспользование = Истина;
Иначе
нИспользование = СоответствиеНовогоОтбора["Использование"];
КонецЕсли;
нЗначение = СоответствиеНовогоОтбора["Значение"];
ТолькоПоЛевомуЗначению = Ложь;
Если СоответствиеПоискаОтбора = Неопределено Тогда
ТолькоПоЛевомуЗначению = Истина;
КонецЕсли;
сЛевоеЗначение = СоответствиеПоискаОтбора.Получить("ЛевоеЗначение");
Если сЛевоеЗначение = Неопределено Тогда
сЛевоеЗначение = нПоле;
КонецЕсли;
сВидСравнения = СоответствиеПоискаОтбора.Получить("ВидСравнения");
Если ВидСравнения = Неопределено Тогда
сВидСравнения = ВидСравнения;
КонецЕсли;
сИспользование = СоответствиеПоискаОтбора.Получить("Использование");
Если сИспользование = Неопределено Тогда
сИспользование = нИспользование;
КонецЕсли;
Для каждого ЭлементОтбора Из Отбор.Элементы Цикл
Если ТолькоПоЛевомуЗначению Тогда
НайденныйОтбор = ЭлементОтбора;
Прервать;
Иначе
Если (ЭлементОтбора.ЛевоеЗначение = сЛевоеЗначение)
И (ЭлементОтбора.ВидСравнения = сВидСравнения)
И (ЭлементОтбора.Использование = сИспользование) Тогда
НайденныйОтбор = ЭлементОтбора;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если НайденныйОтбор <> Неопределено Тогда
НайденныйОтбор.ЛевоеЗначение = нПоле;
НайденныйОтбор.Использование = нИспользование;
НайденныйОтбор.ВидСравнения = нВидСравнения;
НайденныйОтбор.ПравоеЗначение = нЗначение;
КонецЕсли;
КонецПроцедуры
Пример вызова процедуры:
Код 1C v 8.х СоответствиеПоискаОтбора = Новый Соответствие;
СоответствиеПоискаОтбора.Вставить("ЛевоеЗначение",Новый ПолеКомпоновкиДанных("Наименование"));
СоответствиеПоискаОтбора.Вставить("ВидСравнения",ВидСравненияКомпоновкиДанных.Содержит);
СоответствиеПоискаОтбора.Вставить("Использование",Истина);
СоответствиеНовогоОтбора = Новый Соответствие;
СоответствиеНовогоОтбора.Вставить("ЛевоеЗначение",Новый ПолеКомпоновкиДанных("Наименование"));
СоответствиеНовогоОтбора.Вставить("ВидСравнения",ВидСравненияКомпоновкиДанных.Содержит);
СоответствиеНовогоОтбора.Вставить("Использование",Истина);
СоответствиеНовогоОтбора.Вставить("Значение","бла-бла-бла");
ИзменитьОтбор(КомпоновщикНастроек,СоответствиеПоискаОтбора,СоответствиеНовогоОтбора);
Автор:
also Категория:
Схема Компоновки Данных