gifts2017

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

Опубликовал Александр Хомяк (logarifm) в раздел Программирование - Практика программирования

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

 

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

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

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

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

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

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

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

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

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

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

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

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


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


 

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

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

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

 

МОДУЛЬ ФОРМЫ

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

УстановитьНачальныеНастройкиВыгрузки();

КонецПроцедуры

 

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

ЭтотОбъект = РеквизитФормыВЗначение("Объект");

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

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

КонецПроцедуры

 

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

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

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

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


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


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

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

МОДУЛЬ ФОРМЫ

&НаКлиенте
Процедура ОтобразитьПродажи(Команда)

ПрочитатьДанныеПоПродажам();

КонецПроцедуры

 

&НаСервере
Процедура ПрочитатьДанныеПоПродажам()

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

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


ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет);

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

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

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

КонецПроцедуры

 

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

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

См. также

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

Комментарии

1. Serg Kondrasgov (SergDi) 12.04.12 00:33
Огромное спасибо, сэкономил время, как раз думал над подобным вопросом
2. kiv82 (AltF1) 12.04.12 11:20
3. Владимир Ленгин (vlengin) 12.04.12 17:29
Отлично. Большое спасибо за
  • Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"))
  • АдресСхемыПродаж = ПоместитьВоВременноеХранилище(СхемаКомпоновкиПродажи, УникальныйИдентификатор);

1. Но если выполнять все это в контексте отчета, а не обработки (а что мешает использовать отчет для обработки? ), то будет конечно же проще (не надо будет заморачиваться в ПриСозданииНаСервере)

Модуль Формы:

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


2. И не понял трудности с результирующей таблицей значений: у меня колонки идут в произовольном порядке, вывод результата в одной строке (ТЗФорма.Загрузить(ТЗ)).
4. Владимир Ленгин (vlengin) 12.04.12 17:31
ТабДок=Новый ТабличныйДокумент; - у меня лишняя строка, нужно удалить.
5. Александр Хомяк (logarifm) 12.04.12 19:10
Отчетом нет. сущность в том, что пользователь должен иметь возможность еще интерактивно на форме указывать флагами, что он хочет выгружать, а что нет. В этом весь смысл, что выгрузка в ТабличныйДокумент намного проще, а вот выгрзузка в ТаблицуЗначений есть сложность.
6. Владимир Ленгин (vlengin) 13.04.12 09:24
(5) logarifm,
Я понял смысл, что пользователь должен интерактивно отмечать нужные строки, но ничего не мешает создать свою форму отчета с таблицей значений на ней и загружать в нее результат СКД , в этом случае все намного проще.
В моем коде (см. выше) как раз и идет выгрузка в таблицу значений в форме отчета .
7. Александр Хомяк (logarifm) 13.04.12 10:17
Здесь не одна схема компоновки, а в моем случае 5.
8. Владимир Каракозов (karakozov) 13.04.12 10:30
Отличная статья, тема СКД всегда актуально, сколько материалов бы не попадало на глазу, все время подчеркнешь для себя что нибудь новое.
9. USER--1C USER--1C (USER--1C) 14.04.12 21:35
Спасибо. Все больше конфигураций на УФ. Универсальный отчет не спасает. СКД - удобно.
10. Евгений Шабалин (xzorkiix) 16.04.12 09:30
Есть вопрос про Управляемые Формы и СКД. Не удаётся корректно установить программно отчёту произвольную СКД (проблему описал здесь http://forum.infostart.ru/forum26/topic58720/ ) после программной установке, как я понимаю проблему, отчет на стороне клиента не видит новые наборы данных, следовательно нет доступных реквизитов (полей для выбора).
11. igor sarafanov (ms200999) 16.04.12 17:24
Спасибо, очень интересная статья.
12. Dima K (H0SE) 18.04.12 15:53
Спасибо большое за такие стати по СКД
13. Andrey Dyak (electronik) 19.04.12 12:39
Статья просто супер. Сколько не читай все одно есть что почерпнуть. Таких статей бы побольше. Автору заслуженое 5+++ Респект Так Держать
14. Ирли Бёрд (EarlyBird) 20.04.12 08:07
Полезная статья.
Почерпнул!
15. maksim.s.titov (Gandalf Белый) 20.04.12 10:04
Большое спасибо! Очень позновательно написано! Взял себе на заметку! ))
16. Денис (Den_D) 20.04.12 16:46
И новичку и опытному грузовичку)))
17. Иван (Sairys) 27.04.12 10:13
Интересная статья. Вообще СКД выручает во многих задачах. И ещё замечено что СКД на управляемом приложении работаю быстрей, чем то же СКД которая работает на обычном приложении.
И ещё есть вопрос "Мягкое задание параметров" таких как в данной статье по периоду, работает только в СКД или его можно использовать и в обычных запросах ?
18. Денис (Den_D) 29.08.12 12:58
Спасибо большое за науку. Вообще очень удобно все отчеты делать с полем "Период". Не зря 1С делают ставку на СКД инструмент мощный и очень полезный, хотя и не всегда логично-понятный.
19. Сергей Ожерельев (Поручик) 15.01.13 00:01
Один из примеров программной генерации и использования СКД http://infostart.ru/public/122215/
20. Павел (Yimaida) 23.05.13 22:38
Была одна задача, которая была отодвинута в долгий ящик. Там нужно было по сложным отборам (динамическим) заполнять табличную часть документа. Я тоже думал использовать СКД из-за одной очень важной функции, которую я видел только в СКД. Это возможность объединять условия в группы. Т.е. не простое "И", как в том же универсальном отчете, а сложные группы "И", "ИЛИ", "НЕ". Автору большое спасибо. Как только моя задача станет актуальной, буду за образец брать эту статью.
21. Елена Васильева (VasilevaHelen) 07.10.13 16:33
Спасибо, очень познавательно.
22. alegshzhkka (Odinas) 11.10.13 15:45
изучаю Скд по книге Хрусталевой, такие статьи отличное дополнение, спасибо!
23. Артем Артеменко (dock) 23.12.13 19:49
Требуем продолжение банкета! автору вынести благодарность!
24. Dima Dima (bayce) 03.02.14 21:48
25. Елена Пименова (Bukaska) 04.02.14 10:49
Спсасибо! Очень интересно читать статьи подобного уровня)
26. Саня Гончар (Pervuy) 05.03.14 19:59
Спасибо, очень познавательно)
27. sldz sldz (sldz) 20.03.14 00:33
Сейчас только изучаю СКД довольно интересная статья
28. poyson (poyson) 08.05.14 10:53
29. Игорь Осетров (igo-osetro) 22.05.14 10:08
Спасибо Автору! Интересная, познавательная статья.
30. ффф ыыы (zqzq) 11.06.14 11:57
А теперь очень важно в точной последовательности добавлять колонки ТЗ и с одинаковыми именами, а также с типизацией поля, что указана в схеме СКД в выбранных полях.
Можно результат СКД вывести в новую пустую ТЗ, далее
ЭтаФорма.РезультатПродажи.Загрузить(ТЗ);
если верить справке
Загружает данные коллекции из таблицы значений.
Все элементы коллекции будут удалены.
В коллекцию будут добавлены строки из таблицы значений и заполнены значениями в совпадающих по идентификаторам колонках.
т.е. порядок колонок не важен, также может не совпадать количество колонок.

