gifts2017

СКД и внешние источники данных. Набор данных — объект

Опубликовал Мих Кор (qapex) в раздел Программирование - Практика программирования

О том, как можно работать с СКД, используя набор данных "Объект" (аналог временных таблиц, только передаваемых не напрямую в запрос, а в СКД)

Привет!
Сегодня хочу описать тему, с которой без «акваланга» не разберешься :) ;)

Акваланг к тому, что погружение довольно глубокое. В литературе встречается мало ссылок на эту тему и пока не «приспичит» в ней не разберешься. Не возникнет даже посыла к такому действию ;) Кстати, в документации об этом сказано очень плохо и непоследовательно, приходится обращаться к сторонней литературе.

К примеру, очень рекомендую «Разработка сложных отчетов в «1С:Предприятии 8.2″. Система компоновки данных», Автор: Хрусталева Е. Ю. (если конкретнее, то смотрите стр. 224, 267 и 473)

В СКД существует 2 вида источников данных: Запрос, объект и объединение (эта штука не в счет, она не источник данных, а обработчик имеющихся).  См рис 1:


Итак, если с источником (набором) данных типа «Запрос» нам более или менее понятно, как работать, то по поводу набора данных «Объект» есть трудности.

Для начала опишу, что мы хотим получить на выходе:

Отчет, пользователь нажал кнопку «Сформировать» и отобразился список номенклатуры (см. рис. 2):

 Рис.2. Итоговый результат. Рабочий внешний отчет.

Да, я допустил одну неточность, а именно: на снимке нет кнопки «Сформировать«, но есть кнопка «новое действе» (чуть позже объясню, почему так получилось ;)

Да, да! Еще момент: весь этот список выводится из набора данных «Объект»:

 Рис. 3. Использование набора данных объект для вывода списка номенклатуры

Решение:

  1. Создаем внешний отчет;
  2. Добавляем макет СКД, назовем его «ОсновнаяСхемаКомпановкиДанных»;
  3. Добавляем в него набор данных «Объект», назначаем ему имя «СписокНоменклатуры» (должно быть так же, как и в рис. 3);
  4. В настройках отчета особо не экспериментируем, пусть будет все просто (см. рис. 4)
 Рис. 4. Настройки внешнего отчета
 

Ок, половину дела сделали ;)

Теперь сгенерируем основную форму отчета (да, еще момент! Моя конфигурация работает на обычном интерфейсе, но думаю, на управляемых формах вы найдете решение ;) Итак, форма:

 Рис. 5. Основная форма отчета на СКД

 

Здесь и возникает проблема! Если нажать на кнопку «сформировать» (рис. 5.), то мы увидим ошибку!

Рис. 6. Ошибка при формировании внешнего отчета


Решению данной проблемы я и посвятил данную статью!

Перехватить событие кнопки «Сформировать» не получилось, поэтому, решил воспользоваться костылем. Запустил конфигурацию в режиме отладки и постарался найти ту самую кнопку «сформировать».

 Рис. 7. Изучаем интерфейс формы в режиме отладки, ищем действие кнопки «Сформировать»

 

Вставлял в форме процедуру «Сформировать», но в нее нет заходов, пришлось переопределить действие кнопки «сформировать» перед открытием формы:


Рис. 8. Изменение привязки действия к кнопке «Сформировать»


На рис. 8 помимо изменения действия формы приведен пример запроса, его обработки и передачи сгенерированных данных в СКД. Изучим его белее внимательно:

  1. Генерируем входные данные для СКД;
  2. Инициализируем СКД;
  3. Выводим результат НА ФОРМУ (обратите на это так же внимание!).

Вспомним схему взаимодействия объектов системы компоновки данных:

 

 Рис. 9. Схема взаимодействия объектов системы компановки данных.

 

 

Схема компоновки данных во внешнем отчете дотупна как глобальный объект в методе формы СхемаКомпоновкиДанных. К ней так же можно обратиться по имени, передав его в метод ПолучитьМакет (см. Рис. 8)

Далее, самостоятельно изучите используя представленную схему на рис. 9 и справочную систему, как и зачем взаимодействовать с данными объектами ;)

Основной кусок кода приведен ниже:

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

Да! Вот еще приятный момент!!!

В данном примере, как видите (см. рис. 2), вывод осуществляется в форму, а не в табл. документ! И это очень хорошо, ведь мы можем работать с формой (программно перехватывать события элемента формы, делать всякие фишки с drag and drop и прочее ;)

В табличном документе мы можем просто вывести обработанные данные на экран и передать управление документом пользователю и мы не можем никак влиять на дальнейший процесс редактирования данного контента!

См. в справочной системе «Поле табличного документа«, а я всего лишь приведу выдержку из встроенной документации системы 1с Предприятие 8.2:

«Поле табличного документа представляет собой табличный документ, размещенный в форме. Наряду с многообразием оформительских возможностей табличного документа это позволяет организовывать обработку событий, возникающих при выборе ячеек, картинок, а также других элементов управления, размещенных в поле табличного документа.»
 
Ладно, как говорится, успехов в бою ;)
 
* ссылка на мой личный ресурс (статью взял с него): https://eanikiforov.ru/ 

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Пример отчета СКД с использованием набора данных "объект"
.7z 6,25Kb
19.10.15
9
.7z 6,25Kb 9 Скачать

См. также

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

Комментарии

1. Сергей Шевченко (demon_infernal) 19.10.15 06:55
Перехватить событие кнопки "Сформировать" не получилось

Событие "ПриКомпоновкеРезультата" модуля объекта отчета
В остальном ничего нового, всё есть в Хрусталёвой.
Diego_Iv; nixel; 7OH; shalimski; TMV; ojiojiowka; medm; sommid; +8 Ответить
2. Владимир (Tishu) 21.10.15 10:47
Пользуйтесь шаблоном универсального отчета , в нем есть возможность использовать внешние наборы данных в СКД и многое другое. Универсальный шаблон имеет некоторые ограничения, влияющие на представление настроек пользователя (простая или расширенная). Поэтому можно создать сложный запрос, а результат передать в объект СКД. Универсальный шаблон преступно мало используется, а пользователи к нему привыкают быстро.
3. Никита Грызлов (nixel) 21.10.15 12:32
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа