Наборы данных. Связи наборов данных в скд и принципы их использования 1с скд наборы данных

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

Чтобы объединить два или более набора данных в СКД, необходимо на закладке Наборы данных предварительно создать специальный набор данных — объединение


Получаем вот такую картину


И уже в этот созданный объект добавляем наборы, которые будут непосредственно объединяться. Давайте добавим два набора данных. Один из которых будет запрос, а второй для разнообразия — объект (внешний источник данных). Вот так:


В качестве примера рассмотрим объединение наборов данных с остатками товаров.

В том наборе, где будем использовать , вручную добавляем поля Товар, Количество и прописываем имя объекта, содержащего данные


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


Делаем простейший запрос

ВЫБРАТЬ ОстаткиТоваров.Товар.Представление КАК Товар, ОстаткиТоваров.КоличествоОстаток КАК Остатки {ВЫБРАТЬ Товар, Остатки} ИЗ РегистрНакопления.ТоварыОстатки.Остатки КАК ОстаткиТоваров

Чтобы избавиться от складов, пришлось задействовать в запросе компоновку данных (все, что в фигурных скобках) и отключить внизу флаг автозаполнения. Также в качестве товара был взят не элемент справочника, а его представление, чтобы тип был такой же как и в наборе с внешним источником данных. Чтобы данные из разных наборов попали в одно поле у них должно быть одинаковое наименование в поле Путь . Поэтому для поля Остатки путь был вручную исправлен на Количество , чтобы синхронизировать его со вторым набором данных. На самом деле лучше конечно же использовать нужный псевдоним сразу в запросе. В данном случае умышленно не стал это делать, чтобы заострить внимание на такой особенности.

Теперь обратимся непосредственно к данным
В регистре накопления у меня хранятся следующие остатки товаров

а во внешнем источнике данных вот такая картина

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


В результате выполнения отчета с такими настройками СКД получаем вот такую таблицу

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


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

На данной вкладке можно создать неограниченное количество наборов данных. Набор данных – это источник получения данных.

Различают несколько видов наборов данных:

  • Запрос;
  • Объект;
  • Объединение .

Запрос – это обычный 1с-запрос только язык запросов немного расширен. Для удобства можно использовать конструктор запроса.

Объект – внешний набор данных, например таблица значений.

Объединение – объединение нескольких наборов данных типов запрос и объект.

В данной статье мы кратко пробежимся по всем вкладкам конструктора схемы компоновки данных. Наборы данных На данной вкладке можно создать неограниченное количество наборов данных. Набор данных – это источник получения данных. Различают несколько видов наборов данных: Запрос; Объект; Объединение. Запрос – это обычный 1с-запрос только язык запросов немного расширен. Для удобства можно использовать конструктор запроса. Объект – внешний набор данных, например таблица значений. Объединение – объединение нескольких наборов данных типов запрос и объект. Связи наборов данных На данной вкладке описываются связи наборов данных. Тут можно указать какие наборы данных связывать и по каким полям и с какими параметрами. Самое главное, что нужно запомнить: в схеме компоновки данных, при связывании наборов всегда используется Левое соединение! Вычисляемые поля На данной вкладке можно создавать дополнительные поля, не описанные на вкладке Наборы данных. В качестве выражений для расчета можно использовать язык выражений компоновки данных, поля из основных наборов данных, а также функции не глобальных общих модулей. Ресурсы Ресурсы – это итоговые данные по группировкам. На вкладке можно назначить ресурсом поля из наборов данных, а также из вычисляемых полей. Также для ресурсов указывается выражение, по которому они рассчитываются, и возможно указание группировки по которой будет рассчитываться выражение для ресурсов. На основании значений ресурсов также рассчитываются общие итоги отчета. Параметры Параметры данных, как правило, используются в наборе данных запрос. Все параметры, описанные в запросе, появляются на вкладке Параметры. На данной вкладке можно указать заголовок, доступные типы, доступные значение и некоторые другие вещи. Подробнее о параметрах чуть позже. Макеты По умолчанию макет сформированного отчета генерируется автоматически системой компоновки данных. Но в системе также имеется возможность разработчику самому оформлять отдельные области отчета(полей, группировок, ресурсов…). Все макеты отдельных областей, созданные на данной вкладке, привязаны только к текущему отчету. Вложенные схемы Вложенные схемы используются в случаях когда данные одного отчета необходимо использовать в другом. Другими словами мы “встраиваем” одну схему компоновки данных в другую, указывая связь по общему полю. Пример использования вложенных схем можно посмотреть в этой статье. Настройки На данной вкладке разработчик создает стандартные настройки формирования отчета. В верхней части окна задается иерархическая структура. Структура формирования отчета может состоять из следующих элементов: Группировка; Таблица; Диаграмма; Вложенная схема В нижнем части окна задаются настройки для всего отчета и для каждого элемента структуры отчета. Кратко в вкладках настроек: Выбранные поля – список полей выводимых в отчет; Отбор – всевозможные отборы записей отчета; Порядок – сортировка записей в отчете; Параметры данных – значение параметров отчета; Пользовательские поля – дополнительные поля отчета, создаваемые пользователем; Условное оформление – задается условное оформление записей отчета; Другие настройки – всевозможные дополнительные настройки такие как: заголовок отчета, макет оформления, расположение полей и тд....

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