Кстати, для программного вывода СКД в ТЗ удобно пользоваться процедурой ПолучитьДанныеНаОснованииСКД из http://infostart.ru/public/80164/ т.к. всё равно нереально все эти классы СКД запомнить.
31. Азат Мухаметзянов (MrAzat) 18.06.14 11:07
Спасибо, то, что надо было
32. Денис (konstruktiv) 23.09.14 06:40
"ВАЖНО! Не называйте поля в условие на период документов "ДатаНачала" и "ДатаОкончания" это зарезервированые поля самой системой СКД и она это понимает совершенно по другому, для чистоты эксперимента можете перепроверить." - а про это можно поподробнее??
33. Андрей Еремеев (eaa) 20.03.15 10:26
+ 100 помогло, спасибо. На первый взгляд делал все тоже самое, но таблица значений была пуста... Неужели проблема была в том, что СКД получал через Обработки.Обработка.ПолучитьМакет("Макет") ??
34. Сергей Маслов (LexSeIch) 21.05.15 11:00
Мир этому дому!
Спасибо за интересную статью!
35. Maxim Kolkin (the1) 30.07.15 10:35
(32) konstruktiv, по-моему, это ошибочное мнение. На моей практике СКД использует параметры
Период, НачалоПериода и КонецПериода
, и, кстати, ничего мне не мешает использовать их самому.
36. Михаил Петухов (oldfornit) 08.09.15 09:07
(35) the1, а ДатаНачала и ДатаОкончания - это вроде бы методы интервала
37. Денис (konstruktiv) 08.09.15 10:22
38. Михаил (ZMGMSC) 30.10.15 17:48
Вот пример работы с табличным полем документа
http://infostart.ru/public/293252/
используется СКД также есть примеры программной работы с СКД.
http://infostart.ru/public/288319/
39. Александр Хомяк (logarifm) 14.11.15 00:57
Ребята очень рекомендую обратить время даты статьи и то что вы пользуетесь сейчас новыми возможностями и обновленными версиями не значит, что такое можно было сделать на момент статьи. Спасибо. Ей уже три года, естествено, что определенные ограничения уже давно могут быть исправлены 1С.
40. Михаил (ZMGMSC) 02.06.16 11:40
Вопрос на применение скд:
Есть регистр сведений (сетка расписания) измерения Кабинет, День недели, Час.
надо вывести в отчет так, чтобы заполненные часы во всех колонках (дни недели)
собрались вверху по порядку, т.е. по максимум заполняли пустые места в верхних строчках.
соотв свое место освобождали
полностью пустые строки не выводились.
бьюсь второй день. Говорят такое возможно....
в коде это выгладит так:
Пока ВыборкаДень.Следующий() Цикл
ВыборкаЧас = ВыборкаДень.Выбрать();
Пока ВыборкаЧас.Следующий() Цикл
МассСтрок = ТЗЧас.НайтиСтроки(Новый Структура("кабинет, " + ВыборкаЧас.День, ВыборкаЧас.кабинет, 0); // ЧАС ЧИСЛО ОТ 9 ДО 18
Если МассСтрок.Количество() Тогда
СтрТЧ = МассСтрок[0];
Иначе
СтрТЧ = ТЗЧас.Добавить();
СтрТЧ.кабинет= ВыборкаЧас.кабинет;
КонецЕсли;
СтрТЧ[Строка(ВыборкаЧас.День)] = ВыборкаЧас.Час;
КонецЦикла;

Т.Е. ищем не заполненные значения по колонкам если находим то записываем туда свое значение
иначе добавляем строку.
суть задачи сделать это в скд.
41. Анастасия Сталович (Новичок1с) 24.11.16 14:28
Благодарю за статью, всё хорошо расписано. Хотелось бы видеть сам пример обработки(отчёта), т.к. не совсем получается :(
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа