Схема данных 1с как сделать

Обновлено: 05.07.2024

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

Немного о СКД

СКД — система компоновки данных. Появился этот инструмент в 1С 8.2. Чаще всего этот инструмент используется для быстрого построения отчетов практически без применения программирования. Но есть у СКД и другое применение — обработка произвольных наборов данных заранее не известной структуры.

Например найти документы по любому реквизиту в базе. Как это сделать? Для начала необходимо получить список объектов метаданных из базы, а затем построить запрос, который выберет документы с указанным отбором. Сказать проще, чем сделать. Описывать все возможные отборы вручную крайне трудно, поскольку сложно предсказать, какие реквизиты присутствуют у документа и по каким из них построить отбор. Возможно собрать текст запроса с использованием перебора реквизитов метаданных, но возникает другая проблема: построение условий по параметрам, что задает пользователь. Мы знаем, что фантазия пользователя безгранична и, порой, идет неожиданными путями. Как же быть в этом случае? Ответ прост — использовать СКД для построения настроек отбора и сборки результата в нужном виде.

От теории к практике

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

ФормаОтбора.jpg

Решить эту проблему можно с использованием системы компоновки данных. Для этого создаем отдельную форму, на которой размещаем элементы настройки отбораНа картинке видно, что на форме присутствуют следующие реквизиты: АдресСКД — строка, в которой сохраняется адрес временного хранилища настроек СКД, НастройкиОтбора — КомпоновщикНастроекКомпоновкиДанных — собственно настройки СКД , ПолноеИмяОбъекта — строка с полным именем объекта обработки (например: Справочник.Контрагенты).

Цифрой 1 обозначена таблица из НастройкиОтбора.Настройки.Отбор.ДоступныеПоляОтбора

Цифрой 2 обозначена таблица из НастройкиОтбора.Настройки.Отбор

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

Перейдем теперь к самой схеме компоновки.

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

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

Следующим шагом будет создание компоновщика настроек для нашей СКД:

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

Теперь готовим Компоновщик макета СКД:

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

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

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

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

ВНИМАНИЕ: все приведенные листинги написаны на 8.1.

Раз в СКД в качестве источника данных выступает объект – произвольная таблица значений, следовательно, в отчете надо эту таблицу значений создать и заполнить. Таблица значений произвольная: данные в нее могут попадать из любых источников и произвольным образом (из запросов, таблиц базы данных), могут быть расчетные поля и т.д.

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

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

Затем, ОБЯЗАТЕЛЬНО, необходимо указать имя объекта, содержащего данные. Имя объекта МОЖЕТ НЕ СОВПАДАТЬ с именем таблицы значений с данными, которую мы уже создали в отчете (см. п. 1).

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

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

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

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

Вызов отчета

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

Настройка расшифровки

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

Настройки отчета

Вместо заключения

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


Схема компоновки данных (СКД) в 1С 8.3 - это механизм создания отчетов со сложно структурированной информацией (настройки, детализация и свертка, группировка и отборы, результирующие формы) на основе их декларативного описания. Архитектура: настройка, сама СКД, макет, результат, форма данных (например, таблица). Главной особенностью применения СКД это автоматическая генерация выходной формы и создание отчета без написания кода. Процессом построения отчета можно управлять программно, а непосредственно само исполнение отчета разбивать по этапам. При разработке и отладке удобно использовать КонсольСистемыКомпоновкиДанных.erf , которая позволяет в формате XML выводить промежуточные результаты запросов и анализировать отдельные составляющие СКД.


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

// Заполнение основных данных СКД
ИсточникДанных = Схема . ИсточникиДанных . Добавить ();
ИсточникДанных . ТипИсточникаДанных = "Local" ;
ИсточникДанных . Имя = "ИсточникДанных" ;

Если ( ТипЗнч ( НаборДанных ) = Тип ( "Строка" )) или ( ТипЗнч ( НаборДанных ) = Тип ( "Запрос" )) Тогда
ТекНаборДанных = Схема . НаборыДанных . Добавить ( Тип ( "НаборДанныхЗапросСхемыКомпоновкиДанных" ));
ТекНаборДанных . Имя = "ОсновнойНабор" ;
ТекНаборДанных . Запрос = ?( ТипЗнч ( НаборДанных ) = Тип ( "Строка" ), НаборДанных , НаборДанных . Текст );
ТекНаборДанных . ИсточникДанных = "ИсточникДанных" ;
ТипНабора = "Запрос" ;
ТекНаборДанных . АвтоЗаполнениеДоступныхПолей = АвтоЗаполнениеДоступныхПолей ;
ИначеЕсли ( ТипЗнч ( НаборДанных ) = Тип ( "ТаблицаЗначений" )) или ( ТипЗнч ( НаборДанных ) = Тип ( "ДеревоЗначений" )) Тогда
ТекНаборДанных = Схема . НаборыДанных . Добавить ( Тип ( "НаборДанныхОбъектСхемыКомпоновкиДанных" ));
ТекНаборДанных . Имя = "ОсновнойНабор" ;
ТекНаборДанных . ИмяОбъекта = "ТаблицаИсточник" ;
ТекНаборДанных . ИсточникДанных = "ИсточникДанных" ;
ТипНабора = "Объект" ;
Иначе
Возврат Неопределено;
КонецЕсли;

