Внимание! Перед вами ознакомительная версия урока, материалы которого могут быть неполными.

Войдите на сайт как ученик

Войдите как ученик, чтобы получить доступ к материалам школы

Система компоновки данных 1С 8.3 для начинающих: делаем связь наборов данных

  • Написать отчёт, который выводит клиентов и их любимые продукты. У каждого клиента есть любимый цвет, а у каждого продукта свой цвет - вот на основании этих цветов и нужно определять "любимость" продукта. К примеру, если у Андрея любимый цвет красный, то одним из его любимых продуктов будут помидоры (они красного цвета).
  • Применить в отчёте два набора данных. Первый набор - это данные из таблицы справочника "Клиенты". Второй - данные из таблицы справочника "Еда".
  • Осуществить связь этих двух наборов , чтобы в отчёте остались только любимые продукты для каждого из клиентов.

Создаем новый отчет

Открываем базу "Гастроном" в конфигураторе и через главное меню создаём новый отчет:

Вид документа - "Внешний отчет":

В форме нового отчёта указываем имя "Урок6" и нажимаем кнопку "Открыть схему компоновки данных":

Оставляем имя схемы по умолчанию:

Добавляем первый набор данных

В открывшейся схеме переходим на закладку "Наборы данных" и через зелёный плюсик выбираем "Добавить набор данных - запрос":

Вызываем конструктор запроса:

Указываем таблицу "Клиенты" и поля, которые требуется получить из запроса:

Добавляем второй набор данных

Добавляем второй набор данных:

Выделяем его (НаборДанных2) и снова вызываем конструктор запроса:

Указываем таблицу справочника "Еда" и поля, которые требуется получить из запроса:

Получился такой текст запроса:

Обратите внимание, что у нас сейчас в отчёте присутствуют два набора данных: НаборДанных1 и НаборДанных2. У каждого свой текст запроса и свои данные.

Делаем имена более наглядными

Для наглядности, давайте переименуем НаборДанных1 в Клиенты, а НаборДанных2 в Еда.

Сделайте это двойным щелчком по каждому из наборов:

Данные каждого из наборов мы сможем использовать в нашем отчёте. К этим данным мы будем обращаться через поля.

В данный момент у набора "Клиенты" следующие поля: "Наименование" и "ЛюбимыйЦвет", а у набора "Еда": "Наименование" и "Цвет".

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

Выделяем набор "Клиенты" и меняем имена полей так:

Затем выделяем набор "Еда" и меняем имена полей так:

Вызываем конструктор настроек

Наконец, переходим на закладку "Настройки" и нажимаем волшебную палочку, чтобы вызвать конструктор настроек:

Тип отчета - "Список...":

Выбираем поля для отчета из обоих наборов:

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

Проверяем отчёт

Сохраняем отчет и формируем в режиме пользователя:

Ага. Хорошо, но не совсем. Произошло так называемое перекрёстное соединение двух наборов (вам это должно быть хорошо знакомо по соединениям в запросах, которые мы изучали в прошлых модулях). Каждой записи из таблицы "Клиенты" сопоставлена запись из таблицы "Еда".

Но нам нужно из всех этих записей оставить только те у которых поле "ЛюбимыйЦветКлиента" равно полю "ЦветЕды":

Осуществляем связь двух наборов данных

Для этого осуществим связь двух наборов данных (Клиенты и Еда) по полям ЛюбимыйЦветКлиента и ЦветЕды.

Переходим на закладку "Связи наборов данных" и нажимаем на кнопку-плюсик, чтобы добавить новую связь:

Настраиваем параметры как на рисунке ниже:

Сделаю пояснения.

Источник и приёмник связи. Ну тут всё понятно. Указываем первый набор (Клиенты) и второй набор (Еда) данных. Хочу обратить особое внимание, что связь будет осуществляться по принципу внешнего левого соединения (мы его проходили в теме запросов в прошлых модулях). Исходя из этого и нужно выбирать какой набор будет источником, а какой приёмником.

Выражение источник. Указываем здесь выражение или просто поле из набора данных источника (мы здесь указали поле ЛюбимыйЦветКлиента из набора Клиенты).

Выражение приемник. Указываем здесь выражение или просто поле из набора данных приёмника (мы здесь указали поле ЦветЕды из набора Еда).

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

Сохраним отчёт и запустим в режиме пользователя:

Отлично!

Сделаю пояснение про поле "Условие связи ", об которое так часто бьют свои копья начинающие программисты.

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

В этом случае для всех строк из источника связи перед осуществлением связи будет проверяться это выражение (условие связи). И если это выражение равно ИСТИНА, то будет предприниматься попытка установить связи этой строки со строками из приемника связи. Если же выражение равно ЛОЖЬ, то таких попыток предприниматься не будет.

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

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

Запрос = Новый Запрос(
"ВЫБРАТЬ
| Таблица.Номенклатура,
| Таблица.Склад
|ИЗ
| &ТЗ КАК Таблица");
Запрос.УстановитьПараметр("ТЗ", ТЗ);

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

Здесь стоит сделать небольшое лирическое отступление и поговорить о Наборах данных. Наборы данных представляют собой источники информации, из которых СКД получает данные, которые позже компонует в отчет. Наборы данных подразделяются на типы, в основном использует тип "Запрос", в теле которого программист пишет запрос к базе данных. Тип "Объект" используется для подгрузки данных из внешних объектов. В обоих случаях на выходе мы имеем некий набор полей, полученных в результате выполнения запроса или подгрузки внешнего объекта. Позже, данными полями можно оперировать на вкладке "Настройки", вместе с детальной настройкой структуры отчета. Для взаимосвязи различных наборов в СКД предусмотрена возможность указания связей наборов данных в одноименной вкладке. Эти связи являются прямым аналогом левого соединения в классическом запросе. Следует, однако, учесть, что запросы в каком-либо наборе данных не "знают" о существовании других наборов данных, в конечном счете связи наборов данных будут влиять на компоновку данных по структуре указанной во вкладке "Настройки".

Детализируем задачу до некоторого примера. Имеется типовой отчет Расчетные ведомости организации конфигурации ЗиК 8. Необходимо что бы виды расчетов в отчете группировались по некоторым группам. Соответствия ВидРасчета-Группа хранятся во внешней таблице значений. Для подгрузки ее в основную схему компановки данных создаем "набор данных объект" с именем "Группы" (рисунок 2). Связь производим с "набором данных запрос" - "Начисления" по виду расчета (рисунок 3). В "наборе данных запрос" - "Начисления" значится информация по группам, удаляем все вхождения. После, на вкладке "Настройки" мы можем использовать поле "Группа", знаечние которого подгружается из внешнего источника данных (рисунок 4). В функции формирования отчета дополняем подгрузку внешних данных.

Функция СформироватьОтчет(Результат = Неопределено, ДанныеРасшифровки = Неопределено, ВыводВФормуОтчета = Истина) Экспорт

//получение или формирование искомой таблицы значений "Группы" и ее запись в одноименную переменную

ВнешниеДанные = Новый Структура();//создаем и заполняем структуру внешних данных
ВнешниеДанные.Вставить(Группы);

ЗначениеПанелипользователя = ТиповыеОтчеты.ПолучитьЗначенияНастроекПанелиПользователяОбъекта(ЭтотОбъект);
НастрокаПоУмолчанию = КомпоновщикНастроек.ПолучитьНастройки();
ТиповыеОтчеты.ПолучитьПримененуюНастройку(ЭтотОбъект);
ТиповыеОтчеты.СформироватьТиповойОтчет(ЭтотОбъект, Результат, ДанныеРасшифровки, ВыводВФормуОтчета, ВнешниеДанные);
КомпоновщикНастроек.ЗагрузитьНастройки(НастрокаПоУмолчанию);
Возврат Результат;

КонецФункции

В случае, если бы мы делали отчет "с нуля", то код запуска формирования отчета выглядел бы следующим образом:

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

Прочитано 9660 раз

СКД 1С расшифровывается как Система Компоновки Данных. СКД 1С – это новый способ написания отчетов в 1С, который позволяет пользователю полностью настраивать отчет самостоятельно.

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

Написание отчетов СКД требует умение работать с запросами в 1С, что мы обсуждали в .

Какова технология создания отчета СКД 1С:

  • Написать запрос 1С в СКД 1С, который обеспечивает получение данных
  • Указать СКД 1С роль полей (вычисляемые поля, ресурсы)
  • Ввести настройки СКД 1С по умолчанию.

Пользователю остается возможность изменить множество настроек по своему желанию.

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

  • Написать запрос в программе 1С
  • Разработать форму настроек (уникальную для отчета), которая позволит изменять только выбранные программистом N настроек
  • Написать код (программу) выполнения запроса и построения печатной формы отчета.

Как Вы видите, СКД 1С имеет значительное преимущество как для пользователя, так и для программиста:

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

Во всех новых конфигурациях 1С все отчеты будут использованы только на СКД 1С.

Давайте посмотрим как создать отчет на СКД 1С самому с нуля.

Создаем отчет СКД 1С

В конфигураторе нажмите кнопку нового файла (меню Файл/Новый).

Выберите тип файла Новый отчет.

Будет создан новый отчет. Введем наименование – без пробелов для конфигурации, синоним для пользователя.

Создадим основную схему СКД 1С.

Создаем запрос для отчета СКД 1С

Источников данных для СКД 1С может быть множество. Чтобы использовать, например, два отдельных запроса – добавьте сначала «Набор данных – объединение», а потом несколько запросов.

В нашем примере мы будем использовать простой запрос.

Набросаем запрос для получения данных.

Работа с конструктором запроса ничем не отличается от обычной, мы обсуждали это в .

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

Если наименование неудобное, здесь его можно изменить.

Обратите внимание, что мы использовали в запросе параметр &ДатаНачала. В СКД 1С есть параметр (дата) по умолчанию с названием &Период и Вы можете использовать его.

Причем указывать его в запросе прямо не надо – он будет использован автоматически. Однако есть тонкость – он применяется ко всем таблицам, включая левые соединения и прочее, что может рождать ошибки.

Например, Вы получаете остатки на начало месяца, а левым соединением получаете данные на сегодня. При использовании Период будет применен ко всем таблицам одинаково и запрос будет работать неверно.

Настройки СКД 1С

На закладке Ресурсы укажем те поля, которые будут суммироваться для итогов (т.е. цифры). У полей можно указать функцию суммирования. По умолчанию это Сумма (т.е. суммировать цифры из всех строк и получить итого), а можно использовать Среднее, Количество, Максимум и т.п.

На закладке Параметры запретим ненужные нам, и включим нужные. Здесь же можно задать человеческое название параметра.

Основная настройка производится на закладке Настройки:


Откроем его в режиме Предприятие. Обратите внимание, что мы не занимались никаким программированием, рисованием форм и прочего. Чтобы задать параметр нажмите кнопку Настройки.

Пользователь видит почти такую же форму настроек, как и программист.

Вуаля. Отчет работает.

Настройки СКД 1С

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

Перетащим Склад из Колонки в Строки.

Перетащим Номенклатуру на Склад.

Нажмите ОК и сформируйте отчет. Ура – мы только что изменили работу отчета в режиме Программирование без программирования.

Нажмите правой кнопкой на Строки (а можно на любое из полей) и выберите Новая группировка.

Раскроем поле Склад и выберем одно из его полей, например Вид склада.

Подумав, мы вспомнили, что хотелось бы, чтобы в одной колонке выводилось сразу несколько полей. Нажмите на только что созданное поле два раза левой кнопкой мыши. Здесь можно добавить поля.

Если Вы добавите новую группировку, но поле не выберете, это означает «Все поля» (отображается как «Детальные записи»). Это выглядит так.

Схватите левой кнопкой мыши нашу группировку (Склад/Номенклатура) и перетащите ее на новую группировку (Вид склада).

Результат наших настроек.

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

Обратите внимание, что настройки могут быть заданы для всего отчета (выбран Отчет) или для конкретной строки полей (выберите строку, например Номенклатура, и выберите Настройки:Нонменклатура).

Расширение языка запросов для системы компоновки данных

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

Синтаксические элементы расширения языка запросов системы компоновки данных

ВЫБРАТЬ

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

Например:

{ВЫБРАТЬ Номенклатура, Склад}

После псевдонима поля может находиться комбинация символов «.*», что обозначает возможность использования дочерних полей от данного поля.

Например, запись Номенклатура.* обозначает возможность использования дочерних полей поля «Номенклатура» (например, поля «Номенклатура.Код»). Элемент ВЫБРАТЬ может присутствовать только в первом запросе объединения.

ГДЕ

Описываются поля, на которые пользователь сможет накладывать отбор. В данном предложении используются поля таблиц. Использование псевдонимов полей списка выборки недопустимо. Каждая часть объединения может содержать собственный элемент ГДЕ.

{ГДЕ Номенклатура.*, Склад }

Нехитрый пример

Необходимо получить продажи за период + вывести всю номенклатуру, независимо от того были ли продажи или нет. То есть, необходимо выбрать данные из таблицы оборотов регистра Продажи, данные из справочника номенклатура. Опустим вопрос зачем нам нужна вся номенклатура.

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

ВЫБРАТЬ СпрНоменклатура.Ссылка КАК Номенклатура, ПродажиОбороты.Контрагент, ПродажиОбороты.ДоговорКонтрагента, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СтоимостьОборот КАК Стоимость ИЗ Справочник.Номенклатура КАК СпрНоменклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты ПО СпрНоменклатура.Ссылка = ПродажиОбороты.Номенклатура

Вот результат:

Контрагент Договор Номенклатура Количество Сумма
null null _Тест1 null null
ООО "Рога и копыта" Договор1 Тапочки 10 1200
ОАО "Газпром" Клевый договор Сапоги 5 13000
null null Галоши null null
null null Сланцы null null

В данном примере не было продаж номенклатуры: "Галоши" и "Сланцы"

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

Совсем не то что нам нужно, правда?

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

Решение есть: для этого в конструкторе запросов на вкладке Компоновка данных => Таблицы добавим поле-условие в условия виртуальной таблицы ПродажиОбороты и сменим ему псевдоним на КонтрагентОтбор

Для того чтобы не путать пользователя с полями отбора, отключим поле-условие Контрагент и сменим заголовок для поля КонтрагентОтбор


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

ВЫБРАТЬ СпрНоменклатура.Ссылка КАК Номенклатура, ПродажиОбороты.Контрагент КАК Контрагент, ПродажиОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента, ПродажиОбороты.КоличествоОборот КАК >Количество, ПродажиОбороты.СтоимостьОборот КАК Стоимость, ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.ДоговорКонтрагента) КАК ДоговорКонтрагентаПредставление, ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Контрагент) КАК КонтрагентПредставление, СпрНоменклатура.Представление КАК НоменклатураПредставление ИЗ Справочник.Номенклатура КАК СпрНоменклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&П , , , Контрагент = &П3 ) КАК ПродажиОбороты ПО СпрНоменклатура.Ссылка = ПродажиОбороты.Номенклатура

И соответственно результат:

Контрагент Договор Номенклатура Количество Сумма
null null _Тест1 null null
ООО "Рога и копыта" Договор1 Тапочки 10 1200
null null Сапоги null null
null null Галоши null null
null null Сланцы null null

Тест1 - это группа в справочнике Номенклатура, в которой все лежит

К публикации прикреплена схема XML-схема отчета, использовавшегося в публикации. Схему создавал в Комплексной автоматизации, но думаю, все будет прекрасно работать и в УПП и в УТ 10

Подведение итогов

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

Если же вы имеете достаточно опыта, чтобы создавать схемы без использования Автозаполнения - то данный совет не имеет смысла.

Использовавшийся софт

  • Программа создания скриншотов SnimOK!
  • Редактор XML-файлов



Close