1с как посмотреть результирующий запрос скд

Обновлено: 03.07.2024

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

Система компоновки данных 1С 8.3 для начинающих: первый отчёт на СКД

Автор уроков и преподаватель школы: Владимир Милькин

Если вы не читали введение к этому модулю - пожалуйста, прочтите его: ссылка.

Готовим рабочее место

Для выполнения уроков вам понадобится 1С 8.3 (не ниже 8.3.13.1644) .

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

На вашем рабочем столе должен появиться вот такой ярлык:

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

Если вы её удалили - скачайте заново по следующей ссылке, распакуйте и подключите в список баз.

Наконец, рабочее место настроено и сейчас мы вместе создадим наш первый отчёт при помощи системы компоновки данных. Он будет очень простым, чтобы продемонстрировать общие возможности системы компоновки данных (сокращенно СКД).

Ставим цель

Цель этого урока - создать отчёт, который в режиме пользователя выводит список клиентов со следующими полями:

  • Имя
  • Пол
  • Любимый цвет клиента.

Отчёт должен быть внешним. Это значит, что он будет создан и настроен в конфигураторе, а затем сохранен в виде отдельного (внешнего) файла на компьютере.

Чтобы сформировать такой отчет в 1С пользователю нужно будет запустить базу в режиме пользователя, открыть этот файл и нажать кнопку "Сформировать".

Создаём отчёт

Запускаем конфигуратор для базы "Гастроном":

Из главного меню выбираем пункт "Файл"->"Новый. ":

Выбираем "Внешний отчет":

Создаём схему компоновки данных внутри отчёта

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

Запустился конструктор создания схемы. Соглашаемся с именем по умолчанию "ОсновнаяСхемаКомпоновкиДанных" и жмём кнопку "Готово":

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

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

Сейчас мы находимся на закладке "Наборы данных". На ней и останемся.

Пишем запрос через конструктор

Система компоновки данных (сокращенно СКД) требует от нас данные, которые она будет выводить пользователю.

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

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

Добавился набор данных с именем "НаборДанных1", но мы видим, что поле "Запрос" в нижней части окна пока пустое:

Наша задача написать в это поле текст запроса. Вы ещё не забыли как это делается?

В этом запросе мы выбрали три поля ("Наименование", "Пол" и "ЛюбимыйЦвет") из таблицы "Справочник.Клиенты".

Но не торопитесь писать этот текст в поле "Запрос" вручную.

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

Чтобы вызвать этот конструктор нажмём кнопку "Конструктор запроса. " в верхней правой части поля "Запрос":

В открывшемся окне перетащим таблицу "Клиенты" из первого столбца во второй, чтобы указать, что именно из этой таблицы мы будем запрашивать данные:

Получилось вот так:

Далее раскроем таблицу "Клиенты" во втором столбце по знаку "Плюс", чтобы увидеть все её поля и перетащим поле "Наименование" из второго столбца в третий, чтобы указать, что из этой таблицы нам нужно запрашивать поле "Наименование":

Получилось вот так:

Поступим точно так же с полями "Пол" и "ЛюбимыйЦвет". Результат будет таким:

Нажмём кнопку "ОК", чтобы выйти из конструктора запроса и увидим, что текст запроса автоматически добавился в поле "Запрос".

Более того на основании текста запроса 1С сама вытащила имена полей (область выше запроса), которые будут использоваться схемой компоновки данных:

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

Настраиваем представление данных

Осталось как-то визуализировать эти данные для пользователя в виде печатной формы. И вот тут СКД может творить чудеса!

Чтобы сотворить такое чудо перейдём на вкладку "Настройки" и нажмём кнопку конструктора настроек (волшебная палочка):

В открывшемся окне укажем тип отчёта "Список" и нажмём "Далее":

В следующем окне выберем (путём перетаскивания) поля, которые нужно будет отобразить в списке (перетащим все из доступных нам: "ЛюбимыйЦвет", "Наименование" и "Пол"):

Получим вот такой результат и нажмём кнопку "ОК":

Конструктор настроек закрылся и появился пункт "Детальные записи":

Отчёт готов, давайте же его проверим. Для этого вначале сохраним отчет в виде внешнего файла.

Сохраняем отчёт в виде файла

Откроем пункт главного меню "Файл"->"Сохранить":

