gifts2017

Описание обработки "Консоль отчетов" с СКД и не только...

Опубликовал Алексей Коробов (WiseSnake) в раздел Программирование - Работа с интерфейсом

Данный блог является прямым продолжением и развитием проекта http://infostart.ru/profile/15778/projects/2795/ и попыткой создания руководства по консоли отчетов с применением системы компоновки данных
ВСТУПЛЕНИЕ:

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

НАЧНЕМ С КОНЦА:
Для того чтобы понять где применить обработку из проекта необходимо знать что умеет СКД и как это реализовать, но так как мне длизко по духу решение практических задач и если я сейчас начну рассказывать теорию то половина останется непонятым или забытым, поэтому хочу разобрать несколько практических примеров, а потом расскажу о прелестях СКД.

ПРИМЕР 1:

Наверно все знают универсальные типовые обработки такие как "Групповая обработка справочников и документов" (входящая в состав конфигураций) и "Универсальный подбор и обработка объектов" которая есть на диске ИТС. Часто я мечтал их объеденить, так как последняя имеет большой функционал по обработке объектов но умеет выбирать только по одному виду объектов. Остальные обработки не будем рассмаривать, скажу только одно, ни одна не подошла мне полностью каято чегото не умеет.
Условие задания:
Мы заметили ошибку в проведении документа(ов) из за которой неверно делались движения регистра например в ЗУП "ВзаиморасчетыСРаботникамиОРганизаций"
***
!!! Замечание: Несложно взять любой другой регистр влюбой конфигурации, это замечание будет относится и для всех примеров, примеры прозрачные и могут относится к любой конфигурации.
***
и исправили ее. Отлично, но теперь нам надо перепровести все документы (или за период) связанные с этим регистром. В этом и будет заключаться наша простая задача.

Вариантов несколько:
1. Использовать универсальные обработки.
Но в первой обработе придется руками отмечать самим все документы у которых есть движения по этому регистру что не совсем удобно потому что по нашему регистру их 24 и все на память не упомнишь. Во второй вообще заколебешься перебирать по одному документы. Вот и получается, что универсальные обработки не совсем уж и универсальные и это еще самый простой пример из практики.
2. Написать обработку самому. На самом деле написать такую обработку не сложно, но связано с ошибками (результат выборки мы можем посмотреть только в отладчике и не в очень уобной форме). Ко всему прочему обычно я такие обработки относил в папку Temp и удалял. Как иногда обидно что помнишь что когда то писал обработку, но написать заново легче чем найти.
3. Попробуем использовать обработку из проекта. В ней требуется написать запрос который делается в конструкторе за 3 секунды если не писать условий если писать чуть больше:
ВЫБРАТЬ
ВзаиморасчетыСРаботникамиОрганизаций.Регистратор
ИЗ
РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций КАК ВзаиморасчетыСРаботникамиОрганизаций
ГДЕ
ВзаиморасчетыСРаботникамиОрганизаций.Период МЕЖДУ НАЧАЛОПЕРИОДА(&Период, МЕСЯЦ) И КОНЕЦПЕРИОДА(&Период, МЕСЯЦ)

И написать код по перепроведению объектов, но над этим придется потрудится ))))):
Для каждого СтрокаДерева Из ДеревоОбъектов Цикл
СтрокаДерева.Регистратор.ПолучитьОбъект().Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;

где: ДеревоОбъектов - итог работы СКД (обрабатываемое нами дерево), Регистратор - наименование поля полученного нами дерева в данном случае документа регистратора. Далее получаем объект и записываем его с проведением.

Надоела уже эта практика отвлечемся на теорию ))))
Некоторые скажут насчет примера выше: "В каком конструкторе, да там в ентих конструкторАх черт ногу сломит". И будут несовсем правы все там сделано для нас программистов, потому что иногда так приходится изёживаться чтобы собрать необходимый набор данных что и этого функционала может не хватить.