// Создание структуры СКД
НастройкиСКД = Схема . НастройкиПоУмолчанию ;

// Группировка, записи и автополе СКД
ГруппировкаСКД = НастройкиСКД . Структура . Добавить ( Тип ( "ГруппировкаКомпоновкиДанных" ));
ГруппировкаСКД . Использование = Истина;

АвтоПоле = ГруппировкаСКД . Выбор . Элементы . Добавить ( Тип ( "АвтоВыбранноеПолеКомпоновкиДанных" ));
АвтоПоле . Использование = Истина;

КолонкиТЗ = Новый ТаблицаЗначений ;
КолонкиТЗ . Колонки . Добавить ( "Имя" );
КолонкиТЗ . Колонки . Добавить ( "ТипЗначения" );
КолонкиТЗ . Колонки . Добавить ( "Заголовок" );

Если ТипНабора = "Запрос" Тогда

ПостроительСКД = Новый ПостроительЗапроса ;
Если ТипЗнч ( НаборДанных ) = Тип ( "Строка" ) Тогда
ПостроительСКД . Текст = СокрЛП ( НаборДанных );
Иначе
ПостроительСКД . Текст = СокрЛП ( НаборДанных . Текст );
КонецЕсли;
ПостроительСКД . ЗаполнитьНастройки ();

Для Каждого ВыбранноеПоле Из ПостроительСКД . ВыбранныеПоля Цикл
НовКолонка = КолонкиТЗ . Добавить ();
НовКолонка . Имя = ВыбранноеПоле . Имя ;
НовКолонка . ТипЗначения = ПостроительСКД . ДоступныеПоля [ ВыбранноеПоле . ПутьКДанным ]. ТипЗначения ;
НовКолонка . Заголовок = ВыбранноеПоле . Представление
КонецЦикла;

ИначеЕсли ТипНабора = "Объект" Тогда

Для Каждого Колонка Из НаборДанных . Колонки Цикл
НовКолонка = КолонкиТЗ . Добавить ();
НовКолонка . Имя = Колонка . Имя ;
НовКолонка . ТипЗначения = Колонка . ТипЗначения ;
НовКолонка . Заголовок = Колонка . Имя ;
КонецЦикла;

// Добавление ресурсов СКД
Если ТипЗнч ( СтруктураРесурсов ) = Тип ( "Структура" ) Тогда
Для Каждого ЭлСтруктуры Из СтруктураРесурсов Цикл
// Проверка, а существует ли поле ресурса среди полей набора
Если КолонкиТЗ . Найти ( ЭлСтруктуры . Ключ ) <> Неопределено Тогда
// Проверка на правильность указания агрегатной функции
Если ( ЭлСтруктуры . Значение = "Сумма" )
ИЛИ ( ЭлСтруктуры . Значение = "Среднее" )
ИЛИ ( ЭлСтруктуры . Значение = "Максимум" )
ИЛИ ( ЭлСтруктуры . Значение = "Минимум" )
ИЛИ ( ЭлСтруктуры . Значение = "Количество" ) Тогда

ПолеРесурса = Схема . ПоляИтога . Добавить ();
ПолеРесурса . ПутьКДанным = ЭлСтруктуры . Ключ ;
ПолеРесурса . Выражение = ЭлСтруктуры . Значение + "(" + ЭлСтруктуры . Ключ + ")" ;
ИначеЕсли ЭлСтруктуры . Значение = "КоличествоРазличные" Тогда
ПолеРесурса = Схема . ПоляИтога . Добавить ();
ПолеРесурса . ПутьКДанным = ЭлСтруктуры . Ключ ;
ПолеРесурса . Выражение = "Количество(Различные " + ЭлСтруктуры . Ключ + ")" ;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;

// Добавление полей в набор СКД
Для каждого НовКолонка Из КолонкиТЗ Цикл
ПолеНабораСКД = ТекНаборДанных . Поля . Добавить ( Тип ( "ПолеНабораДанныхСхемыКомпоновкиДанных" ));
ПолеНабораСКД . Заголовок = СокрЛП ( НовКолонка . Заголовок );
ПолеНабораСКД . Поле = СокрЛП ( НовКолонка . Имя );
ПолеНабораСКД . ПутьКДанным = СокрЛП ( НовКолонка . Имя );

