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