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






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

 

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

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

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

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

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

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

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

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

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

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

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

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


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


 

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

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

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

 

МОДУЛЬ ФОРМЫ

&НаСервере

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

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

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



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

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

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

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

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

 

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

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

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

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


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


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

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

МОДУЛЬ ФОРМЫ

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

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

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



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

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

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


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

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

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

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

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

 

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

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

41 Comments

  1. SergDi

    Огромное спасибо, сэкономил время, как раз думал над подобным вопросом

    Reply ↓
  2. AltF1

    Отличная статья.

    Reply ↓
  3. vlengin

    Отлично. Большое спасибо за

    • Тип(«ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений»))
    • АдресСхемыПродаж = ПоместитьВоВременноеХранилище(СхемаКомпоновкиПродажи, УникальныйИдентификатор);

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

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

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

    Показать

    2. И не понял трудности с результирующей таблицей значений: у меня колонки идут в произовольном порядке, вывод результата в одной строке (ТЗФорма.Загрузить(ТЗ)).

    Reply ↓
  4. vlengin

    ТабДок=Новый ТабличныйДокумент; — у меня лишняя строка, нужно удалить.

    Reply ↓
  5. logarifm

    Отчетом нет. сущность в том, что пользователь должен иметь возможность еще интерактивно на форме указывать флагами, что он хочет выгружать, а что нет. В этом весь смысл, что выгрузка в ТабличныйДокумент намного проще, а вот выгрзузка в ТаблицуЗначений есть сложность.

    Reply ↓
  6. vlengin

    (5)

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

    В моем коде (см. выше) как раз и идет выгрузка в таблицу значений в форме отчета .

    Reply ↓
  7. logarifm

    Здесь не одна схема компоновки, а в моем случае 5.

    Reply ↓
  8. karakozov

    Отличная статья, тема СКД всегда актуально, сколько материалов бы не попадало на глазу, все время подчеркнешь для себя что нибудь новое.

    Reply ↓
  9. USER--1C

    Спасибо. Все больше конфигураций на УФ. Универсальный отчет не спасает. СКД — удобно.

    Reply ↓
  10. xzorkiix

    Есть вопрос про Управляемые Формы и СКД. Не удаётся корректно установить программно отчёту произвольную СКД (проблему описал здесь http://forum.infostart.ru/forum26/topic58720/ ) после программной установке, как я понимаю проблему, отчет на стороне клиента не видит новые наборы данных, следовательно нет доступных реквизитов (полей для выбора).

    Reply ↓
  11. ms200999

    Спасибо, очень интересная статья.

    Reply ↓
  12. H0SE

    Спасибо большое за такие стати по СКД

    Reply ↓
  13. electronik

    Статья просто супер. Сколько не читай все одно есть что почерпнуть. Таких статей бы побольше. Автору заслуженое 5+++ Респект Так Держать

    Reply ↓
  14. EarlyBird

    Полезная статья.

    Почерпнул!

    Reply ↓
  15. Gandalf Белый

    Большое спасибо! Очень позновательно написано! Взял себе на заметку! ))

    Reply ↓
  16. Den_D

    И новичку и опытному грузовичку)))

    Reply ↓
  17. Sairys

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

    И ещё есть вопрос «Мягкое задание параметров» таких как в данной статье по периоду, работает только в СКД или его можно использовать и в обычных запросах ?

    Reply ↓
  18. Den_D

    Спасибо большое за науку. Вообще очень удобно все отчеты делать с полем «Период». Не зря 1С делают ставку на СКД инструмент мощный и очень полезный, хотя и не всегда логично-понятный.

    Reply ↓
  19. Поручик

    Один из примеров программной генерации и использования СКД http://infostart.ru/public/122215/

    Reply ↓
  20. Yimaida

    Была одна задача, которая была отодвинута в долгий ящик. Там нужно было по сложным отборам (динамическим) заполнять табличную часть документа. Я тоже думал использовать СКД из-за одной очень важной функции, которую я видел только в СКД. Это возможность объединять условия в группы. Т.е. не простое «И», как в том же универсальном отчете, а сложные группы «И», «ИЛИ», «НЕ». Автору большое спасибо. Как только моя задача станет актуальной, буду за образец брать эту статью.

    Reply ↓
  21. VasilevaHelen

    Спасибо, очень познавательно.

    Reply ↓
  22. Odinas

    изучаю Скд по книге Хрусталевой, такие статьи отличное дополнение, спасибо!

    Reply ↓
  23. dock

    Требуем продолжение банкета! автору вынести благодарность!

    Reply ↓
  24. bayce

    интересная статья

    Reply ↓
  25. Bukaska

    Спсасибо! Очень интересно читать статьи подобного уровня)

    Reply ↓
  26. Pervuy

    Спасибо, очень познавательно)

    Reply ↓
  27. sldz

    Сейчас только изучаю СКД довольно интересная статья

    Reply ↓
  28. poyson

    спасибо, помогли….

    Reply ↓
  29. igo-osetro

    Спасибо Автору! Интересная, познавательная статья.

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

    Можно результат СКД вывести в новую пустую ТЗ, далее

    ЭтаФорма.РезультатПродажи.Загрузить(ТЗ);

    если верить справке

    Загружает данные коллекции из таблицы значений.

    Все элементы коллекции будут удалены.

    В коллекцию будут добавлены строки из таблицы значений и заполнены значениями в совпадающих по идентификаторам колонках.

    т.е. порядок колонок не важен, также может не совпадать количество колонок.

    Кстати, для программного вывода СКД в ТЗ удобно пользоваться процедурой ПолучитьДанныеНаОснованииСКД из http://infostart.ru/public/80164/ т.к. всё равно нереально все эти классы СКД запомнить.

    Reply ↓
  31. MrAzat

    Спасибо, то, что надо было

    Reply ↓
  32. konstruktiv

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

    Reply ↓
  33. eaa

    + 100 помогло, спасибо. На первый взгляд делал все тоже самое, но таблица значений была пуста… Неужели проблема была в том, что СКД получал через Обработки.Обработка.ПолучитьМакет(«Макет») ??

    Reply ↓
  34. LexSeIch

    Мир этому дому!

    Спасибо за интересную статью!

    Reply ↓
  35. the1

    (32) konstruktiv, по-моему, это ошибочное мнение. На моей практике СКД использует параметры

    Период, НачалоПериода и КонецПериода

    , и, кстати, ничего мне не мешает использовать их самому.

    Reply ↓
  36. oldfornit

    (35) the1, а ДатаНачала и ДатаОкончания — это вроде бы методы интервала

    Reply ↓
  37. konstruktiv

    Вот и я об этом

    Reply ↓
  38. ZMGMSC

    Вот пример работы с табличным полем документа

    http://infostart.ru/public/293252/

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

    http://infostart.ru/public/288319/

    Reply ↓
  39. logarifm

    Ребята очень рекомендую обратить время даты статьи и то что вы пользуетесь сейчас новыми возможностями и обновленными версиями не значит, что такое можно было сделать на момент статьи. Спасибо. Ей уже три года, естествено, что определенные ограничения уже давно могут быть исправлены 1С.

    Reply ↓
  40. ZMGMSC

    Вопрос на применение скд:

    Есть регистр сведений (сетка расписания) измерения Кабинет, День недели, Час.

    надо вывести в отчет так, чтобы заполненные часы во всех колонках (дни недели)

    собрались вверху по порядку, т.е. по максимум заполняли пустые места в верхних строчках.

    соотв свое место освобождали

    полностью пустые строки не выводились.

    бьюсь второй день. Говорят такое возможно….

    в коде это выгладит так:

    Пока ВыборкаДень.Следующий() Цикл

    ВыборкаЧас = ВыборкаДень.Выбрать();

    Пока ВыборкаЧас.Следующий() Цикл

    МассСтрок = ТЗЧас.НайтиСтроки(Новый Структура(«кабинет, » + ВыборкаЧас.День, ВыборкаЧас.кабинет, 0); // ЧАС ЧИСЛО ОТ 9 ДО 18

    Если МассСтрок.Количество() Тогда

    СтрТЧ = МассСтрок[0];

    Иначе

    СтрТЧ = ТЗЧас.Добавить();

    СтрТЧ.кабинет= ВыборкаЧас.кабинет;

    КонецЕсли;

    СтрТЧ[Строка(ВыборкаЧас.День)] = ВыборкаЧас.Час;

    КонецЦикла;

    Т.Е. ищем не заполненные значения по колонкам если находим то записываем туда свое значение

    иначе добавляем строку.

    суть задачи сделать это в скд.

    Reply ↓
  41. Новичок1с

    Благодарю за статью, всё хорошо расписано. Хотелось бы видеть сам пример обработки(отчёта), т.к. не совсем получается 🙁

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *