Полезности применения СКД

1 отзывFavoriteLoadingВ закладки

Нюансы при работе из СКД на программном уровне.

Всем доброго времени суток. Итак в данной статье я хочу поделится неким дополнительным навыком по работе из СКД. Статей и видео много и это довольно достаточно помогло по применению методики, которую опишу ниже, может и кому пригодится.

Начну из самой задачи.
Необходима была обработка по выгрузке документов и справочников, с определенными условиями, которые пользователь по необходимости сможет задавать на форме. Также результатируящая таблица, должна иметь возможность определять флагами, что будет выгружено в файл экспорта. ( в моем случае это текстовый документ с строгой структурой).

Все как бы просто и можно пойти старым дедовским методом через славно известный и нашумевший “УниверсаныйОтчет”, но это нам неподходит, так как предоставленная конфигурация на управляемых формах, а именно УТ11. Вспомнив некие уроки и статьи и пошастав дополнительно по форумах приступил к решению данной задачи. Было взято за основу сделать с помощью СКД.

Для этого создаем реквизит “КомпоновщикНастроекПродаж” тип которого “КомпоновщикНастроекКомпоновкиДанных”.

Помещаем на форму:

“КомпоновщикНастроекПродажНастройкиПараметрыДанных” путь к данным “КомпоновщикНастроекПродаж.Настройки.ПараметрыДанных” (пользователь сможет указать период документов).

“КомпоновщикНастроекПродажНастройкиОтбор” путь к данным “КомпоновщикНастроекПродаж.Настройки.Отбор” (пользователь сможет указать поля отбора).

Создаем макет с типом СКД имя которого “Продажи”. Через конструктор запросов описываем запрос к документу “РеализацияТоваров”.

Мягкое наложение фильтра на период документов:

{ГДЕ
(РеализацияТоваровУслуг.Дата >= &ДатаНач),
(РеализацияТоваровУслуг.Дата "<" "=" &ДатаКон)}

Добавляем в запрос поле Выгружать со значением “ИСТИНА” так как на выходе пользователю должны быть предложены все объекты на выгрузку. Можно это поле и в запросе не добавлять, а воспользоватся закладкой (Вычисляемые поля) и там указать Путь к данным “Выгружать” с выражением “ИСТИНА”, оба решения будут правильными.

На закладке СКД (Параметры) для удобства периода, поля ДатаНач и ДатаКон делаем не доступными пользователю и добавляем новое поле Период с типом “СтандартныйПериод” и делаем его доступным для выбора пользователю в параметрах данных. Выражениями поля ДатаНач и ДатаКон прописываем (&Период.ДатаНачала) и (&Период.ДатаОкончания) для каждого соответственно свое.


ВАЖНО! Не называйте поля в условие на период документов “ДатаНачала” и “ДатаОкончания” это зарезервированые поля самой системой СКД и она это понимает совершенно по другому, для чистоты эксперимента можете перепроверить.


Создаем настройку выводу пользователю, это будет вывод в линейном виде. И здесь очень важен порядок вывода полей. Необходимо выбрать лишь те поля которые информативно пользователю нужны. (почему важно опишу ниже).

Работа над макетом СКД готова.

Далее необходимо программно подключить настройки компоновки к нашей схеме “Продажи”.

МОДУЛЬ ФОРМЫ

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   УстановитьНачальныеНастройкиВыгрузки();
КонецПроцедуры

&НаСервере
Процедура УстановитьНачальныеНастройкиВыгрузки()
   ЭтотОбъект = РеквизитФормыВЗначение("Объект");

   СхемаКомпоновкиПродажи = ЭтотОбъект.ПолучитьСхемуПродажи();

 //ПРОДАЖИ
   АдресСхемыПродаж = ПоместитьВоВременноеХранилище(СхемаКомпоновкиПродажи, УникальныйИдентификатор);
   КомпоновщикНастроекПродаж.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыПродаж));
   КомпоновщикНастроекПродаж.ЗагрузитьНастройки(СхемаКомпоновкиПродажи.НастройкиПоУмолчанию);
КонецПроцедуры

МОДУЛЬ ОБЪЕКТА

Функция ПолучитьСхемуПродажи() Экспорт
 Возврат ПолучитьМакет("Продажи"); 
КонецФункции

При открытии обработки в предприятии настройки будут привязаны к нашей схеме “Продажи” и подтверждением этого станет доступность параметров данных периода и поля в Отборе.

Далее, добавляем реквизит “РезультатПродажи” с типом данных “ТаблицаЗначений”. А теперь очень важно в точной последовательности добавлять колонки ТЗ и с одинаковыми именами, а также с типизацией поля, что указана в схеме СКД в выбранных полях.


ВАЖНО. При не соблюдении этого правила, данные будут некорректно отображены или не выведены вовсе. Это правило только необходимо, если результат СКД необходимо поместить в ТЗ которую должен видеть пользователь. К табличному документу данное правило не имеет смысла.


Помещаем таблицу на форму, здесь порядок отображения колонок можно видоизменять.

Добавляем команду “ОтобразитьПродажи” и обработку данного действия.

МОДУЛЬ ФОРМЫ

&НаКлиенте
Процедура ОтобразитьПродажи(Команда)
   ПрочитатьДанныеПоПродажам();
КонецПроцедуры
&НаСервере
Процедура ПрочитатьДанныеПоПродажам()

   ЭтотОбъект = РеквизитФормыВЗначение("Объект");
   СхемаКомпоновкиПродажи = ЭтотОбъект.ПолучитьСхемуПродажи();

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

   ТЗРезультат = РеквизитФормыВЗначение("РезультатПродажи",Тип("ТаблицаЗначений"));
   ТЗРезультат.Очистить();

   ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
   ПроцессорВывода.ОтображатьПроцентВывода = Истина;
   ПроцессорВывода.УстановитьОбъект(ТЗРезультат);
   ПроцессорВывода.Вывести(ПроцессорКомпоновки,Истина);

   ЗначениеВДанныеФормы(ТЗРезультат,РезультатПродажи);
КонецПроцедуры

Уже не буду писать саму выгрузку в файл так как это не имеет отношения к СКД.

Что я хотел сказать этой статьей. Только то, что с помощью мелких хитростей СКД можно манипулировать данными и без огромного кода и домороченных реквизитов по отборам и т.д.

via logarifm

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

Один комментарий

  1. Полезная статья, мне очень помогла. Задача была похожая. Автору большое спасибо.
    С СКД я работал, но не так много и только при написании отчетов. В данном примере со всем разобрался, кроме этого:
    АдресСхемыПродаж = ПоместитьВоВременноеХранилище(СхемаКомпоновкиПродажи, УникальныйИдентификатор);
    КомпоновщикНастроекПродаж.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыПродаж));
    КомпоновщикНастроекПродаж.ЗагрузитьНастройки(СхемаКомпоновкиПродажи.НастройкиПоУмолчанию);
    Выводы для себя:
    1. СКД – вещь интересная, но не простая. Даже для того, чтобы реализовать такую, вроде несложную задачу нужно четко понимать, что она (СКД) делает на каждом этапе. И проблема в том, что ты не знаешь где ошибся. Ты или имеешь результат, или имеешь ошибку.
    2. Я так понял, что СКД и управляемые формы – вещи взаимосвязанные. Поправьте, если я не прав. На простых формах в подобной ситуации я бы использовал Построитель отчета. На УФ построителя нет, значит нужно юзать СКД. И наверное это далеко не последний пример…

Оставить комментарий

RSSКомментарии в RSS

Авторизация

Логин:
Пароль:
Регистрация

Архивы

Закладки

  • Your favorites will be here.