Схема компоновки данных, реализованная в 1С, поддерживает три типа источника данных (Рис.1)

Источники данных

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

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

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

Третий источник данных «Объединение». Фактически, этот источник можно рассматривать как один из видов связи. Он объединяет (сводит в одну несколько таблиц), не сопоставляя, однако совпадение тех или иных полей. То есть, если в двух объединяемых таблицах 3 и 4 строки соответственно, то в результирующем источнике данных, будет 7 строк.

Постановка задачи

В качестве полигона для испытаний мы выберем базу УПП, версии 1.3.92.3, работающую в режиме обычного приложения.

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

Таким образом, мы должны:

  1. Взять табличную часть документа поступления;
  2. Загрузить файл в источник данных «Объект»;
  3. Связать эти два источника по определенному параметру (в нашем случае это будет код);
  4. Вывести результирующую таблицу.

Процесс выполнения

Пройдем все перечисленные шаги:

  • Создаем запрос к табличной части документа поступления (Рис.2)

Рис.2

  • Создаем набор данных объект (Рис.3);

Рис.3

Здесь важно обратить внимание на «Имя объекта, содержащего данные», именно это имя нам придется указать в коде модуля отчета.

  • Переходим в модуль отчета и создаем там процедуру «ПриКомпоновкеРезультата» (Рис.4);


Рис.4

Саму процедуру получения данных из внешнего файла мы описывать не будем, обратим внимание на ту часть кода, которая обязательно должна присутствовать в компоновке для того, чтобы мы могли получить данные для «Набора данных 2» (Рис.5).

Рис.5

Важно! При создании «Объекта» в коде процедуры при компоновке, значение параметра СтандартнаяОбработка должно быть Ложь.

Переходим на закладку «Связи наборов данных».

Связываем наборы

Заходим на соответствующую закладку схемы (Рис.6).

Мы видим табличную часть, которая очень похожа на табличную часть, которая есть в конструкторе запросов, за некоторым исключением. Для набора источника и набора приемника связи нельзя установить галочку «Все», зато добавлены несколько дополнительных колонок.

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

Прежде, чем создать связь, давайте определимся с назначением колонок:

  1. Источник связи – первый набор данных, из которого возьмутся все имеющиеся значения;
  2. Приемник связи – набор данных, из которого выберутся значения, соответствующие нашему условию;
  3. Выражение источник – поле или выражение первого набора данных, по которому будет происходить сопоставление;
  4. Выражение приемник – поле или выражение зависимого набора;
  5. Параметр – если в этом поле указать имя параметра, то связь с набором – приемником будет осуществляться только по указанному в параметре значению;
  6. Список параметров – определяет возможность использования списка значений в качестве параметра;
  7. Условие связи – указав здесь выражение с использованием полей источника, можно создать условие, выполнение которого будет служить сигналом к установлению связи;
  8. Начальное значение – показывает начальное значение связи;
  9. Обязательная связь – определяет, задействованы ли поля, используемые в источнике (установлено ЛОЖЬ) или в приемнике (установлено ИСТИНА) и на основании этого добавляет связь в макет.

Таким образом:

  • В качестве источника связи будет выступать результат нашего запроса;
  • В качестве приемника будет выступать объект;
  • Выражение источник будет «НоменклатураКод»;
  • Выражение приемник «Номенклатура»;
  • Связь будет обязательной (Рис.7).

