Привет!
Сегодня хочу описать тему, с которой без «акваланга» не разберешься :) ;)
Акваланг к тому, что погружение довольно глубокое. В литературе встречается мало ссылок на эту тему и пока не «приспичит» в ней не разберешься. Не возникнет даже посыла к такому действию ;) Кстати, в документации об этом сказано очень плохо и непоследовательно, приходится обращаться к сторонней литературе.
К примеру, очень рекомендую «Разработка сложных отчетов в «1С:Предприятии 8.2″. Система компоновки данных», Автор: Хрусталева Е. Ю. (если конкретнее, то смотрите стр. 224, 267 и 473)
В СКД существует 2 вида источников данных: Запрос, объект и объединение (эта штука не в счет, она не источник данных, а обработчик имеющихся). См рис 1:
Итак, если с источником (набором) данных типа «Запрос» нам более или менее понятно, как работать, то по поводу набора данных «Объект» есть трудности.
Для начала опишу, что мы хотим получить на выходе:
Отчет, пользователь нажал кнопку «Сформировать» и отобразился список номенклатуры (см. рис. 2):
Да, я допустил одну неточность, а именно: на снимке нет кнопки «Сформировать«, но есть кнопка «новое действе» (чуть позже объясню, почему так получилось ;)
Да, да! Еще момент: весь этот список выводится из набора данных «Объект»:
Решение:
- Создаем внешний отчет;
- Добавляем макет СКД, назовем его «ОсновнаяСхемаКомпановкиДанных»;
- Добавляем в него набор данных «Объект», назначаем ему имя «СписокНоменклатуры» (должно быть так же, как и в рис. 3);
- В настройках отчета особо не экспериментируем, пусть будет все просто (см. рис. 4)
Ок, половину дела сделали ;)
Теперь сгенерируем основную форму отчета (да, еще момент! Моя конфигурация работает на обычном интерфейсе, но думаю, на управляемых формах вы найдете решение ;) Итак, форма:
Здесь и возникает проблема! Если нажать на кнопку «сформировать» (рис. 5.), то мы увидим ошибку!
Решению данной проблемы я и посвятил данную статью!
Перехватить событие кнопки «Сформировать» не получилось, поэтому, решил воспользоваться костылем. Запустил конфигурацию в режиме отладки и постарался найти ту самую кнопку «сформировать».
Вставлял в форме процедуру «Сформировать», но в нее нет заходов, пришлось переопределить действие кнопки «сформировать» перед открытием формы:
На рис. 8 помимо изменения действия формы приведен пример запроса, его обработки и передачи сгенерированных данных в СКД. Изучим его белее внимательно:
- Генерируем входные данные для СКД;
- Инициализируем СКД;
- Выводим результат НА ФОРМУ (обратите на это так же внимание!).
Вспомним схему взаимодействия объектов системы компоновки данных:
Схема компоновки данных во внешнем отчете дотупна как глобальный объект в методе формы СхемаКомпоновкиДанных. К ней так же можно обратиться по имени, передав его в метод ПолучитьМакет (см. Рис. 8)
Далее, самостоятельно изучите используя представленную схему на рис. 9 и справочную систему, как и зачем взаимодействовать с данными объектами ;)
Основной кусок кода приведен ниже:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Наименование как Номенклатура
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
НоменклатураСписок = Запрос.Выполнить().Выгрузить();
НаборыДанных = Новый Структура("СписокНоменклатуры", НоменклатураСписок);
//СКД = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
СКД = СхемаКомпоновкиДанных;
КомпМакета = новый КомпоновщикМакетаКомпоновкиДанных;
макетКомп = КомпМакета.Выполнить(СКД, СКД.НастройкиПоУмолчанию);
ПроцессорКомпДанных = новый ПроцессорКомпоновкиДанных;
ПроцессорКомпДанных.Инициализировать(макетКомп, НаборыДанных);
вывод = новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
вывод.УстановитьДокумент(ЭлементыФормы.Результат);
вывод.Вывести(ПроцессорКомпДанных, истина);
Да! Вот еще приятный момент!!!
В данном примере, как видите (см. рис. 2), вывод осуществляется в форму, а не в табл. документ! И это очень хорошо, ведь мы можем работать с формой (программно перехватывать события элемента формы, делать всякие фишки с drag and drop и прочее ;)
В табличном документе мы можем просто вывести обработанные данные на экран и передать управление документом пользователю и мы не можем никак влиять на дальнейший процесс редактирования данного контента!
См. в справочной системе «Поле табличного документа«, а я всего лишь приведу выдержку из встроенной документации системы 1с Предприятие 8.2: