Полезности применения СКД
Нюансы при работе из СКД на программном уровне.
- Описание
- Подробнее
Описание
Всем доброго времени суток. Итак в данной статье я хочу поделится неким дополнительным навыком по работе из СКД. Статей и видео много и это довольно достаточно помогло по применению методики, которую опишу ниже, может и кому пригодится.
Начну из самой задачи.
Необходима была обработка по выгрузке документов и справочников, с определенными условиями, которые пользователь по необходимости сможет задавать на форме. Также результатируящая таблица, должна иметь возможность определять флагами, что будет выгружено в файл экспорта. ( в моем случае это текстовый документ с строгой структурой).
Все как бы просто и можно пойти старым дедовским методом через славно известный и нашумевший «УниверсаныйОтчет», но это нам неподходит, так как предоставленная конфигурация на управляемых формах, а именно УТ11. Вспомнив некие уроки и статьи и пошастав дополнительно по форумах приступил к решению данной задачи. Было взято за основу сделать с помощью СКД.
Для этого создаем реквизит «КомпоновщикНастроекПродаж» тип которого «КомпоновщикНастроекКомпоновкиДанных».
Помещаем на форму:
«КомпоновщикНастроекПродажНастройкиПараметрыДанных» путь к данным «КомпоновщикНастроекПродаж.Настройки.ПараметрыДанных» (пользователь сможет указать период документов).
«КомпоновщикНастроекПродажНастройкиОтбор» путь к данным «КомпоновщикНастроекПродаж.Настройки.Отбор» (пользователь сможет указать поля отбора).
Создаем макет с типом СКД имя которого «Продажи». Через конструктор запросов описываем запрос к документу «РеализацияТоваров».
Мягкое наложение фильтра на период документов:
{ГДЕ
(РеализацияТоваровУслуг.Дата >= &ДатаНач),
(РеализацияТоваровУслуг.Дата «<» «=» &ДатаКон)}
Добавляем в запрос поле Выгружать со значением «ИСТИНА» так как на выходе пользователю должны быть предложены все объекты на выгрузку. Можно это поле и в запросе не добавлять, а воспользоватся закладкой (Вычисляемые поля) и там указать Путь к данным «Выгружать» с выражением «ИСТИНА», оба решения будут правильными.
На закладке СКД (Параметры) для удобства периода, поля ДатаНач и ДатаКон делаем не доступными пользователю и добавляем новое поле Период с типом «СтандартныйПериод» и делаем его доступным для выбора пользователю в параметрах данных. Выражениями поля ДатаНач и ДатаКон прописываем (&Период.ДатаНачала) и (&Период.ДатаОкончания) для каждого соответственно свое.
ВАЖНО! Не называйте поля в условие на период документов «ДатаНачала» и «ДатаОкончания» это зарезервированые поля самой системой СКД и она это понимает совершенно по другому, для чистоты эксперимента можете перепроверить.
Создаем настройку выводу пользователю, это будет вывод в линейном виде. И здесь очень важен порядок вывода полей. Необходимо выбрать лишь те поля которые информативно пользователю нужны. (почему важно опишу ниже).
Работа над макетом СКД готова.
Далее необходимо програмно подключить настройки компоновки к нашей схеме «Продажи».
МОДУЛЬ ФОРМЫ
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьНачальныеНастройкиВыгрузки();
КонецПроцедуры
&НаСервере
Процедура УстановитьНачальныеНастройкиВыгрузки()
ЭтотОбъект = РеквизитФормыВЗначение("Объект");
СхемаКомпоновкиПродажи = ЭтотОбъект.ПолучитьСхемуПродажи();
//ПРОДАЖИ
АдресСхемыПродаж = ПоместитьВоВременноеХранилище(СхемаКомпоновкиПродажи, УникальныйИдентификатор);
КомпоновщикНастроекПродаж.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыПродаж));
КомпоновщикНастроекПродаж.ЗагрузитьНастройки(СхемаКомпоновкиПродажи.НастройкиПоУмолчанию);
КонецПроцедуры
МОДУЛЬ ОБЪЕКТА
Функция ПолучитьСхемуПродажи() Экспорт
Возврат ПолучитьМакет("Продажи");
КонецФункцииПри открытии обработки в предприятии настройки будут привязаны к нашей схеме «Продажи» и подтверждением этого станет доступность параметров данных периода и поля в Отборе.
Далее, добавляем реквизит «РезультатПродажи» с типом данных «ТаблицаЗначений». А теперь очень важно в точной последовательности добавлять колонки ТЗ и с одинаковыми именами, а также с типизацией поля, что указана в схеме СКД в выбранных полях.
ВАЖНО. При не соблюдении этого правила, данные будут некорректно отображены или не выведены вовсе. Это правило только необходимо, если результат СКД необходимо поместить в ТЗ которую должен видеть пользователь. К табличному документу данное правило не имеет смысла.
Помещаем таблицу на форму, здесь порядок отображения колонок можно видоизменять.
Добавляем команду «ОтобразитьПродажи» и обработку данного действия.
МОДУЛЬ ФОРМЫ
&НаКлиенте
Процедура ОтобразитьПродажи(Команда)
ПрочитатьДанныеПоПродажам();
КонецПроцедуры
&НаСервере
Процедура ПрочитатьДанныеПоПродажам()
ЭтотОбъект = РеквизитФормыВЗначение("Объект");
СхемаКомпоновкиПродажи = ЭтотОбъект.ПолучитьСхемуПродажи();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиПродажи,КомпоновщикНастроекПродаж.ПолучитьНастройки(),,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
//важный параметр, так как будет воспроизведена ошибка. По умолчанию параметр для табличного документа.
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет);
ТЗРезультат = РеквизитФормыВЗначение("РезультатПродажи",Тип("ТаблицаЗначений"));
ТЗРезультат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.ОтображатьПроцентВывода = Истина;
ПроцессорВывода.УстановитьОбъект(ТЗРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки,Истина);
ЗначениеВДанныеФормы(ТЗРезультат,РезультатПродажи);
КонецПроцедуры
Уже не буду писать саму выгрузку в файл так как это не имеет отношения к СКД.
Что я хотел сказать этой статьей. Только то, что с помощью мелких хитростей СКД можно манипулировать данными и без огромного кода и домороченных реквизитов по отборам и т.д.