Если бы мы в качестве условия связи указали наименование какой-либо номенклатуры, или её вид воспроизводства или еще что-то, мы могли бы получить более точную выборку для нашей задачи. Результат наших действий можно увидеть на рис.8

Рис.8

Для двух нижних строк отчета в файле с ценами не нашлось соответствия.

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

Динамику нужно показать за выбранный пользователем период. В качестве отображаемых данных будет количество действий на данными пользователями в разрезе часов. Информация для подобного отчета может быть получена из журнала регистрации.

Рассмотрим поэтапное создание подобного отчета и с помощью внешнего набора данных построим его на системе компоновки данных.

Читаем журнал регистрации

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

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

Для получения информации из журнала регистрации будем использовать метод глобального контекста "ВыгрузитьЖурналРегистрации()". В событии "ПриКомпоновкеРезультата" созданного отчета добавим следующий программный код:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) СтандартнаяОбработка = Ложь ; // отключаем стандартный вывод отчета - будем выводить программно // Получаем настрокий отчета, в т.ч. период Настройки = КомпоновщикНастроек. ПолучитьНастройки() ; // Получаем настройки отчета ПараметрПериод = КомпоновщикНастроек. ПолучитьНастройки() . ПараметрыДанных. Элементы. Найти(" Период " ) . Значение; ЖурТаб = Новый ТаблицаЗначений; ОтборЖурнала = Новый Структура; // Создадим структуру отбора журнала регистрации // Заполним отбор по периоду ОтборЖурнала. Вставить(" ДатаНачала " , ПараметрПериод. ДатаНачала) ; ОтборЖурнала. Вставить(" ДатаОкончания " , ПараметрПериод. ДатаОкончания) ; // Установим отбор на события МассивСобытий = Новый Массив; МассивСобытий. Добавить(" _$Data$_. Delete . New " ) ; МассивСобытий. Добавить(" _$Data$_. Post " ) ; МассивСобытий. Добавить(" _$Data$_. TotalsPeriodUpdate " ) ; МассивСобытий. Добавить(" _$Data$_. Unpost " ) ; МассивСобытий. Добавить(" _$Data$_. Update " ) ; ОтборЖурнала. Вставить(" Событие " , МассивСобытий) ; // Выгружаем журнал регистрации ВыгрузитьЖурналРегистрации(ЖурТаб, МассивСобытий) ; // Создаем и заполняем данные для вывода в отчет ЖурТаб. Колонки. Добавить(" Время " ) ; ЖурТаб. Колонки. Добавить(" КоличествоСобытий " ) ; Для Каждого Стр Из ЖурТаб Цикл Стр. Время = Час(Стр. Дата) ; Стр. КоличествоСобытий = 1 ; КонецЦикла ; // Группируем результат ЖурТаб. Свернуть(" ИмяПользователя, Время " , " КоличествоСобытий " ) ; // ..............

Первый параметр метода "ВыгрузитьЖурналРегистрации" устанавливает таблицу значений, в которую будет выгружен результат выборки из журнала регистрации. Второй параметр устанавливаем фильтр на выбираемые записи. Филтр представляет собой структуру, ключи в котором - это поля, по которым устанавливается отбор. Мы используем поля "ДатаНачала" и "ДатаОкончания" для установки периода анализа журнала регистрации, а также поле "Событие", в который передаем массив строк (наименований событий). Добавленные в массив события соответствуют действиям на данными в базе.

Подробнее о использовании метода "ВыгрузитьЖурналРегистрации" Вы можете прочитать в синтаксис-помощнике.

Передаем таблицу значений в СКД

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

1) Создать набор данных в схеме компоновки и задать его поля.
2) В программный код модуля "ПриКомпоновкеРезультата" прописать передачу таблицы значений в СКД.

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

3) Настраиваем ресурсы и структуру отчета (подробнее смотри в файле отчета, ссылка на который дана в конце статьи).

На этом настройки отчета завершены и мы можем запустить его в режиме предприятия.

Итог

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

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

Скачать отчет из примера Вы можете по следующей ссылке .

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

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

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

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


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

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

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

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

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

Решение:

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

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

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

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


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

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

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


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

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

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

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

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

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

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

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

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

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

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

Ладно, как говорится, успехов в бою;)





Copyright © 2023 Базовые компьютерные навыки.