При работе с Системой Компоновки Данных (СКД) в 1С:Предприятии, особенно когда запросы формируются программно, часто возникает необходимость вывести в отчет поля, которые были добавлены в схему компоновки данных. Также разработчики сталкиваются с задачей корректного отображения множества реквизитов одного объекта в разных колонках, при этом сохраняя интерактивность перехода по ссылке на сам объект. Давайте разберем эти задачи по шагам, используя опыт коллег и обширные возможности СКД.
Исходная проблема, с которой столкнулся автор темы, заключалась в том, что после программного добавления нового поля в текст запроса СКД и внесения предварительных правок в настройки, это поле появлялось в пользовательском режиме настроек отчета, но по каким-то причинам не выводилось в итоговый результат. Выясним причину такого поведения и рассмотрим детальное решение.
Когда запрос СКД создается программно, критически важно понимать, что одного лишь добавления поля в текст запроса недостаточно. Необходимо также программно описать это поле в самой схеме компоновки данных. Объект СхемаКомпоновкиДанных является основой любого отчета СКД. Именно в нем описываются наборы данных, их поля, доступные ресурсы (поля итогов) и параметры. Если поле добавлено только в текст запроса, но не присутствует в коллекции НаборыДанных.Поля соответствующего набора данных в схеме, СКД просто не будет знать о его существовании как о доступном элементе для вывода и настройки.
Для корректного программного добавления поля в набор данных мы используем объект ПолеНабораДанныхСхемыКомпоновкиДанных. Предположим, у нас есть программно сформированная схема компоновки данных и набор данных с определенным именем (например, "ОсновнойНаборДанных"). Тогда код для добавления нового поля может выглядеть следующим образом:
// Предположим, что СхемаКомпоновкиДанных уже программно загружена или создана,
// а также существует набор данных с именем "ОсновнойНаборДанных".
// Получаем доступ к нужному набору данных:
НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Получить("ОсновнойНаборДанных");
Если НаборДанных <> Неопределено Тогда
// Создаем новый объект поля для набора данных:
НовоеПоле = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
// Указываем имя поля. Оно должно точно соответствовать алиасу поля в тексте запроса.
НовоеПоле.Имя = "МоеНовоеПоле";
// Заголовок поля, который будет отображаться в пользовательских настройках отчета.
НовоеПоле.Заголовок = "Мое новое поле в отчете";
// Путь к данным, обычно совпадает с именем поля, если это простое поле.
НовоеПоле.ПутьКДанным = "МоеНовоеПоле";
// Опционально можно указать тип значения поля.
// Это поможет СКД правильно интерпретировать и форматировать данные.
// Например, для числового поля:
// НовоеПоле.ТипЗначения = Новый ОписаниеТипов("Число");
// Для строкового:
// НовоеПоле.ТипЗначения = Новый ОписаниеТипов("Строка", , , , "ДлинаСтроки = 100");
// Для ссылочного:
// НовоеПоле.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Контрагенты");
// Если поле является ресурсом (требует суммирования), его также нужно добавить в коллекцию ресурсов.
// Если это простое поле для вывода, этот шаг не требуется.
// Пример добавления ресурса:
// Ресурс = СхемаКомпоновкиДанных.Ресурсы.Добавить(Тип("РесурсСхемыКомпоновкиДанных"));
// Ресурс.Поле = "МоеНовоеПоле";
// Ресурс.Выражение = "Сумма(МоеНовоеПоле)";
// Ресурс.Использование = Истина;
КонецЕсли;
// После всех программных модификаций, если схема была изменена,
// необходимо обновить компоновщик настроек или использовать новую схему.
// КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию); // Пример
После того как поле будет корректно добавлено в коллекцию Поля соответствующего набора данных в схеме, СКД начинает "видеть" это поле, и оно становится доступным для выбора и настройки в пользовательском режиме отчета. Без этого шага, даже если поле есть в запросе, СКД не будет знать, что с ним делать.
Даже если поле корректно описано в схеме СКД и запрос формируется правильно, стандартная форма настроек отчета, которая обычно встраивается непосредственно в форму отчета, может быть упрощена. Она может не отображать все доступные поля или не предоставлять полную гибкость для настройки. Именно с такой ситуацией столкнулся автор темы, и решение нашлось благодаря кнопке "Эксперт".
Когда мы работаем с отчетами СКД, особенно с теми, у которых сложная структура или программно формируемые запросы, стандартная форма настроек предоставляет только базовые опции. Для доступа ко всем возможностям СКД, таким как детальная настройка выбранных полей, тонкая настройка группировок, сортировок, параметров и условного оформления, необходимо открыть полноценный конструктор настроек СКД. Кнопка "Эксперт" в настройках сохраненного варианта отчета как раз и предоставляет такой доступ к стандартной, расширенной форме настроек СКД.
Рассмотрим пошагово, как получить доступ к этой важной функциональности:
После сохранения настроек, ваше программно добавленное поле должно корректно отобразиться в отчете. Понимание того, что "Эксперт" дает доступ к тому же функционалу, что и конструктор настроек СКД в конфигураторе (но уже на уровне пользователя и для конкретного варианта отчета), является ключевым для гибкой настройки сложных отчетов.
Второй сложный момент, с которым столкнулся автор в процессе доработки отчета, — это ситуация, когда необходимо вывести несколько реквизитов одного ссылочного объекта (например, ИНН, Наименование и другие поля "Покупателя") в разные колонки отчета. При этом важно сохранить возможность интерактивного перехода по ссылке на сам объект ("Покупатель") из ячейки отчета. Это довольно распространенная задача в СКД, и существует несколько подходов к ее решению. Давайте рассмотрим их подробно.
Одним из первых и наиболее простых шагов для решения проблемы схлопывания реквизитов объекта в одну колонку является настройка параметра "Расположение реквизитов". Этот параметр указывает СКД, как следует обрабатывать и отображать реквизиты составных типов или ссылочных полей, когда они выбраны для вывода в отчет.
Чтобы воспользоваться этой настройкой, выполните следующие действия:
При установке значения "Отдельно" СКД будет стараться выводить реквизиты объекта (если они выбраны в отчет, например, Покупатель.Наименование, Покупатель.ИНН) в отдельные колонки, а не объединять их в одну общую колонку с представлением объекта. Однако, важно понимать, что этот способ может не всегда полностью сохранять интерактивную ссылку на сам объект, если вы выбираете для вывода только отдельные реквизиты (например, только Покупатель.Наименование). СКД по умолчанию делает интерактивным само поле-ссылку (например, поле Покупатель без указания конкретного реквизита).
Если вы просто добавите Покупатель.Наименование и Покупатель.ИНН в выбранные поля, даже с параметром "Расположение реквизитов = Отдельно", сами эти ячейки не будут кликабельны для перехода на карточку "Покупателя". Они будут содержать только текстовое или числовое значение. Для сохранения интерактивности с отдельными колонками требуются более сложные подходы, такие как макеты или вычисляемые поля с расшифровкой.
Самый простой и очевидный способ вывести ИНН, Наименование и другие поля объекта в разные колонки — это явно указать каждый из этих реквизитов в списке выбранных полей отчета. Этот метод гарантирует, что каждый реквизит займет свою собственную колонку.
Чтобы реализовать этот подход:
Покупатель.Наименование (для вывода наименования контрагента)Покупатель.ИНН (для вывода идентификационного номера налогоплательщика)Покупатель.Код (или любой другой необходимый реквизит, такой как Покупатель.ПолноеНаименование)Этот подход успешно выводит каждый реквизит в отдельную колонку. Однако, как верно заметил автор, при таком способе вы потеряете возможность интерактивного перехода на карточку контрагента по клику на ячейку. Ячейки, содержащие `Покупатель.Наименование` или `Покупатель.ИНН`, будут отображать только текст или число и не будут являться гиперссылкой на сам объект "Покупатель". Это происходит потому, что СКД не связывает эти отдельные значения с исходным ссылочным объектом для расшифровки.
Если ваша задача — сохранить возможность интерактивного перехода на объект, но при этом отображать в колонке произвольное выражение (например, сочетание нескольких реквизитов или просто более полное наименование), то можно использовать свойство "Выражение представления". Этот метод позволяет настроить отображаемый текст, при этом сохраняя функциональность расшифровки для всего поля.
Последовательность действий будет следующей:
Покупатель. Именно это поле будет отвечать за возможность перехода по ссылке.
Покупатель.Наименование + " (ИНН: " + Покупатель.ИНН + ")"
Или, если вы хотите более полное наименование (также существует способ собрать значения колонки из нескольких строк для компактного вывода):
ВЫБОР КОГДА НЕ Покупатель.НаименованиеПолное ЕСТЬ NULL ТОГДА Покупатель.НаименованиеПолное ИНАЧЕ Покупатель.Наименование КОНЕЦ
В этом случае, в одной колонке отчета будет выводиться текст, сформированный по вашему выражению (например, "ООО Ромашка (ИНН: 1234567890)"). При этом, при клике на любую ячейку этой колонки, будет открываться карточка объекта "Покупатель". Однако, как и в предыдущих методах, все реквизиты будут объединены в одну ячейку, а не разделены по разным колонкам. Если вам нужны именно отдельные колонки с сохранением интерактивности, этот метод не решит проблему полностью, но он очень полезен для форматирования представления одной колонки.
Наиболее мощный и гибкий способ решить проблему вывода нескольких реквизитов объекта в разные "колонки" (или, точнее, ячейки, имитирующие колонки внутри одной логической колонки отчета) с сохранением интерактивности — это использование макетов для поля. Макеты в СКД позволяют полностью контролировать форматирование и содержимое ячеек отчета, а также определять поведение расшифровки.
Мы можем создать макет для поля Покупатель, в котором явно укажем, как должны располагаться его реквизиты (например, ИНН, Наименование) и какая часть макета будет отвечать за расшифровку (переход по ссылке). Это позволит СКД использовать ваш кастомный шаблон отображения, но сохранять исходную ссылочную природу поля для интерактивности.
Последовательность действий для создания макета поля:
СхемаКомпоновкиДанных и модифицировать его. Также, воспользуйтесь кнопкой "Эксперт" в пользовательском режиме и затем перейдите в конструктор макетов (обычно это отдельная вкладка или кнопка в расширенных настройках).
| [ПредставлениеПокупателя] | [ИННПокупателя] | [ДополнительныйРеквизитПокупателя] |
Для каждой такой ячейки в конструкторе макета необходимо настроить следующие свойства:
ПредставлениеПокупателя, для второй — ИННПокупателя, и так далее. Имена параметров могут быть произвольными, но должны быть уникальными внутри макета.Покупатель, откройте его свойства.ПредставлениеПокупателя, ИННПокупателя) с реальными реквизитами объекта, которые вы хотите в них выводить:
ПредставлениеПокупателя = Покупатель.НаименованиеИННПокупателя = Покупатель.ИННДополнительныйРеквизитПокупателя = Покупатель.ДополнительноеПолеТаким образом, СКД будет использовать ваш макет для вывода значения поля Покупатель. Макет позволит вам отображать его реквизиты в отдельных ячейках, которые визуально будут выглядеть как отдельные колонки внутри одной логической колонки отчета (или даже как набор из нескольких колонок, если вы построите группировку и макет соответствующим образом), но при этом сохранит возможность перехода по ссылке на объект, указанный в свойстве "Расшифровка" макета. Этот метод требует более глубокого понимания работы с макетами, но предоставляет максимальный контроль над отображением и интерактивностью.
Автор упомянул еще одну интересную ситуацию: когда дополнительный реквизит выводится в отчете, хотя он явно не упоминается в тексте запроса. Это распространенное явление, связанное с тем, как 1С:Предприятие работает с механизмом дополнительных реквизитов и сведений (характеристик). СКД имеет специальные механизмы для интеграции таких полей.
СКД обладает встроенным механизмом для работы с дополнительными реквизитами, который позволяет включать их в отчеты без явного добавления в основной запрос. Этот механизм реализован через вкладку "Характеристики" в схеме компоновки данных. Он используется, когда в конфигурации применяется подсистема "Дополнительные реквизиты и сведения" для хранения пользовательских свойств объектов.
Чтобы понять, как это работает, рассмотрим следующие шаги:
СхемаКомпоновкиДанных.Покупатель, Номенклатура, Документ).Если эта вкладка заполнена и настроена правильно, СКД автоматически может подтянуть необходимые данные из регистра сведений "ДополнительныеРеквизитыИСведения" или аналогичного (например, РегистрСведений.ЗначенияСвойствОбъектов), даже если они не указаны в основном запросе. СКД сама формирует необходимые соединения и выбирает данные. Это позволяет создавать очень гибкие отчеты, которые могут выводить произвольные дополнительные реквизиты, заданные пользователем в режиме 1С:Предприятия без переработки запроса отчета.
Пример программного добавления характеристики в схему:
// Предполагаем, что есть набор данных "ОсновнойНаборДанных" и поле "Объект"
Характеристика = СхемаКомпоновкиДанных.Характеристики.Добавить(Тип("ХарактеристикаСхемыКомпоновкиДанных"));
Характеристика.ПолеОбъекта = "Объект";
Характеристика.Использование = Истина;
Характеристика.ТипХарактеристик = Новый ОписаниеТипов("СправочникСсылка.ВидыДополнительныхРеквизитов"); // Или другой справочник характеристик
Характеристика.ИмяТаблицыХарактеристик = "РегистрСведений.ДополнительныеРеквизитыИСведения"; // Таблица хранения значений
// После этого в выбранных полях СКД появятся виртуальные поля,
// которые можно выбирать, например "Объект.ИмяДопРеквизита".
Если речь идет о программной работе с дополнительными реквизитами на форме отчета (например, для динамического добавления их в выбранные поля или в параметры отчета), то мы можем использовать служебный реквизит Свойства_ОписаниеДополнительныхРеквизитов или методы глобального контекста для получения метаданных о дополнительных реквизитах. Этот механизм позволяет динамически получать список всех дополнительных реквизитов объекта и сведения о них, позволяя программно обращаться к ним по имени.
Пример получения списка дополнительных реквизитов для типа объекта:
// Предположим, мы хотим получить описание доп. реквизитов для справочника "Контрагенты"
ТипОбъектаМетаданных = Метаданные.Справочники.Контрагенты;
// Используем стандартную функцию платформы для получения описания
ОписаниеДопРеквизитов = ДополнительныеРеквизитыИСведения.ПолучитьОписаниеДополнительныхРеквизитов(ТипОбъектаМетаданных);
Для Каждого ОписаниеРеквизита Из ОписаниеДопРеквизитов Цикл
Сообщить("Имя доп. реквизита: " + ОписаниеРеквизита.Имя);
Сообщить("Заголовок: " + ОписаниеРеквизита.Заголовок);
Сообщить("Тип значения: " + ОписаниеРеквизита.ТипЗначения.ТипыСтрокой());
// И другие полезные свойства, такие как:
// ОписаниеРеквизита.ИмяПредопределенногоЗначения;
// ОписаниеРеквизита.ЭтоДополнительныйРеквизит;
// ОписаниеРеквизита.ЭтоДополнительноеСведение;
КонецЦикла;
Используя эту информацию, вы можете программно добавлять вычисляемые поля в схему СКД, модифицировать текст запроса, чтобы включить нужные дополнительные реквизиты, или динамически формировать элементы формы для выбора дополнительных реквизитов пользователем.
Другой подход к включению дополнительных реквизитов в отчет, особенно если механизм "Характеристики" не используется или не настроен, — это использование вычисляемых полей в СКД или программное изменение текста запроса для включения необходимых данных. Если данные о дополнительных реквизитах хранятся в отдельных таблицах (например, в регистрах сведений), вы можете присоединить их к основному запросу.
РегистрСведений.ЗначенияСвойствОбъектов в старых конфигурациях).
ВЫБРАТЬ
Контрагенты.Ссылка КАК Контрагент,
Контрагенты.Наименование,
ДопСведения.Значение КАК ДополнительныйРеквизитИНН // Алиас для доп. реквизита
ИЗ
Справочник.Контрагенты КАК Контрагенты
// Левое соединение, чтобы получить контрагентов даже без доп. реквизитов
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеРеквизитыИСведения КАК ДопСведения
ПО ДопСведения.Объект = Контрагенты.Ссылка
И ДопСведения.Свойство = &ВидДопРеквизитаИНН // Параметр, содержащий ссылку на нужный вид реквизита
ГДЕ
Контрагенты.ПометкаУдаления = ЛОЖЬ
Здесь &ВидДопРеквизитаИНН будет параметром запроса, который должен быть установлен программно или пользователем и содержать ссылку на конкретный элемент справочника "ВидыДополнительныхРеквизитов", соответствующий, например, ИНН. Важно добавить эти параметры в коллекцию ПараметрыДанных схемы СКД.
// Пример вычисляемого поля, если есть функция для получения доп. реквизита
// Имя поля: ДополнительныйИНН
// Выражение: ВычислитьДополнительныйРеквизит(Контрагент, "ИНН")
Функция ВычислитьДополнительныйРеквизит должна быть реализована в общем модуле и быть доступна для вызова из СКД. Это может быть полезно, когда нельзя напрямую объединить таблицы в запросе или нужно сложное условие для получения доп. реквизита.
Важно помнить, что если вы используете левые соединения для получения дополнительных реквизитов, значения могут быть NULL, если реквизит не заполнен для данного объекта. В таком случае, используйте функцию ЕСТЬNULL в запросе для корректного отображения, например, ЕСТЬNULL(ДопСведения.Значение, ""), чтобы пустые значения отображались как пустая строка, а не как "NULL".
Система Компоновки Данных — это чрезвычайно мощный и гибкий инструмент для создания самых разнообразных отчетов в 1С:Предприятии. Понимание его основных принципов помогает разработчику эффективно решать широкий круг задач и создавать отчеты, которые легко адаптируются под меняющиеся требования бизнеса. Давайте кратко подытожим основные аспекты СКД:
Помните, что гибкость СКД означает и необходимость глубокого понимания ее механизмов. Когда стандартные средства не помогают, всегда есть возможность обратиться к более низкоуровневым настройкам через режим "Эксперт" или программно управлять схемой и настройками компоновки данных, чтобы добиться нужного результата. Развивая эти навыки, вы сможете создавать действительно мощные и адаптивные отчеты в 1С:Предприятии.