ОПИСАНИЕ: Закладка "Наборы данных"

На закладке присутствует окошко с деревом наших наборов данных и две кнопочки над ним: 1) "Добавить набор данных" - добавляет один из наборов данных
-"Запрос" - уже знакомый многим запрос с конструктором и всеми сопутствующими делами. Конструктор запроса можно вызвать кнопкой "Конструктор запроса..." находящейся справа над полем "Запрос", которое заполняется текстом запроса если выделенный в левом окошечке набор даннх является запросом (!!! Замечание: Если при нажати на кнопку "Конструктор запроса..." в окошке "Запрос" выделена определенная область, то конструктор пытается отрыть именно эту область, применяется если необходимо открыть и отредактировать например только вложенный запрос).
-"Объект" - при использовании данного набора данных нам придется написать имя внешнего набора данных переданных например через ПроцессорКомпоновкиДанных.Инициализировать(, , , ) придется описать и все реквизиты передаваемые во внешних данных и используемые в СКД.
-"Объединение" - название говорит само за себя: данный вид позволяет объединять несколько наборов данных "запрос" и/или несколько надоров данных "объект" в один набор данных.
2) "Удалить текущий" - удаляет текущий набор данных

НЮАНСЫ И ТОНКОСТИ при работе с Консолью отчетов, СКД, запросами

- Если Вы рассчитываете выражение и при каких либо условиях одно из составляющих окажется NULL (Реквизит1 - Реквизит2, например если Реквизит2 = NULL) то в результате расчета Вы получите так же NULL. Необходимо учитывать такие ситуации и например применять конструкцию ЕСТЬNULL(Реквизит2, 0). ПРОДОЛЖЕНИЕ СЛЕДУЕТ...

P.S. Времени не фонтан так что извините что не все сразу...

См. также

Подписаться Добавить вознаграждение
Комментарии
1. rasswet (rasswet) 24.11.08 12:57
2. Андрей Скляров (coder1cv8) 24.11.08 13:40
3. Алексей Коробов (WiseSnake) 24.11.08 13:53
(1)(2) Извините что задерживаю продолжение, тут проект доделываю... времени очень мало. Продолжение будет скоро. Может на следующей неделе.
4. AntiDot (kurator1C) 24.02.09 09:57
Желающим изучить СКД рекомендую книжку:
http://v8.1c.ru/metod/books/book.jsp?id=132
любители холявы могут найти её здесь
http://forum.ru-board.com/topic.cgi?forum=93&topic=0259&start=0&limit=1&m=1#1

называется "Разработка сложных отчетов в 1С-Предприятии 8 (система компоновки данных) (Хрусталева, 2008)".
Кижка хорошая, за два вечера СКД становится ясной и понятной.
Однако...

В данной книге мало уделенно внимание работе с СКД средствами встроенного языка, хотя для толчка примеры есть.
5. AntiDot (kurator1C) 24.02.09 11:29
Ошибки при открытии:

1. {Форма.Форма(1309)}: Поле объекта не обнаружено (ЕстьОповещение)
КнопкаЗамер.Картинка = БиблиотекаКартинок.ЕстьОповещение;
2.{Форма.Форма(1314)}: Поле объекта не обнаружено (Настройка)
КнопкаНастроек.Картинка = БиблиотекаКартинок.Настройка;

Закоментировал эти строки (позже разберусь) - обработка открылась, сформировал отчет... Не понял как написать обработку выведенных данных :)

Полез изучать код, мож тада пойму...
6. Алексей Коробов (WiseSnake) 25.02.09 11:44
(4) Изучил эту книжку. Книжка хорошая но не вряд ли стоит выкладывать прямые ссылки. В СКД еще много мелочей которые надо знать.
(5) Это не в этой ветке. У Вас нет библиотеки картинок. Я устанавливаю картинки на кнопки. Спасибо! Учту этот момент.