// Удаление "Неопределено" и "NULL"
Массив = Новый Массив ;
Для каждого ТекущийТип Из НовКолонка . ТипЗначения . Типы () Цикл
Если ( ТекущийТип = Тип ( "Неопределено" )) или ( ТекущийТип = Тип ( "NULL" ))
или ( ТекущийТип = Неопределено) или ( ТекущийТип = Null) Тогда
Продолжить;
КонецЕсли;
Массив . Добавить ( ТекущийТип );
КонецЦикла;
ПолеНабораСКД . ТипЗначения = Новый ОписаниеТипов ( Массив , НовКолонка . ТипЗначения . КвалификаторыЧисла ,
НовКолонка . ТипЗначения . КвалификаторыСтроки , НовКолонка . ТипЗначения . КвалификаторыДаты );

ВыбранноеПолеКомпоновкиДанных = НастройкиСКД . Выбор . Элементы . Добавить ( Тип ( "ВыбранноеПолеКомпоновкиДанных" ));
ВыбранноеПолеКомпоновкиДанных . Поле = Новый ПолеКомпоновкиДанных ( ПолеНабораСКД . ПутьКДанным );
ВыбранноеПолеКомпоновкиДанных . Использование = Истина;
КонецЦикла;

// Оформление СКД
Если Не ПустаяСтрока ( ИмяМакета ) Тогда
МОф = НастройкиСКД . ПараметрыВывода . НайтиЗначениеПараметра (Новый ПараметрКомпоновкиДанных ( "МакетОформления" ));
ЗначениеПараметраВывода = МОф ;
ЗначениеПараметраВывода . Значение = ИмяМакета ;
ЗначениеПараметраВывода . Использование = Истина;
КонецЕсли;

Сергей Лунев

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

Создание отчета в 1С через СКД

Процесс разработки отчета при помощи СКД можно разделить на следующие этапы:

  1. Создание запроса. Запрос можно написать вручную или обойтись без программного кода, воспользовавшись удобным интерфейсом;
  2. Настройка отчета. Выбираются поля, итоги, группировки, параметры, оформление отчета;
  3. После этого нам останется лишь подключить получившийся отчет в конфигурацию любым доступным способом.

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

Рассмотрим пример создания внешнего отчета на СКД:

Рис.1 Пример создания внешнего отчета на СКД

Рис.1 Пример создания внешнего отчета на СКД

Рис.2 Создание запроса

Рис.2 Создание запроса

Рис.3 Составление простейшего запроса

Рис.3 Составление простейшего запроса

  • Указать заголовок;
  • Выбрать доступный тип значения;
  • Изменить формат;
  • Выразить одно поле через другое (заменить ссылку на номер документа, что более компактно);
  • Выделить шрифтом или цветом.

Рис.4 Работа с полями

Рис.4 Работа с полями

Рис.5 Выбрать поля для вывода на экран

Рис.5 Выбрать поля для вывода на экран

Рис.6 Настройка закончена

Рис.6 Настройка закончена

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

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


Возможности СКД

Рис.7 Возможности доработок со стороны пользователей

Рис.7 Возможности доработок со стороны пользователей

Рис.8 Редактирование полей

Рис.8 Редактирование полей

Рис.9 Выбираем значения

Рис.9 Выбираем значения

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

Рис.10 Окно изменения вариантов отчета

Рис.10 Окно изменения вариантов отчета

  1. Наборы данных – здесь перечислены все запросы, участвующие в формировании отчета;
  2. Связи наборов данных – используется для построения связи между различными запросами с первой вкладки;
  3. Вычисляемые поля – перечень добавленных полей не из запроса. Чаще всего используется в случаях, когда на основании значений нескольких полей из запроса нужно получить 1 значение;
  4. Ресурсы. В 1С так называются поля, по которым необходимо знать итоги. Ресурсы поддерживают различные арифметические операции – сумму, количество, максимум и другие;
  5. Параметры. Используются, если для формирования отчета необходимо, чтобы пользователь ввел определенные данные – дату, подразделений или номенклатуру, например;
  6. Макеты. Предназначены для тех случаев, когда пользователи хотят увидеть уникально оформленный отчет. Создать отдельное место для подписей или новую верхнюю часть отчета – все это можно здесь;
  7. Вложенные схемы. Они необходимы, когда ваш отчет должен содержать данные других отчетов;
  8. Настройки. В разделе объявляются выводимые поля, группировки, настраивается внешний вид отчета.

Рис.11 Функционал для разработчиков

Рис.11 Функционал для разработчиков

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

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

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