Я сохраню его на рабочий стол под именем "Урок1":

Проверяем отчёт в режиме пользователя

Наконец, закроем конфигуратор и зайдём в нашу базу в режиме пользователя:

Имя пользователя "Администратор", пароля нет:

Через меню выберем пункт "Файл"->"Открыть. ":

И укажем файл отчёта (я сохранял его на рабочий стол под именем "Урок1.erf":

Открылась форма отчёта, нажмём кнопку "Сформировать":

Готово! Вот она наша печатная форма со списком клиентов, их любимым цветом и полом:

Печатную форму можно легко распечатать. Для этого достаточно выбрать в меню пункт "Файл"->"Печать. ":

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

То ли ещё будет, наберитесь терпения

Эталонная обработка, после выполнения всех шагов этого урока

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

Для учеников

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

На вопросы учеников — отвечаю по почте, но прежде загляните в ЧАВО (ссылка) .

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

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

В этом разделе разберем если не все, то большинство ситуаций срабатывания механизма замены (модификации) запроса. Среди них будут как ожидаемые, так и неожиданные примеры .

Вспомогательные данные

При выполнении запроса для вывода в отчет в запрос дополнительно включаются - данные о представлении агрегатных объектов, при наличии группировок - данные для сортировки и сама сортировка.

Для детальных записей это выглядит так:

1С СКД

При наличии группировок так:

1С СКД

Использовать группировки запроса если возможно

Начиная с определенного релиза платформы 1С (по-моему, с 8.3.14) в СКД появилась для «наборов данных запрос» опция «Использовать группировки запроса если возможно»:

1С СКД

В отчете с группировкой по номенклатуре и ресурсами «Количество» и «Сумма» получаем:

1С СКД

Слева запрос без опции, справа с установленной опцией. Как видно с установленной опцией свертка данных производится на стороне СУБД.

Что означает «если возможно»? Если рассмотрим такой текст запроса:

1С СКД

То на него указанная опция не действует. Видимо к регистрам накопления «невозможно» применить эту опцию:

1С СКД

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

Необязательное условие

Этот пример мы уже рассматривали в предыдущем разделе про расширение языка запросов. Повторим еще раз и рассмотрим чуть больше примеров:

Исходный текст запроса:

1С СКД

Если не задан ни один параметр:

1С СКД

Если задан один параметр:

1С СКД

Если заданы оба параметра:


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

1С СКД

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

1С СКД

Необязательная таблица

Такой пример мы тоже уже разбирали. Исходный запрос:

1С СКД

Если выбрано поле остатка:

1С СКД

Если поле остатка не выбрано:

1С СКД

Теперь рассмотрим запрос чуть сложнее:

1С СКД

В нем мы получаем данные по продажам, из связанной накладной получаем статью расходов, из статьи получаем формулу расчета. Реквизиты «Статья» и «ФормулаРасчета» могут не включаться в отчет. Допустим, нам не нужна статья, но нужна формула расчета. Какой итоговый запрос мы получим в этом случае:

1С СКД

Реквизит «Статья» исключен из запроса и некорректно исключена связанная с ним таблица по накладным. До сих пор мы рассматривали элементы расширения языка запросов. Посмотрим, как выглядят они в конструкторе запросов. Необязательные таблицы можно увидеть на закладке «Компоновка данных - Таблицы»:

1С СКД

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

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

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

1С СКД

1С СКД

Странно конечно получается, если мы запрос создаем в конструкторе запросов (до этого в первом исходном запросе я расставил скобки «<>» руками):

1С СКД

Таблицы расположены в разных группах, но как бы одна внутри другой:

1С СКД

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

1С СКД

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

Серия статей по СКД
Предыдущая статья .., Следующая статья ...
Автор курсов образовательного проекта Profession Store. Павел Шемякин

Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.

Планируется в версии 8.3.20

Когда мы пишем запросы и создаем отчёты, нередко бывает нужно не просто показать данные в том виде, в котором они лежат в БД, а произвести над ними какие-то операции. Например, посчитать разницу между двумя датами или округлить число до нужной разрядности. Хорошо, если нужная функция есть в языке запросов (или в языке СКД) - тогда мы можем сделать с данными то, что хотим, на уровне запроса / СКД, а потом просто отобразить результат. Если же нужная функция в языке запросов не реализована – приходится делать постобработку запроса в языке 1С, проходясь в цикле по результатам запроса и выполняя нужные операции. Что приводит к разрастанию кода конфигурации и может снизить производительность.

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

Язык запросов

В язык запросов добавляются функции:

Строка(String) – преобразует значение в примитивного типа в строку с учетом национальных установок.

Тригонометрические функции Sin, Cos, Tan, ASin, ACos, ATan (все вычисления производятся в радианах)

Exp - вычисляет результат возведения основания натурального логарифма (числа e) в степень

Log - вычисляет натуральный логарифм числа.

Log10 - вычисляет десятичный логарифм числа.

Pow - вычисляет возведение в степень.

Sqrt – вычисляет квадратный корень.

Окр(Round) - округляет исходное число до нужной разрядности

Цел(Int) - вычисляет целую часть переданного числа, полностью отсекая дробную часть.

ДлинаСтроки(StringLength) – вычисляет длину строки.

СокрЛ(TrimL) – отбрасывает незначащие пробелы слева.

СокрП(TrimR) – отбрасывает незначащие пробелы справа.

СокрЛП(TrimAll) – отбрасывает незначащие пробелы слева и справа.

Лев(Left) – получает первые слева символы строки.

Прав(Right) – получает первые справа символы строки.

СтрНайти(StrFind) – находит первую позицию подстроки в строке (без учета регистра).

ВРег(Upper) – преобразует все символы строки в верхний регистр.

НРег(Lower) – преобразует все символы строки в нижний регистр.

СтрЗаменить(StrReplace) – заменяет все вхождения подстроки на другую подстроку (без учета регистра).

РазмерХранимыхДанных(StoredDataSize) – возвращает размер данных в байтах, которые занимают данные параметра.

Система компоновки данных

В язык выражений системы компоновки данных добавлены новые функции:

СокрЛ(TrimL) – отбросить незначащие пробелы слева.

СокрП(TrimR) – отбросить незначащие пробелы справа.

СокрЛП(TrimAll) – отбросить незначащие пробелы слева и справа.

Лев(Left) – получить первые слева символы строки.

Прав(Right) – получить первые справа символы строки.

СтрНайти(StrFind) – найти подстроку в строке (без учета регистра).

ВРег(Upper) – преобразует все символы строки в верхний регистр.

НРег(Lower) – преобразует все символы строки в нижний регистр.

СтрЗаменить(StrReplace) – заменяет все вхождения подстроки на другую подстроку (без учета регистра).

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

ИсходнаяСтрока – строка, содержащая строки на разных языках (например, "ru = 'Добрый вечер!'; en = 'Good Evening!'").

КодЯзыка (необязательный) – строка с кодом языка, на котором нужно получать строку. Если не указан - строка получается на языке текущего пользователя.

Язык выражений СКД

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"); // Получаем схему компоновки данных

СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = ""; // Очищаем запрос в наборе данных

ДокументыКонфигурации = Метаданные.Документы; // Получаем коллекцию метаданных документов

КоличествоДокументов = ДокументыКонфигурации.Количество(); // Определяем общее количество документов в конфигурации

Сч = 1;
ТекстЗапроса = "";
Для Каждого Док Из ДокументыКонфигурации Цикл
ТекстЗапроса = ТекстЗапроса + // Для каждого документа формируем текст запроса к его таблице

"ВЫБРАТЬ
| Док.Номер КАК Номер,
| Док.Дата КАК Дата,
| Док.Проведен КАК Проведен
|ИЗ
| Документ."+Док.Имя+" КАК Док"; // В текст запроса нам необходимо лишь подставить имя таблицы документа в дереве метаданных

Если Сч < КоличествоДокументов Тогда // Если документ не последний в коллекции - добавляем инструкцию "ОБЪЕДИНИТЬ ВСЕ" для

ТекстЗапроса = ТекстЗапроса + // объединения результатов запросов по документам в единый список

"
|ОБЪЕДИНИТЬ ВСЕ
|";
КонецЕсли;
Сч = Сч + 1;
КонецЦикла;
СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = ТекстЗапроса;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Компоновщик Настроек.ПолучитьНастройки(),ДанныеРасшифровки);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ,ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры

Читайте также: