Как связать наборы данных скд
Самостоятельно разбираюсь с возможностями СКД, хочу связать три набора данных и вывести из них значения в виде детальных записей.
Создал тестовую конфигурацию, она состоит из:
- справочник "Номенклатура"
- регистр сведений "ЦеныНоменклатуры", измерение "Номенклатура" - тип СправочникСсылка.Номенклатура и ресурс "Цена" - тип "Число"
- регистр сведений "ЗапасыНоменклатуры", измерение "Номенклатура" - тип СправочникСсылка.Номенклатура и ресурс "Запас" - тип "Число"
Создаю "Отчет1", настраиваю СКД:
На закладке "Наборы данных" описываю три набора данных - запрос:
1. "ВсяНоменклатура"
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура
ИЗ
Справочник.Номенклатура КАК Номенклатура
2. "ЦеныНоменклатуры"
ВЫБРАТЬ
ЦеныНоменклатуры.Номенклатура,
ЦеныНоменклатуры.Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
3. "ЗапасыНоменклатуры"
ВЫБРАТЬ
ЗапасыНоменклатуры.Номенклатура,
ЗапасыНоменклатуры.Запас
ИЗ
РегистрСведений.ЗапасыНоменклатуры КАК ЗапасыНоменклатуры
На закладке "Связи наборов данных" задаю связи:
Источник связи | Приемник связи | Выражение источник | Выражение приемник
ВсяНоменклатура | ЦеныНоменклатуры | Номенклатура | Номенклатура
ВсяНоменклатура | ЗапасыНоменклатуры | Номенклатура | Номенклатура
На закладке "Настройки" добавляю группировку "Детальные записи" и в "Выбранные поля" указываю "Номенклатура", "Цена", "Запас".
Формирую отчет - вылетает ошибка "Использование полей из не связанных наборов данных не допустимо".
Я не понимаю, о каких не связанных наборах данных идет речь? Я вроде все связал. Помогите, пожалуйста, разобраться!
Войдите как ученик, чтобы получить доступ к материалам школы
Система компоновки данных 1С 8.3 для начинающих: объединяем наборы данных
Автор уроков и преподаватель школы: Владимир Милькин
На прошлом уроке мы познакомились с соединением наборов данных. Сегодня же мы научимся объединять различные наборы данных в один набор.
Ставим цель
- Создать новый отчёт, в котором будут выводиться закупки (дата, поставщик) и продажи (дата, клиент) одновременно.
- Для этого сделаем два отдельных набора данных с выборкой из таблиц документов "ПоступлениеЕды" и "ПродажаЕды", а затем объединим их в один набор.
Создаем новый отчет
Открываем базу "Гастроном" в конфигураторе и через главное меню "Файл->Новый. " создаём отчёт:
Вид документа - "Внешний отчет":
В форме нового отчёта указываем имя "Урок7" и нажимаем кнопку "Открыть схему компоновки данных":
Соглашаемся с именем макета по умолчанию:
Создаем первый набор данных
Создаём новый набор данных - запрос (через зелёный плюсик), выделяем его и вызываем конструктор запроса:
Делаем выборку из таблицы документов "ПоступлениеЕды" следующих полей:
Вот он, текст нашего запроса к таблице по закупкам:
Создаем второй набор данных
Выделяем мышкой пункт "Наборы данных".
. и добавляем ещё один набор данных - запрос:
Выделяем его и вызываем конструктор запроса:
Делаем выборку из таблицы документов "ПродажаЕды" следующих полей:
Текст запроса будет таким:
Сделаем имена более читабельными. Для этого двойным щелчком переименуем "НаборДанных1" в "Покупки" и поле "Дата" в "ДатаПокупки":
Второй же набор "НаборДанных2" переименуем в "Продажи", а поле "Дата" переименуем в "ДатаПродажи":
Мы получили два набора данных. В первом - информация по покупкам (дата покупки и поставщик), во втором- информация по продажам (дата продажи и клиент). Давайте попробуем теперь вывести всё это в отчет.
Проверяем результат
Переходим на закладку "Настройки" и нажимаем волшебную палочку для вызова конструктора:
Тип отчета - "Список. ":
Выбираем поля для отчёта из обоих наборов:
Сохраняем отчёт и формируем в режиме пользователя:
Получилось не совсем то, что ожидали. Получилось перекрёстное соединение одного набора данных с другим. А нам нужно именно объединение. Исправим.
Создаем объединение наборов данных
Для этого переходим на закладку "Наборы данных".
Снова выделяем мышкой пункт "Наборы данных".
. и добавляем туда набор данных - объединение:
Видим, что этот набор добавился и у него совершенно другая картинка (не таблица, как у двух других, а два объединяющихся круга):
Затем перетаскиваем мышкой наборы "Покупки" и "Продажи" в "НаборДанных1":
Вот это и значит, что теперь "Покупки" и "Продажи" будут не соединяться, а именно объединяться в отчёте.
Сохраним отчёт и сформируем в режиме пользователя:
Отлично. То, что надо.
А давайте зададимся целью объединить столбцы "Поставщик" и "Клиент" в один? И пусть этот новый столбец будет называться "Контрагент".
Для этого заходим на закладку "Наборы данных" и меняем имя поля "Поставщик" в наборе "Покупки" на имя "Контрагент":
Затем в наборе "Продажи" меняем имя поля "Клиент" на имя "Контрагент":
Переходим на закладку "Настройки", выделяем пункт "Отчет", переходим внизу на закладку "Выбранные поля", удаляем уже не существующие поля "Поставщик" и "Клиент" и перетаскиваем из первой колонки во вторую новое поле "Контрагент":
Должно получится вот так:
Готово
Сохраняем отчёт и проверяем в режиме пользователя:
Замечательно всё получилось.
Войдите на сайт как ученик
Для учеников
Прибегайте к изучению эталонного варианта только после самостоятельного выполнения всех шагов.
На вопросы учеников — отвечаю по почте, но прежде загляните в ЧАВО (ссылка) .
Войдите как ученик, чтобы получить доступ к материалам школы
Система компоновки данных 1С 8.3 для начинающих: делаем связь наборов данных
Автор уроков и преподаватель школы: Владимир Милькин
Ставим цель
- Написать отчёт, который выводит клиентов и их любимые продукты. У каждого клиента есть любимый цвет, а у каждого продукта свой цвет - вот на основании этих цветов и нужно определять "любимость" продукта. К примеру, если у Андрея любимый цвет красный, то одним из его любимых продуктов будут помидоры (они красного цвета).
- Применить в отчёте два набора данных. Первый набор - это данные из таблицы справочника "Клиенты". Второй - данные из таблицы справочника "Еда".
- Осуществить связь этих двух наборов, чтобы в отчёте остались только любимые продукты для каждого из клиентов.
Создаем новый отчет
Открываем базу "Гастроном" в конфигураторе и через главное меню создаём новый отчет:
Вид документа - "Внешний отчет":
В форме нового отчёта указываем имя "Урок6" и нажимаем кнопку "Открыть схему компоновки данных":
Оставляем имя схемы по умолчанию:
Добавляем первый набор данных
В открывшейся схеме переходим на закладку "Наборы данных" и через зелёный плюсик выбираем "Добавить набор данных - запрос":
Добавился первый набор данных. Напишем запрос.
Вызываем конструктор запроса:
Указываем таблицу "Клиенты" и поля, которые требуется получить из запроса:
Получился такой текст запроса:
Добавляем второй набор данных
Выделяем мышкой пункт "Наборы данных".
. и добавляем ещё один набор данных - запрос:
Выделяем его (НаборДанных2) и снова вызываем конструктор запроса:
Указываем таблицу справочника "Еда" и поля, которые требуется получить из запроса:
Получился такой текст запроса:
Обратите внимание, что у нас сейчас в отчёте присутствуют два набора данных: НаборДанных1 и НаборДанных2. У каждого свой текст запроса и свои данные.
Делаем имена более наглядными
Для наглядности, давайте переименуем НаборДанных1 в Клиенты, а НаборДанных2 в Еда.
Сделайте это двойным щелчком по каждому из наборов:
Данные каждого из наборов мы сможем использовать в нашем отчёте. К этим данным мы будем обращаться через поля.
В данный момент у набора "Клиенты" следующие поля: "Наименование" и "ЛюбимыйЦвет", а у набора "Еда": "Наименование" и "Цвет".
Видим, что имена пересекаются и мы легко запутаемся. Поэтому давайте изменим имена полей на более говорящие.
Выделяем набор "Клиенты" и меняем имена полей так:
Затем выделяем набор "Еда" и меняем имена полей так:
Вызываем конструктор настроек
Наконец, переходим на закладку "Настройки" и нажимаем волшебную палочку, чтобы вызвать конструктор настроек:
Тип отчета - "Список. ":
Выбираем поля для отчета из обоих наборов:
Видите почему так важно было изменить имена полей? На этапе настроек компоновки данных мы не видим из каких наборов эти поля. Видим только их имена.
Проверяем отчёт
Сохраняем отчет и формируем в режиме пользователя:
Ага. Хорошо, но не совсем. Произошло так называемое перекрёстное соединение двух наборов (вам это должно быть хорошо знакомо по соединениям в запросах, которые мы изучали в прошлых модулях). Каждой записи из таблицы "Клиенты" сопоставлена запись из таблицы "Еда".
Но нам нужно из всех этих записей оставить только те у которых поле "ЛюбимыйЦветКлиента" равно полю "ЦветЕды":
Осуществляем связь двух наборов данных
Для этого осуществим связь двух наборов данных (Клиенты и Еда) по полям ЛюбимыйЦветКлиента и ЦветЕды.
Переходим на закладку "Связи наборов данных" и нажимаем на кнопку-плюсик, чтобы добавить новую связь:
Настраиваем параметры как на рисунке ниже:
Источник и приёмник связи. Ну тут всё понятно. Указываем первый набор (Клиенты) и второй набор (Еда) данных. Хочу обратить особое внимание, что связь будет осуществляться по принципу внешнего левого соединения (мы его проходили в теме запросов в прошлых модулях). Исходя из этого и нужно выбирать какой набор будет источником, а какой приёмником.
Выражение источник. Указываем здесь выражение или просто поле из набора данных источника (мы здесь указали поле ЛюбимыйЦветКлиента из набора Клиенты).
Выражение приемник. Указываем здесь выражение или просто поле из набора данных приёмника (мы здесь указали поле ЦветЕды из набора Еда).
Таким образом данная связь оставит из прошлого списка только те строки, у которых поле ЛюбимыйЦветКлиента равно полю ЦветЕды.
Сохраним отчёт и запустим в режиме пользователя:
Сделаю пояснение про поле "Условие связи", об которое так часто бьют свои копья начинающие программисты.
Условие связи - это вспомогательное поле. Туда можно писать выражения с участием полей только из набора данных, указанного в источнике связи.
В этом случае для всех строк из источника связи перед осуществлением связи будет проверяться это выражение (условие связи). И если это выражение равно ИСТИНА, то будет предприниматься попытка установить связи этой строки со строками из приемника связи. Если же выражение равно ЛОЖЬ, то таких попыток предприниматься не будет.
Вот, к примеру, давайте поставим такую цель: сделать так, чтобы связь указанных нами наборов данных осуществлялась только, если клиента зовут "Андрей". То есть любимые продукты (если они есть) выводились только для Андрея, а для других клиентов - не выводились (даже если они есть).
Очень просто. Напишем в условии связи выражение ИмяКлиента = "Андрей":
Сохраним отчёт и сформируем в режиме пользователя:
Войдите на сайт как ученик
Для учеников
Прибегайте к изучению эталонного варианта только после самостоятельного выполнения всех шагов.
На вопросы учеников — отвечаю по почте, но прежде загляните в ЧАВО (ссылка) .
Войдите как ученик, чтобы получить доступ к материалам школы
Система компоновки данных 1С 8.3 для начинающих: первый отчёт на СКД
Автор уроков и преподаватель школы: Владимир Милькин
Если вы не читали введение к этому модулю - пожалуйста, прочтите его: ссылка.
Готовим рабочее место
Для выполнения уроков вам понадобится 1С 8.3 (не ниже 8.3.13.1644) .
Если у вас уже есть установленная 1С версии 8.3 - используйте её. Если нет - скачайте и установите учебную версию, которую фирма 1С выпускает специально для образовательных целей: ссылка на инструкцию по скачиванию и установке 1С.
На вашем рабочем столе должен появиться вот такой ярлык:
Для всех уроков из этого цикла мы будем использовать подготовленную мной базу данных "Гастроном". Она полностью совпадает с базой, которую мы использовали в четвёртом и пятом модулях школы при изучении запросов. Поэтому я рассчитываю, что вы знакомы с её справочниками и документами.
Если вы её удалили - скачайте заново по следующей ссылке, распакуйте и подключите в список баз.
Наконец, рабочее место настроено и сейчас мы вместе создадим наш первый отчёт при помощи системы компоновки данных. Он будет очень простым, чтобы продемонстрировать общие возможности системы компоновки данных (сокращенно СКД).
Ставим цель
Цель этого урока - создать отчёт, который в режиме пользователя выводит список клиентов со следующими полями:
- Имя
- Пол
- Любимый цвет клиента.
Отчёт должен быть внешним. Это значит, что он будет создан и настроен в конфигураторе, а затем сохранен в виде отдельного (внешнего) файла на компьютере.
Чтобы сформировать такой отчет в 1С пользователю нужно будет запустить базу в режиме пользователя, открыть этот файл и нажать кнопку "Сформировать".
Создаём отчёт
Запускаем конфигуратор для базы "Гастроном":
Из главного меню выбираем пункт "Файл"->"Новый. ":
Выбираем "Внешний отчет":
Создаём схему компоновки данных внутри отчёта
Открылось окно создания внешнего отчёта. В качестве имени вводим: "Урок1", а затем жмём кнопку "Открыть схему компоновки данных":
Запустился конструктор создания схемы. Соглашаемся с именем по умолчанию "ОсновнаяСхемаКомпоновкиДанных" и жмём кнопку "Готово":
Открылось основное рабочее окно, с множеством закладок и полей, в котором мы и будем настраивать нашу схему компоновки данных.
Не нужно пугаться - возможностей здесь действительно много, но далеко не все из них нам нужны. Особенно на первом уроке.
Сейчас мы находимся на закладке "Наборы данных". На ней и останемся.
Пишем запрос через конструктор
Система компоновки данных (сокращенно СКД) требует от нас данные, которые она будет выводить пользователю.
Самый простой способ - написать запрос к базе. В предыдущих модулях школы мы научились писать и понимать запросы - поэтому я рассчитываю, что вы обладаете соответствующими навыками.
Нажимаем на зелёный плюсик и в раскрывшемся списке выбираем пункт "Добавить набор данных - запрос":
Добавился набор данных с именем "НаборДанных1", но мы видим, что поле "Запрос" в нижней части окна пока пустое:
Наша задача написать в это поле текст запроса. Вы ещё не забыли как это делается?
В этом запросе мы выбрали три поля ("Наименование", "Пол" и "ЛюбимыйЦвет") из таблицы "Справочник.Клиенты".
Но не торопитесь писать этот текст в поле "Запрос" вручную.
Сейчас мы создадим тот же самый запрос визуально, только при помощи мышки. Этот способ называется "Конструктор запроса".
Чтобы вызвать этот конструктор нажмём кнопку "Конструктор запроса. " в верхней правой части поля "Запрос":
В открывшемся окне перетащим таблицу "Клиенты" из первого столбца во второй, чтобы указать, что именно из этой таблицы мы будем запрашивать данные:
Получилось вот так:
Далее раскроем таблицу "Клиенты" во втором столбце по знаку "Плюс", чтобы увидеть все её поля и перетащим поле "Наименование" из второго столбца в третий, чтобы указать, что из этой таблицы нам нужно запрашивать поле "Наименование":
Получилось вот так:
Поступим точно так же с полями "Пол" и "ЛюбимыйЦвет". Результат будет таким:
Нажмём кнопку "ОК", чтобы выйти из конструктора запроса и увидим, что текст запроса автоматически добавился в поле "Запрос".
Более того на основании текста запроса 1С сама вытащила имена полей (область выше запроса), которые будут использоваться схемой компоновки данных:
Теперь, когда мы составили запрос, СКД знает каким образом получать данные для отчёта.
Настраиваем представление данных
Осталось как-то визуализировать эти данные для пользователя в виде печатной формы. И вот тут СКД может творить чудеса!
Чтобы сотворить такое чудо перейдём на вкладку "Настройки" и нажмём кнопку конструктора настроек (волшебная палочка):
В открывшемся окне укажем тип отчёта "Список" и нажмём "Далее":
В следующем окне выберем (путём перетаскивания) поля, которые нужно будет отобразить в списке (перетащим все из доступных нам: "ЛюбимыйЦвет", "Наименование" и "Пол"):
Получим вот такой результат и нажмём кнопку "ОК":
Конструктор настроек закрылся и появился пункт "Детальные записи":
Отчёт готов, давайте же его проверим. Для этого вначале сохраним отчет в виде внешнего файла.
Сохраняем отчёт в виде файла
Откроем пункт главного меню "Файл"->"Сохранить":
Я сохраню его на рабочий стол под именем "Урок1":
Проверяем отчёт в режиме пользователя
Наконец, закроем конфигуратор и зайдём в нашу базу в режиме пользователя:
Имя пользователя "Администратор", пароля нет:
Через меню выберем пункт "Файл"->"Открыть. ":
И укажем файл отчёта (я сохранял его на рабочий стол под именем "Урок1.erf":
Открылась форма отчёта, нажмём кнопку "Сформировать":
Готово! Вот она наша печатная форма со списком клиентов, их любимым цветом и полом:
Печатную форму можно легко распечатать. Для этого достаточно выбрать в меню пункт "Файл"->"Печать. ":
Вот так просто, без программирования нам удалось создать полноценный отчёт, который пользователи смогут открывать в своих базах, формировать и распечатывать.
То ли ещё будет, наберитесь терпения
Войдите на сайт как ученик
Для учеников
Прибегайте к изучению эталонного варианта только после самостоятельного выполнения всех шагов.
На вопросы учеников — отвечаю по почте, но прежде загляните в ЧАВО (ссылка) .
Порой для получения определенного результата компоновки необходимо создать в СКД связи наборов данных. О том, когда это нужно и как это сделать мы и постараемся рассказать в нашей статье.
Схема компоновки данных, реализованная в 1С, поддерживает три типа источника данных (Рис.1)
Источники данных
Наиболее очевидным и часто используемым разработчиками источником данных является «Запрос».
Конструктор запросов, реализованный в 8 версии 1С очень удобен, и, в большинстве случаев, связать между собой несколько таблиц, сделать необходимые группировки и отборы можно прямо в нем.
В сложных случаях, когда требуется или целесообразней использовать выполнение некоторого кода (допустим, загрузка данных из стороннего файла) или когда нет возможности использовать запрос, на помощь приходит источник данных «Объект». Произвольный код, выполняемый в модуле, на выходе должен иметь некоторую структуру, к которой СКД сможет обратиться.
Третий источник данных «Объединение». Фактически, этот источник можно рассматривать как один из видов связи. Он объединяет (сводит в одну несколько таблиц), не сопоставляя, однако совпадение тех или иных полей. То есть, если в двух объединяемых таблицах 3 и 4 строки соответственно, то в результирующем источнике данных, будет 7 строк.
Постановка задачи
В качестве полигона для испытаний мы выберем базу УПП, версии 1.3.92.3, работающую в режиме обычного приложения.
Перед нами поставлена следующая задача: используя только СКД создать отчет, который бы выводил таблицу закупаемой номенклатуры из документа, с ценами, взятыми из файла, присланного контрагентом.
Таким образом, мы должны:
- Взять табличную часть документа поступления;
- Загрузить файл в источник данных «Объект»;
- Связать эти два источника по определенному параметру (в нашем случае это будет код);
- Вывести результирующую таблицу.
Процесс выполнения
Пройдем все перечисленные шаги:
- Создаем запрос к табличной части документа поступления (Рис.2)
Здесь важно обратить внимание на «Имя объекта, содержащего данные», именно это имя нам придется указать в коде модуля отчета.
- Переходим в модуль отчета и создаем там процедуру «ПриКомпоновкеРезультата» (Рис.4);
Саму процедуру получения данных из внешнего файла мы описывать не будем, обратим внимание на ту часть кода, которая обязательно должна присутствовать в компоновке для того, чтобы мы могли получить данные для «Набора данных 2» (Рис.5).
Важно! При создании «Объекта» в коде процедуры при компоновке, значение параметра СтандартнаяОбработка должно быть Ложь.
Переходим на закладку «Связи наборов данных».
Связываем наборы
Заходим на соответствующую закладку схемы (Рис.6).
Мы видим табличную часть, которая очень похожа на табличную часть, которая есть в конструкторе запросов, за некоторым исключением. Для набора источника и набора приемника связи нельзя установить галочку «Все», зато добавлены несколько дополнительных колонок.
В связях наборов данных можно установить только связь, подобную внешнему левому соединению конструктора запроса.
Прежде, чем создать связь, давайте определимся с назначением колонок:
- Источник связи – первый набор данных, из которого возьмутся все имеющиеся значения;
- Приемник связи – набор данных, из которого выберутся значения, соответствующие нашему условию;
- Выражение источник – поле или выражение первого набора данных, по которому будет происходить сопоставление;
- Выражение приемник – поле или выражение зависимого набора;
- Параметр – если в этом поле указать имя параметра, то связь с набором – приемником будет осуществляться только по указанному в параметре значению;
- Список параметров – определяет возможность использования списка значений в качестве параметра;
- Условие связи – указав здесь выражение с использованием полей источника, можно создать условие, выполнение которого будет служить сигналом к установлению связи;
- Начальное значение – показывает начальное значение связи;
- Обязательная связь – определяет, задействованы ли поля, используемые в источнике (установлено ЛОЖЬ) или в приемнике (установлено ИСТИНА) и на основании этого добавляет связь в макет.
- В качестве источника связи будет выступать результат нашего запроса;
- В качестве приемника будет выступать объект;
- Выражение источник будет «НоменклатураКод»;
- Выражение приемник «Номенклатура»;
- Связь будет обязательной (Рис.7).
Если бы мы в качестве условия связи указали наименование какой-либо номенклатуры, или её вид воспроизводства или еще что-то, мы могли бы получить более точную выборку для нашей задачи. Результат наших действий можно увидеть на рис.8
Читайте также: