Конструктор схемы компоновки данных - закладка связи наборов данных. Связи наборов данных в скд и принципы их использования Скд связи наборов данных параметр
Порой для получения определенного результата компоновки необходимо создать в СКД связи наборов данных. О том, когда это нужно и как это сделать мы и постараемся рассказать в нашей статье.
Схема компоновки данных, реализованная в 1С, поддерживает три типа источника данных (Рис.1)
Источники данных
Наиболее очевидным и часто используемым разработчиками источником данных является «Запрос».
Конструктор запросов, реализованный в 8 версии 1С очень удобен, и, в большинстве случаев, связать между собой несколько таблиц, сделать необходимые группировки и отборы можно прямо в нем.
В сложных случаях, когда требуется или целесообразней использовать выполнение некоторого кода (допустим, загрузка данных из стороннего файла) или когда нет возможности использовать запрос, на помощь приходит источник данных «Объект». Произвольный код, выполняемый в модуле, на выходе должен иметь некоторую структуру, к которой СКД сможет обратиться.
Третий источник данных «Объединение». Фактически, этот источник можно рассматривать как один из видов связи. Он объединяет (сводит в одну несколько таблиц), не сопоставляя, однако совпадение тех или иных полей. То есть, если в двух объединяемых таблицах 3 и 4 строки соответственно, то в результирующем источнике данных, будет 7 строк.
Постановка задачи
В качестве полигона для испытаний мы выберем базу УПП, версии 1.3.92.3, работающую в режиме обычного приложения.
Перед нами поставлена следующая задача: используя только СКД создать отчет, который бы выводил таблицу закупаемой номенклатуры из документа, с ценами, взятыми из файла, присланного контрагентом.
Таким образом, мы должны:
- Взять табличную часть документа поступления;
- Загрузить файл в источник данных «Объект»;
- Связать эти два источника по определенному параметру (в нашем случае это будет код);
- Вывести результирующую таблицу.
Процесс выполнения
Пройдем все перечисленные шаги:
- Создаем запрос к табличной части документа поступления (Рис.2)
Рис.2
- Создаем набор данных объект (Рис.3);
Рис.3
Здесь важно обратить внимание на «Имя объекта, содержащего данные», именно это имя нам придется указать в коде модуля отчета.
- Переходим в модуль отчета и создаем там процедуру «ПриКомпоновкеРезультата» (Рис.4);
Рис.4
Саму процедуру получения данных из внешнего файла мы описывать не будем, обратим внимание на ту часть кода, которая обязательно должна присутствовать в компоновке для того, чтобы мы могли получить данные для «Набора данных 2» (Рис.5).
Рис.5
Важно! При создании «Объекта» в коде процедуры при компоновке, значение параметра СтандартнаяОбработка должно быть Ложь.
Переходим на закладку «Связи наборов данных».
Связываем наборы
Заходим на соответствующую закладку схемы (Рис.6).
Мы видим табличную часть, которая очень похожа на табличную часть, которая есть в конструкторе запросов, за некоторым исключением. Для набора источника и набора приемника связи нельзя установить галочку «Все», зато добавлены несколько дополнительных колонок.
В связях наборов данных можно установить только связь, подобную внешнему левому соединению конструктора запроса.
Прежде, чем создать связь, давайте определимся с назначением колонок:
- Источник связи – первый набор данных, из которого возьмутся все имеющиеся значения;
- Приемник связи – набор данных, из которого выберутся значения, соответствующие нашему условию;
- Выражение источник – поле или выражение первого набора данных, по которому будет происходить сопоставление;
- Выражение приемник – поле или выражение зависимого набора;
- Параметр – если в этом поле указать имя параметра, то связь с набором – приемником будет осуществляться только по указанному в параметре значению;
- Список параметров – определяет возможность использования списка значений в качестве параметра;
- Условие связи – указав здесь выражение с использованием полей источника, можно создать условие, выполнение которого будет служить сигналом к установлению связи;
- Начальное значение – показывает начальное значение связи;
- Обязательная связь – определяет, задействованы ли поля, используемые в источнике (установлено ЛОЖЬ) или в приемнике (установлено ИСТИНА) и на основании этого добавляет связь в макет.
Таким образом:
- В качестве источника связи будет выступать результат нашего запроса;
- В качестве приемника будет выступать объект;
- Выражение источник будет «НоменклатураКод»;
- Выражение приемник «Номенклатура»;
- Связь будет обязательной (Рис.7).
Если бы мы в качестве условия связи указали наименование какой-либо номенклатуры, или её вид воспроизводства или еще что-то, мы могли бы получить более точную выборку для нашей задачи. Результат наших действий можно увидеть на рис.8
Рис.8
Для двух нижних строк отчета в файле с ценами не нашлось соответствия.
41
Делал недавно отчет с неопределенным количеством колонок. Возиться с кодом было неохота, решил сделать на СКД. С этим проблема не возникла, необходимо было натянуть результат на произвольный макет (свой заголовок +...
27
Несмотря на то, изучающие СКД встречаются с этим на первый или второй день, это должно быть в разделе FAQ. Простой пример программного вывода отчета на компоновке, использующий настройки по умолчанию.
//Получаем схему из...
18
При формировании отчетов на СКД по умолчанию все группировки развернуты, но бывает что необходимо сразу после формирования показать отчет со свернутыми группировками! Данный код в модуле отчета позволяет свернуть...
9
Что при разработке отчетов требуется чтобы у пользователя с ограниченными правами, отчет формировался полностью без проверки прав! Особенно если настроен RLS Есть несколько способов как это сделать: 1. Установить...
При этом флажок Обязательный определяет, задействованы ли поля, используемые в источнике (установлено ЛОЖЬ) или в приемнике (установлено ИСТИНА) и на основании этого добавляет связь в макет.
Для каждого из наборов данных можно установить проверку по иерархии:
Опция используется в случае, если для поля условие отбора необходимо отрабатывать нестандартным образом. Для поля может быть указан набор данных, в котором получаются данные для проверки принадлежности ссылки иерархии некоторого значения.Вопрос 11.33 экзамена 1С:Профессионал по платформе. Допустимо ли использование нескольких наборов данных?
- Только при использовании наборов данных – объект
- Только при использовании наборов данных - запрос
Правильный ответ первый, допустимо в любом случае.
Вопрос 11.10 экзамена 1С:Профессионал по платформе. При определении в схеме компоновки данных связи между двумя наборами данных
- Вариант соединения (левое, полное) выбирается разработчиком
- Всегда используется левое соединение первого набора ко второму
- Всегда используется левое соединение второго набора к первому
- Используется левое соединение первого набора ко второму, в ряде случаев устанавливается внутреннее соединение
Правильный ответ четвертый. Наборы данных соединяются только левым либо внутренним соединением.
Вопрос 11.13 экзамена 1С:Профессионал по платформе. В каких случаях необходимо настраивать проверку иерархии на закладке "Наборы данных" в окне конструктора схемы компоновки
- Если необходимо запретить получение итогов по собственной иерархии, отличной от стандартной
- Если необходимо разрешить получение итогов по собственной иерархии, отличной от стандартной
- Если необходимо запретить установку отбора на вхождение в группу собственной иерархии, отличной от стандартной
- Если необходимо разрешить установку отбора на вхождение в группу собственной иерархии, отличной от стандартной
Правильный ответ четвертый, описание в посте.
Вопрос 11.16 экзамена 1С:Профессионал по платформе. Какие виды соединений двух наборов данных могут быть реализованы в системе компоновки?
- Все, что и в языке запросов: "Все ко всем", "Левое", "Правое", "Внутреннее" и "Полное"
- Только "Все ко всем", "Левое", "Правое" и "Внутреннее"
- Только "Левое", и "Внутреннее"
- Только "Все ко всем", "Левое", и "Внутреннее"
- Только "Левое", "Правое", "Внутреннее" и "Полное"
Правильный ответ четвертый, в соответствии с результатом тестирования. На деле верный третий.
Вопрос 11.17 экзамена 1С:Профессионал по платформе. При настройке связи между двумя наборами данных установлен флаг "Обязательная связь". В каком случае действия пользователя приведут к тому, что связь не будет реализована?
- Соединение данных обоих наборов будет реализовано обязательно независимо от того какие настойки сделал пользователь
- В списке выбранных полей указаны поля только левого набора
- В списке выбранных полей указы поля только правого набора
- В списке выбранных полей указаны поля только левого набора, на поле правого набора установлен отбор
- В списке выбранных полей указаны поля только правого набора, на поле левого набора установлен отбор
Правильный ответ второй, если только один набор (причем источник), то и связывать нечего.
Вопрос 11.39 экзамена 1С:Профессионал по платформе. Каким образом передаются внешние данные в набор – объект в системе компоновки данных?
- Средствами встроенного языка через процессор компоновки данных
- Средствами встроенного языка через компоновщик макета
- Средствами встроенного языка через процессор вывода системы компоновки данных
Правильный ответ первый, через процессор.
В системе компоновки данных можно использовать несколько наборов данных. И вполне логично, что эти наборы данных должны как то связываться между собой. По аналогии с языком запросов 1С наборы данных могут либо либо . В этой статье поговорим про соединение наборов данных в СКД .
На первый взгляд бывает непонятно зачем нужно делать несколько наборов данных и потом соединять их, если можно просто сделать соединение таблиц внутри одного набора данных. Для этого есть как минимум одна причина — в случае использования внешнего набора данных. Как известно, когда мы пишем запрос для набора данных СКД, мы не можем передать в него например . Хотя для обычного запроса это делается достаточно просто. В случае же использования СКД мы вынуждены передавать в нее таблицу значений в качестве . Отсюда и вытекает необходимость делать соединение наборов данных. Сразу отмечу, что наборы данных могут соединятся только при помощи ЛЕВОГО СОЕДИНЕНИЯ . Поэтому в отличие от здесь вы не увидите флажков, которые отвечают за тип соединения таблиц.
А теперь придумаем ситуацию на примере которой сможем рассмотреть соединение наборов данных в СКД. Пусть, у нас есть справочник Товары , которые мы можем получать от разных поставщиков, и мы хотим сформировать отчет c ценами на товары в разрезе поставщиков, чтобы выбрать поставщика с наиболее выгодной ценой. А цены мы будем брать актуальные на текущий момент, к примеру через веб сервисы с сайтов поставщиков.
Соответственно для товаров у нас будет набор данных, полученный при помощи запроса, а для цен будет набор данных полученный из внешнего источника.
А теперь перейдем на закладку Связи наборов данных
и выполним настройку как показано на рисунке.
На закладке Настройки
для начала сделаем элементарный вывод детальных записей
Пусть у нас в справочнике Товары
содержатся следующие записи
Запускаем отчет на выполнение и видим следующую картину
То есть видим, что наборы данных были связаны между собой по всем правилам ЛЕВОГО СОЕДИНЕНИЯ
На закладке Связи наборов данных есть возможность указать некоторые дополнительные параметры в соответствующих полях. Но используются они достаточно редко. Подробнее можно почитать в технической документации и на дисках ИТС.
Схема компоновки данных (1С СКД) - удобный конструктор для создания в программных продуктах 1С:Предприятие сложных отчетов, способствующих развитию и отслеживанию автоматизации производства, позволяющих сделать их максимально гибкими и красивыми за минимум времени. Дополнительный плюс Схемы компоновки данных (1С СКД) - автоматическое формирование управляемой формы отчета, а при дальнейшем развитии данного направления, является важным фактором при выборе метода разработки отчета. Но из-за сложности структуры Схемы компоновки данных (1С СКД) и огромного количества настроек зачастую приводит к более длительной разработке отчета, чем через «конструктор выходной формы». Поэтому программисту 1С необходимо разбираться во всех тонкостях работы Схемы компоновки данных (1С СКД), чтобы в дальнейшем ускорить время разработки формирования отчетов.
Разберем первые три вкладки Схемы компоновки данных (1С СКД) – набор данных, связи набора данных и вычисляемые поля.
Набор данных в 1С СКД
Набор данных включает в себя возможность создания трёх объектов – запрос, объект и объединение, остановимся подробнее на каждом из них:
Представляет собой обычный запрос, который формируется по кнопке Конструктор запроса. Если установлен флаг Автозаполнение, то все выбранные реквизиты автоматически попадут в поля набора данных. Так же есть возможность самим настроить заполнение полей в запросе на вкладке Компоновка данных, где находятся три вкладки:
Таблицы, здесь выбираются таблицы, которые будут участвовать при формировании отчета, обычно выбираются данные по умолчанию, так как на вкладке Таблицы и поля мы уже выбрали нужные нам документы, справочники, регистры…
Поля, здесь мы выбираем те объекты, которые должны попасть в отчет, флаг дочерние указывает, будут ли доступные дочерние элементы по объекту или нет, логично, что у строковых, числовых и подобных данных нельзя будет установить флаг в положение Истина.
Условия, здесь мы выбираем те объекты, которые можно будет использовать в условиях в СКД.
Часть работы выполняется в схеме компоновки данных, часть программно, рассмотрим на простом примере:
Сначала создадим макет схема компоновки данных у документа и назовем СКД (например: 1С СКД), в нем создаем набор данных объект, далее заполняем поля, к примеру, имеем у документа табличную часть товары с реквизитами – номенклатура, количество и цена.
Добавим три поля и заполняем по каждому колонку поле наименованием реквизитов, остальные колонки заполнятся автоматически:
Создадим кнопку на форме документа, опишем механизм работы в управляемых формах:
&НаКлиенте
Процедура Печать()
НашОтчет = ПечатьНаСервере(); //вызываем функцию на сервере
НашОтчет.Показать(); //выводим сформированный отчет
КонецПроцедуры
&НаСервере
Функция ПечатьНаСервере()
ОбъектДокумента = РеквизитФормыВЗначение(“Объект”);
//помещаем табличную часть Товары в структуру с наименованием ТоварыСКД так же, как мы указали в самой СКД имя объекта, содержащего данные
НаборДанных = Новый Структура;
НаборДанных.Вставить(“ТоварыСКД”, ОбъектДокумента.Товары);
//получаем наш макет и выставляем настройки по умолчанию, чтобы все настройки вывода отчета брались из нашего макета
НашМакет = ОбъектДокумента.ПолучитьМакет(“СКД”);
Настройки = НашМакет.НастройкиПоУмолчанию;
//создаем макет компоновки данных с нашими настройками
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(НашМакет, Настройки);
//выполняем компоновку данных с нашим набором данных
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, НаборДанных);
//формируем табличный документ и выводим в него наш отчет
ДокументОтчета = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументОтчета);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
Возврат ДокументОтчета;
КонецФункции
При желании можно получить области и любого другого макета и так же вывести в данном отчете, к примеру, имеем типовой макет формирования платежки и в нем очень хорошо создана шапка, тогда, чтобы нам не делать лишнюю работу, просто сначала получим макет, выведем шапку, потом сформируем и выведем наш отчет на СКД.
Объединение
В него мы можем помещать наш запросы и объекты, но в отличие от связи, он просто прибавляет таблицы друг к другу, то есть если мы свяжем две одинаковых таблицы, то получим в итоге одну, а при объединении, она удвоится, рассмотрим на простом примере:
Имеем таблицы:
При связи мы получим:
А при объединении:
Рассмотрим теперь заполнение колонок в наборах данных (некоторые пропустим, так как связаны с другими вкладками, к ним вернемся в будущих статьях):
- поле , указываем общее название реквизита;
- путь , указываем название реквизита, по которому будем к нему обращаться в СКД, к примеру, в Вычисляемых полях ;
- заголовок , указываем наименование реквизита, которое будет выводится в отчете;
- ограничение поля , указываем доступность данного реквизита;
- ограничение реквизитов , указываем доступность дочерних элементов, важно, если указана доступность реквизитов, то и само поле будет доступно, возможно в будущих релизах изменят данную механику;
- выражение, по которому вычисляется представление поле , удобно использовать, когда нам нужно изменить немного вывод реквизитов, к примеру, нам нужно, чтобы после имени номенклатуры выводился склад , на котором находится она, тогда заполним следующее: Номенклатура + “ находится на складе ” + Склад. Повторюсь, что обращение реквизитам осуществляется через название, указанное в колонке путь;
- выражение упорядочивание , удобный механизм настройки упорядочивания отчета, где условие можно задать вручную, аналогично предыдущему пункту, но как показывает практика, часто этот механизм работает не так, как хотелось бы, и советую пользоваться стандартной сортировкой;
- тип значения , указывается тип значения реквизита, заполнять необходимо, если будете пользоваться следующим полем;
- доступные значения , работает лишь при заполненном типе значения , открываем форму заполнения и в колонке Значение указываем элемент, который нужно изменить, согласно типу, это может быть предопределенные объекты или у числовых, к примеру, реквизитов простые значения, в представлении указываем, на что нам нужно поменять, пример булевского типа:
- оформление – стандартная настройка формата поля, аналогичная настройке в управляемых формах, позволяет более точно и красиво настроить вывод определенного реквизита.
Связи набора данных в 1С СКД
Здесь устанавливается только левое соединение , по принципу, аналогичному связей в запросах, в источнике связи указываем основную таблицу для соединения, в приемнике дополнительную. В выражение источник и выражение приемник указываем реквизиты, по которым будет происходить связь. Остальные колонки рассмотрим подробнее, когда будем разбирать вкладку Параметры . Если нет дополнительной связью с параметрами, то рекомендуется связь делать в запросе, это ускорит работу отчета.