Произвольный макет в СКД
Делал недавно отчет с неопределенным количеством колонок. Возиться с кодом было неохота, решил сделать на СКД. С этим проблема не возникла, необходимо было натянуть результат на произвольный макет (свой заголовок + период). Покажу на примере по шагам, с чем столкнулся и как решил.
Первоначальную настройку схемы СКД описывать не буду, начнем с того, что мне надо было сделать произвольный заголовок. В нашем случае, формируем представление периода отчета.
Добавляем новый параметр "ПредставлениеПериода", тип Строка.
Теперь добавляем новое поле группировки, поля группировок не выбираем (Детальные записи), удаляем поле "Авто", переносим наш параметр.
Переходим на вкладку "Макет", рисуем шапку. Добавляем Заголовок группировки. Мы можем использовать Имя группировки, если заранее задали его в схеме компоновки, или выбрать из доступных полей. После этого определяем область в табличном документе. Далее, прописываем наш параметр на макете, потом необходимо будет установить в свойствах этой ячейки свойство "Заполнение" — "Параметр". И в окне параметров макета связать наш параметр с параметром СКД.
Теперь немного кода. Создаем форму отчета. Отключаем видимость у Основной Командной Панели и Компоновщика Настроек. Создаем нашу команду "Сформировать", реквизит формы "Дата", перетаскиваем все это на форму. Пишем код в модуле формы:
После этого, если все правильно сделали, результат отчета должен выглядеть вот так:
Теперь попробуем сделать полностью свой произвольный макет на СКД .
Здесь самое главное понять структуру областей макета в СКД. Разберем пример с неопределенным количеством колонок.
Заготовка для отчета выглядит так:
Пример результата:
Теперь создаем свой макет:
1. Добавляем шапку по аналогии с прошлым примером. Устанавливаем макет оформления "Без оформления". Итоги по номенклатуре выводить не будем, поэтому ставим у таблицы настройку "Расположение общих итогов по горизонтали" — "Нет".
2. Теперь создаем макет, прописываем параметры, настраиваем дополнительные свойства ячеек. Например, для номенклатуры можно выставить в свойстве "Размещение текста" значение "Переносить" вместо "Авто", а так же указать параметры расшифровки.
3. Теперь самое интересное, назначаем области. Структура областей будет выглядеть таким образом:
Начинаем создавать области, параметры при этом будут автоматически сопоставляться по именам. В итоге должно получиться следующее:
Проверяем отчет, должно получиться следующее:
4. Пишем код по аналогии с прошлым примером:
Код 1C v 8.2 УП
В итоге у нас получается следующее:
Кстати, при последующем открытии отчета, вы увидите, что компоновка перестроила макет по-своему.
Это вполне нормально, не стоит беспокоиться.
Создание макета в скд 1с 8.3. Работа с фиксированным макетом в скд
Данная статья будет полезна тем программистам, которые уже разрабатывали отчеты на системе компоновки данных , но не пользовались встроенным механизмом задания макетов.
При разработке отчетов иногда необходимо использовать не стандартный заголовок, или нужно добавить подписи. В статье рассмотрено два варианта:
- Встроенный механизм задания макетов непосредственно в СКД
- 2. Дополнение результата СКД в коде, с помощью обычных макетов.
Предположим, у нас уже есть отчет на компоновке данных, который выглядит следующим образом.
Нам необходимо добавить заголовок и подпись, чтобы отчет выглядел так:
Вариант 1 . Можно воспользоваться механизмом разработки макетов непосредственно в СКД .
Сначала нам нужно добавить группировки и задать им имена в дереве группировок. Добавим одну группировку перед основной группировкой отчёта, и установим ей имя «Шапка ». Вторую группировку добавим в конец, и зададим ей имя «Подвал ».
Далее, на вкладке макеты необходимо добавить два макета группировки и задать для них области. Если области достаточно сложные (например, часть ячеек объединены в одну), то их можно сделать в обычном макете и перенести сюда с помощью механизма «копировать, вставить». Здесь же, можно передать параметры.
На вкладке настройки для группировок «Шапка» и «Подвал» нужно отключить «основной» макет оформления, выбрав значение «без оформления». Если этого не сделать, то ячейки наших группировок будут в рамочке.
Так же для наших группировок необходимо отключить выбранные поля.
Примечание . Подобный вариант отчета, возможно разработать использую только СКД . Такой отчет будет работать как на обычном приложении, так и на управляемом.
Вариант 2. C использованием результата СКД и обычных макетов (рассмотрен вариант для обычного приложения)
Добавим в отчет обычный макет.
Зададим в нём области «Шапка и Подвал».
В модуле формы добавим код для кнопки «Сформировать», в котором сначала выведем область «Шапка», потом результат компоновки данных, затем область «Подвал».
Примечание . Для того чтобы отчет работал в управляемых приложениях необходимо модифицировать процедуру для кнопки «сформировать».
Создадим внешний отчет, который будет выводить отчетную информацию об остатках номенклатуры и её обороте. Требуемая информация запрашивается запросом с помощью набор данных типа «Запрос», который содержит текст запроса:
ВЫБРАТЬ
_ДемоНоменклатура.Ссылка КАК Номенклатура
ПОМЕСТИТЬ АктуальнаяНоменклатура
ИЗ
Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
ГДЕ
НЕ _ДемоНоменклатура.ПометкаУдаления
И НЕ _ДемоНоменклатура.ЭтоГруппа
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
АктуальнаяНоменклатура.Номенклатура,
_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.МестоХранения,
_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.КоличествоНачальныйОстаток,
_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.КоличествоКонечныйОстаток,
_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.КоличествоПриход,
_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.КоличествоРасход,
_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.КоличествоОборот
ИЗ
АктуальнаяНоменклатура КАК АктуальнаяНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления._ДемоОстаткиТоваровВМестахХранения.ОстаткиИОбороты КАК _ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты
ПО АктуальнаяНоменклатура.Номенклатура = _ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.Номенклатура
В итоге отчет содержит следующие поля (см. рисунок 1):
Так как информация берется из виртуальной таблицы «ОстаткиИОбороты», то СКД автоматически создает два параметра данных НачалоПериода и КонецПериода, которые необходимы для задания пределов периода выборки данных. Я предпочитаю с такими параметрами не работать напрямую, а задавать их значения через другой параметр, который будет доступен пользователю для редактирования (см. рисунок 2).
Отчет со своей задачей справляется, но шапка отчета довольно сухая. За время работы, я нашел несколько способов оформления шапки отчета:
- Настройка заголовков полей на вкладке СКД «Наборы данных»;
- Настройка заголовков полей на вкладке СКД «Настройки»;
- Программная установка заголовков полей;
- Задание шапки отчета с помощью макета;
- Доработка результата (табличного документа);
1. Настройка заголовков на вкладке СКД «Наборы данных»
2. Настройка заголовков полей на вкладке СКД «Настройки»
Данные действия можно производить и в режиме 1С:Предприятия, открыв настройки отчета, НО, в состав настроек отчета должен быть включен пункт «Выбранные поля» (см. рисунок 8).
На этом легкая часть по настройке шапки отчета закончена. Из плюсов выше перечисленных действий: вся настройка выполняется стандартными средствами. Из минусов: отсутствие возможности задания многострочного заголовка поля.
3. Программная установка заголовков полей
Для этого в модуле отчета определим процедуру ПриКомпоновкеРезультата . В этой процедуре напишем код по заданию заголовка полей.
// 1. Получаем пользовательские настройки.
НастройкиКД = ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();
// 2. Получаем значение параметра «Период» из которого определяем дату начала и окончания периода.
ПараметрПериод = Новый ПараметрКомпоновкиДанных(«Период»);
Период = НастройкиКД.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрПериод).Значение;
НачалоПериода = Период.ДатаНачала;
КонецПериода = Период.ДатаОкончания;
// 3. Подготовим информацию о переопределении заголовка полей. Для этого, создадим
// массив, который будет содержать информацию: ИмяПоля — значения свойства «Путь» в
// наборе данных (см. рисунок 1), Заголовок — текст заголовка.
СписокПолей = Новый Массив;
стрНачалоПериода = Формат(НачалоПериода, «ДФ=dd.MM.yyyy; ДП=»Пустая дата»»);
ПолеНачальныйОстаток = Новый Структура(«ИмяПоля, Заголовок», «КоличествоНачальныйОстаток», «Остаток на » + Символы.ПС + стрНачалоПериода);
СписокПолей.Добавить(ПолеНачальныйОстаток);
стрКонецПериода = Формат(КонецПериода, «ДФ=dd.MM.yyyy; ДП=»Пустая дата»»);
ПолеКонечныйОстаток = Новый Структура(«ИмяПоля, Заголовок», «КоличествоКонечныйОстаток», «Остаток на » + Символы.ПС + стрКонецПериода);
СписокПолей.Добавить(ПолеКонечныйОстаток);
// 4. Получим список полей, который находятся в группировке «Остатки» (см. рисунок 7) и
// зададим новый заголовок, обойдя элементы в цикле.
ВыбранныеПоля = НастройкиКД.Выбор.Элементы; // Первый уровень полей.
ВыбранныеПоляОстатки = ВыбранныеПоля.Элементы; // Поля группировки остатки.
Для каждого ВыбранноеПоле Из ВыбранныеПоляОстатки Цикл
Для Каждого ЭлементМассива Из СписокПолей Цикл
ПолеКомпоновки = Новый ПолеКомпоновкиДанных(ЭлементМассива.ИмяПоля);
Если ВыбранноеПоле.Поле = ПолеКомпоновки Тогда
ВыбранноеПоле.Заголовок = ЭлементМассива.Заголовок;
КонецЕсли;
КонецЦикла;
КонецЦикла;
// 5. Загрузим измененный пользовательские настройки обратно.
ЭтотОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиКД);
Результат отчета (см. рисунок 10):
Способ потяжелее, чем все выше перечисленные, но мне нравится.
4. Задание шапки отчета с помощью макета
Для более гибкой настройки внешнего вида отчета в СКД предусмотрено создание макетов. В настройках отчета создадим еще одну группировку «детальные записи» и установим имя «СтрокаДЗ» для этой группировки (см. рисунок 11).
На вкладке «Макеты» добавим макет заголовка группировки. Для макета в табличном документе создадим шапку отчета (шапка отчета должна содержать столько заголовков полей, сколько выводит полей детальная запись) и укажем область табличного документа для макета (см. рисунок 12).
В итоге отчет имеет следующего вида шапку(см. рисунок 13):
Рисунок 13. Макет СКД в качестве шапки отчета |
По моему мнению, макеты имеют один большой минус, это невозможность перестраиваться под заданную пользовательскую группировку, поэтому их следует использовать в том случае, если отчетная форма регламентированная и не может быть изменена. Попробуйте задать группировку для группировки «СтрокаДЗ» и увидите, что макет сбился.
На сайте информационно-технологического сопровождения приведена статья Использование предопределенных макетов , которая подробно описывает приемы использования макетов в СКД.
5. Доработка результата (табличного документа)
Приступим. Отключаем стандартное формирование, для этого в модуле отчета для события ПриКомпоновкеРезультата установим переменную СтандартнаяОбработка в значение Ложь и напишем собственную компоновку результата:
СтандартнаяОбработка = Ложь;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
ЭтотОбъект.СхемаКомпоновкиДанных,
ЭтотОбъект.КомпоновщикНастроек.Настройки,
ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Более подробно программная компоновка результата отчета описана в статье СКД. Программная компоновка результата.
Скомпонованный результат выводится в табличный документ — это переменная ДокументРезультат. Далее, после формирования результата и вывода его в табличный документ пишем код для замены одного текста ячейки на другой. Например, изменим в шапке отчета название группировки «Остатки» на «Остатки номенклатуры» (см. рисунок 14):
Ячейка = ДокументРезультат.НайтиТекст(«Остатки»);
Если Ячейка <> Неопределено Тогда
Ячейка.Текст = «Остатки номенклатуры»;
КонецЕсли;
Так же для найденной ячейки можно задать форматирование, см. свойства ячейки табличного документа в синтакс-помощнике.
Данный способ я обнаружил для себя недавно, он прост и позволяет очень гибко работать с шапкой отчета, главное, что бы текст ячейки имел уникальный текст.
P.S. может быть у вас в арсенале имеется еще способ оформления заголовков полей?
Наиболее сложным в применении макетов является заполнение колонки “Макет” на вкладке “Макеты” в конструкторе СКД.
В природе существует неплохая справка по этому вопросу. Она помогает понять основные принципы. Но все равно каждый раз приходится экспериментировать с разными видами макетов, чтобы понять можно ли решить конкретную задачу с помощью этого инструмента или нет. Поэтому мне пришла идея выложить результаты экспериментов в виде статьи, чтобы потом можно было к ним обращаться, и в будущем сэкономить время. Не обязательно вчитываться в текст, достаточно быстро пробежаться по скриншотам, чтобы выбрать вид макета, который больше всего подходит для решаемой задачи
В статье я немного повторю упомянутую справку, чтобы изложить некоторые важные детали более понятным и конкретным языком.
Эксперименты я проводил над отчетом следующего вида.
Макет поля
Этот макет применяется к конкретной ячейке, в отличие от макетов группировки и заголовка группировки, которые применяются к целой строке.
Его можно накладывать на поля группировки и на поля ресурсов
Макет заголовка группировки
Данный вид макета, как уже было сказано выше, применяется ко всей строке заголовка.
Если его назначить для самой верхней группировки, то он применится для всей шапки таблицы отчета. Как видно на рисунке, заголовки остальных группировок, а также заголовки ресурсов при этом скрываются. Поэтому приходится эти заголовки дорисовывать вручную. Иногда это и требуется, например для объединения ячеек в шапке
Применять этот макет для группировок второго и более нижних уровней обычно не имеет смысла, т.к. получаемый результат мало где можно применить
Однако если назначить строке макета высоту 1, то можно скрыть заголовки группировок текущего и следующего уровней. На рисунке ниже скрыты заголовки Должность и Сотрудник
Также заслуживает внимания использование типа макета Подвал, например для вывода подписантов.
Использование типов Общий итог , насколько я понял ни на что не влияют. Мне не удалось создать настройку с этими типами, чтобы она применилась
Макет группировки
Этот макет применяется ко всей строке группировки. Он может применяться для некоторых типовых задач, хотя догадаться как его использовать не просто
Если применить этот макет к самой верхней группировке с типом Заголовок, то под каждой группировкой повторяется шапка таблицы. Применять такой макет имеет смысл в тех случаях, например, когда нужно вставить разрывы страницы перед каждой группировкой
Если применить данную схему для группировки нижнего уровня, то получается вот что
Или, если дорисовать столбцы, то получится так
Если возникает задача изменить подвал с итогами, то нужно использовать этот макет с типом Общий итог подвал или Общий итог заголовок . Насколько я понял, эти два типа макета делают одно и то же
Макет ресурсов
Макет используется только для ТАБЛИЦЫ. Он применяется на пересечении группировок, указанных в настройках
Ограничения использования макетов
- Во многих случаях при использовании макетов теряется возможность настройки отчета пользователем. Он не сможет изменять порядок ресурсов и группировок, отключать ресурсы и группировки, т.к. при этом отчет принимает непонятный вид. Данный недостаток не распространяется только на макет поля.
- Нет возможности оформить с помощью макета ТОЛЬКО заголовок нужного ресурса (или группы ресурсов). Например, если нужно выровнять заголовки ресурсов по центру. Придется оформлять всю шапку таблицы полностью и получить ограничение из п.1
- Нет возможности оформить ТОЛЬКО заголовок итогов. Например, несколько раз требовалось заменить слово “Итого” на слово “Всего”. В этом случае придется отрисовывать всю строку итогов и получить ограничение из п.1 или придумывать что-нибудь другое.
Файлы
Все описанные выше примеры приложены к статье в виде файла для скачивания. Он содержит консоль СКД с набором схем (встроенным в нее). Запросы в примере не обращаются к таблицам базы данных, поэтому примеры запускаются на любой конфигурации в режиме управляемого приложения.
В
В этой статье мне хотелось бы рассказать о нюансах, с которыми я столкнулся при разработке отчета на СКД, точнее с управлением внешним видом макета отчета, и решениях, которые я применил к ним.
Я знаю, что макет в СКД можно подменить (изменить) с применением кодирования непосредственно в форме отчета, но для меня было принципиально важно произвести изменения в СКД не прибегая к кодированию.
Текст запроса в отчете был такой:
ВЫБРАТЬ Номенклатура. Наименование, Номенклатура. Код, Номенклатура. БазоваяЕдиницаИзмерения, Номенклатура. ЕдиницаИзмеренияМест, Номенклатура. ЕдиницаХраненияОстатков, Номенклатура. ЕдиницаДляОтчетов, Номенклатура. Комментарий, Номенклатура. Артикул, Номенклатура. Ссылка КАК Номенклатура ИЗ Справочник. Номенклатура КАК Номенклатура ГДЕ НЕ Номенклатура. ЭтоГруппа
Момент 1. Произвольные заголовки отчета и колонок.
По умолчанию в СКД есть возможность выводить произвольный текст заголовка. Делается это в настройках СКД:
на выходе получаем:
Но если заголовки отчета и колонок должены быть произвольными, тогда этот вариант не подходит. Поэтому я сделал следующее:
Указал имя для детальных записей:
Нарисовал нужный мне макет в СКД
Там же, на закладке «Макет», обозначил границы макета заголовка группировки:
и указал имя группировки:
затем обозначил область макета, которое нужно вывести в заголовок отчета:
Если сформировать отчет, то:
не совсем то, что хотелось получить. Для себя способ решения этой проблемы нашел такой — цвет фона и рамки области макета, которая является заголовком отчета, сделал белым:
и на выходе полуется нужный вид отчета:
Момент 2. Произвольная расшифровка полей отчета.
Задача следующая — при двойном клике по полю «Артикул» должна быть возможность открыть карточку номенклатуры, породившую эту строчку.
В отчете, приведенном выше, если выполнить двойной клик по любому полю, то не будет возможности открыть карточку номенклатуры:
Например если кликнуть по полю «Артикул», то получим следующее:
Добавляем макет поля:
указываем поле (Артикул), при клике на которое должна открываться карточка номенклатуры:
в макете, любое пустое поле заполняем текстом «Артикул», в свойствах указываем — Заполнение = «Параметр», ПараметрРасшифровки = «РасшифровкаНоменклатуры»:
и указываем это поле область макет поля:
После этого должны появиться параметры макета:
В этих парметрах указываем выражение для «РасшифровкаНоменклатуры», в моем случае это ссылка на номенклатуру:
Получаем возможность открыть карточку товара при клике по полю «Артикул»:
Думаю найдутся разработчики, которые сталкивались с подобными нюансами и решили их другими способами, но это уже другая статья.
Отчет основан на реальных событиях, внешний вид, текст запроса и имена колонок изменены в интересах статьи.
1с скд макет отчета как сделать
В конфирации Бухгалтерия предприятия 3.0 создаются 2 варианта внешнего отчета, выводящего следующие поля справочника Номенклатура:
- Номенклатурная группа (тип СправочникСсылка.НоменклатурныеГруппы);
- Вид номенклатуры (тип СправочникСсылка.ВидыНоменклатуры);
- Номенклатура (тип СправочникСсылка.Номенклатура);
- Номер ГТД (тип СправочникСсылка.НомераГТД);
В первом вариате используются отборы по номенклатурной группе и виду номенклатуры. Результат представлен на рис. 1.
Рис. 1. Результат с отбором
Во втором вариате данные выводятся с группировками по номенклатурной группе и виду номенклатуры. Результат представлен на рис. 2.
Рис. 2. Результат с группировками
В обоих случаях используется схема компоновки данных. В первом случаен вдобавок употребляется макет Номенклатура (рис. 3).
Рис. 3. Состав первого варианта отчета Номенклатура
В обоих вариантах не выводятся записи-группы справочника Номенклатура. Так же не показывается номенклатура, для которой не указана номенклатурная группа. Эти условия записываются рассматриваемым ниже конструктором запроса следующим образом:
ГДЕ
Номенклатура.ЭтоГруппа = ЛОЖЬ
И Номенклатура.НоменклатурнаяГруппа.Ссылка <> &ПустаяСсылка
Отчет с отборами
Макет отчета
В конструкторе отчета (см. рис. 3) добавим макет типа «Табличный документ» и дадим макету имя Номенклатура (рис. 4).
Рис. 4. Добавление макета отчета
Далее сформируем макет, используя приведенные на рис. 5 сведения.
Рис. 5. Макет отчета
Для вывода заголовка и отборов используем заполнение Шаблон. В строке отчета – заполнение Параметр. Для каждого параметра строки установим в окне свойств значение поля Параметр расшифровки такое же, как и значение поля Параметр (рис. 6).
Рис. 6. Параметр НоменклатурнаяГруппа
Это позволит открывать в отчете форму соответствующего справочника с данными об интересующем элементе (если Результат.Защита = Истина;).
Имена параметров совпадают с именами полей (псевдонимов) текста запроса, сформированного в ниже расматриваемой схеме компоновки данных.
Схема компоновки данных
Схема компоновки данных в первом варианте отчета используется для формирования следующего запроса к справочнику Номенклатура (приводится вариант с одним псевдонимом):
ВЫБРАТЬ
НоменклатурнаяГруппа, ВидНоменклатуры, Ссылка КАК НоменклатураСсылка, НомерГТД
ИЗ
Справочник.Номенклатура
ГДЕ
ЭтоГруппа = ЛОЖЬ
И НоменклатурнаяГруппа.Ссылка <> &ПустаяСсылка
Так же нужно задать отборы по номенклатурной группе и виду номенклатуры и установить сортировку по номенклатурной группе, виду номенклатуры и номенклатуре.
Значения отборов по номенклатурной группе и виду номенклатуры задаются в форме отчета.
Воспользуемся в конструкторе отчета (см. рис. 3) кнопкой «Открыть схему комопоновки данных» и добавим в отчет эту схему (рис. 7).
Рис. 7. Добавление схемы компоновки данных
В открывшейся схеме на вкладке «Наборы данных» добавим набор данных Запрос (ему дано имя НаборДанных) (рис. 8).
Рис. 8. Создание набора данных
Затем на той же вкладке нажимается кнопка Конструктор запроса и в открывшемся диалоге на вкладке Таблицы в ветви Справочники списка База данных выбирается справочник Номенклатура и в списке Таблицы выбираются поля НоменклатурнаяГруппа, ВидНоменклатуры, Ссылка и НомерГТД (рис. 9).
Рис. 9. Выбор полей запроса
На вкладке Условия вводим указанные на рис. 10 данные.
Рис. 10. Условия запроса
Заметим, что для задания первого условия установлен флажок Произвольное.
В результате после выхода из конструктора запроса получаем приведенный на рис. 11 текст запроса.
Рис. 11. После выхода из конструктора запроса
Поскольку для вывода данных будет употреблен рассматренный выше макет отчета, то автозаголовки не будут употреблены (заголовки столбцов будут взяты из макета).
Заметим, что в строке запроса
Номенклатура.Ссылка КАК НоменклатураСсылка
псевдоним НоменклатураСсылка поля Ссылка добавлен вручную.
На вкладе Параметры создаваемой схемы компоновки данных после выхода из конструктора запроса появятся на показанные рис. 12 сведения.
Рис. 12. После выхода из конструктора запроса
Этот параметр присутствует в условии
Заметим, что значение Справочник.НоменклатурныеГруппы.ПустаяСсылка() параметра добавлено вручную. Хотя в данном случае это значение можно было бы и не определять — пустое значение в нашем случае эквивалентно пустой ссылке.
На вкладке Настройки в ветви Отчет мы добавляем новую группировку, но значение Поле в диалоге, показанном на рис. 13, оставляем пустым.
Рис. 13. Детальные записи
Это означает переход к детальным записям (в первом варианте группировки отсутствуют).
В нижеследующей группе Настройки выбираем поле Отчет и на вкладке Выбранные поля перечисляем выводимые в Результат (табличный документ) данные (рис. 14).
Рис. 14. Поля отчета
На вкладке Отбор формируем отборы в сооответствии с рис. 15 (по-прежнему выбрана настройка Отчет).
Рис. 15. Отборы отчета
На вкладке Сортировка указываем поля в сооответствии с рис. 16.
Рис. 16. Сортировка данных
Этим и завершаем работу со схемой компоновки данных.
Форма отчета
Форма отчета, открытая в кофигураторе, показана на рис. 17.
Рис. 17. Форма отчета, открытая в конфигураторе
В свойствах формы указан заголовок Номенклатура и установлен флажок АвтоматическоеСохранениеДанныхВНастройках.
В свойствах группы ОсновнаяКоманднаяПанель в качестве источника команд указан Результат (рис. 18).
Рис. 18. Выбор источника команд
Кнопка Сформировать имеет одноименное действие, отсылающее нас к следующему коду:
&НаКлиенте
Процедура Сформировать(Команда)
если СформироватьНаСервере() = 0 тогда сообщить(«Пусто») конецЕсли;
КонецПроцедуры
&НаСервере
функция СформироватьНаСервере()
настройки = отчет.КомпоновщикНастроек.Настройки;
//
// Установка отбора
естьОтбор_0 = не номенклатурнаяГруппа.Пустая();
естьОтбор_1 = не видНоменклатуры.Пустая();
отбор = настройки.Отбор;
УстановитьОтбор(естьОтбор_0, отбор, 0, номенклатурнаяГруппа);
УстановитьОтбор(естьОтбор_1, отбор, 1, видНоменклатуры);
//
отчетОбъект = РеквизитФормыВЗначение(«Отчет»);
//
// Вывод заголовка отчета, отборов (если имеются) и заголовка таблицы
макет = отчетОбъект.получитьМакет(«Номенклатура»);
ОбластьЗаголовок = макет.ПолучитьОбласть(«Заголовок»);
ОбластьЗаголовок.Параметры.дата = формат(текущаяДата(), «ДЛФ = Д»);
Результат.Очистить();
Результат.Вывести(ОбластьЗаголовок);
если естьОтбор_0 или естьОтбор_1 тогда
ОбластьОтбор = макет.ПолучитьОбласть(«Отбор»);
Результат.Вывести(ОбластьОтбор);
если естьОтбор_0 тогда
ОбластьОтбор = макет.ПолучитьОбласть(«ОтборНГ»);
ОбластьОтбор.Параметры.номенклатурнаяГруппа = номенклатурнаяГруппа;
Результат.Вывести(ОбластьОтбор);
конецЕсли;
если естьОтбор_1 тогда
ОбластьОтбор = макет.ПолучитьОбласть(«ОтборВН»);
ОбластьОтбор.Параметры.видНоменклатуры = видНоменклатуры;
Результат.Вывести(ОбластьОтбор);
конецЕсли;
конецЕсли;
ОбластьЗаголовокТаблицы = макет.ПолучитьОбласть(«Заголовок2»);
Результат.Вывести(ОбластьЗаголовокТаблицы);
//
// Вывод результата запроса в таблицу значений
скд = отчетОбъект.ПолучитьМакет(«ОсновнаяСхемаКомпоновкиДанных»);
тп = Тип(«ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений»);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(скд, настройки, , , тп);
ПроцессорКомпоновкиДанных = новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
ПроцессорВывода = новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
тз = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(тз);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
//
// Перенос таблицы значений в табличный документ (Результат)
ОбластьСтрокаОтчета = макет.ПолучитьОбласть(«Строка»);
для каждого стр из тз цикл
ОбластьСтрокаОтчета.Параметры.Заполнить(стр);
Результат.Вывести(ОбластьСтрокаОтчета);
конецЦикла;
// или
//прм = ОбластьСтрокаОтчета.параметры;
//для каждого стр из тз цикл
//прм.НоменклатурнаяГруппа = стр.НоменклатурнаяГруппа;
//прм.видНоменклатуры = стр.видНоменклатуры;
//прм.номенклатураСсылка = стр.номенклатураСсылка;
//прм.номерГТД = стр.номерГТД;
//Результат.Вывести(ОбластьСтрокаОтчета);
//конецЦикла;
Результат.АвтоМасштаб = Истина;
Результат.Защита = Истина;
Результат.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
возврат тз.количество();
конецФункции
&НаСервере
Процедура УстановитьОтбор(естьОтбор, отбор, индекс, значениеОтбора)
отбор.Элементы[индекс].Использование = естьОтбор;
если естьОтбор тогда
отбор.Элементы[индекс].ПравоеЗначение = значениеОтбора;
конецЕсли;
КонецПроцедуры
Кроме того, в модуле формы имеется процедура ПриОткрытии, призванная для формирования отчета при его открытии и подавления предупреждения о том, что отчет не сформирован (рис. 19).
Рис. 19. Отчет не сформирован
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ос = Элементы.Результат.ОтображениеСостояния;
ос.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;
ос.Видимость = ложь;
// Формируем отчет при его открытии
сформировать(«»);
КонецПроцедуры
Элементы формы отчета НоменклатурнаяГруппа и ВидНоменклатуры имеют обработчик события ПриИзменении, вызывающий процедуру Сформировать (на клиенте). Обработчик задается в группе События окна редактирования свойств элемента (рис. 20)
Рис. 20. Обработчик события ПриИзменении элемента НоменклатурнаяГруппа
Заметим, что значение параметра отчета можно установить следующим образом:
настройки = отчет.КомпоновщикНастроек.Настройки;
//
// Параметр запроса
настройки.ПараметрыДанных.Элементы[0].Значение = справочники.НоменклатурныеГруппы.ПустаяСсылка();
Отчет с группировками
Схема компоновки данных
В этом варианте отчета результат получается автоматически по схеме компоновке данных без единой строчки кода (используется Автозаполнение).
Текст запроса такой же, как и в первом вариане, но используется автозаголовок Номенклатура для поля НоменклатураСсылка (рис. 21).
Рис. 21. Употребляются Автозаполнение и Автозаголовок
Второе отличие схемы компоновки данных от прежнего варианта находим на вкладке Настройки (рис. 22).
Рис. 22. Вкладка Настройки с двумя группировками
Для группировок используется Автосортировка (возрастающая по алфавиту). В детальных записях задана возрастающая сортировка по полю НоменклатураСсылка, то есть по Наименованию (рис. 23).
Рис. 23. Сортировка детальных записей
Форма отчета с группировками
Форму отчета с результатом можно посмотреть на рис. 2. Форма, открытая в конфигураторе, показана на рис. 24.
Рис. 24. Форма отчет. Вкладка Реквизиты
В конфигураторе в свойствах формы в качестве разультата отчета указано значение Результат, то есть табличный документ, имеющийся в форме по умолчанию.
В свойствах группы ОсновнаяКоманднаяПанель в качестве источника команд указана Форма (рис. 25).
Рис. 25. Источником команд является форма
Вкладки Реквизиты (см. рис. 24), Команды и Параметры не модифицируются (две последние пусты).
В модуле формы нет ни единой строчки кода.
Результат (см. рис. 2) получается после нажатия на кнопку Сформировать.
Заключение
Без схемы компоновки данных с одним макетом Номенклатура и с формой отчета, показанной на рис. 17, для получения результата модуль отчета можно оформить следующим образом:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Формируем отчет при его открытии
сформировать(«»);
КонецПроцедуры
&НаКлиенте
Процедура Сформировать(Команда)
если СформироватьНаСервере() = 0 тогда сообщить(«Пусто») конецЕсли;
КонецПроцедуры
&НаСервере
функция СформироватьНаСервере()
запрос = новый запрос;
текстЗапроса ;
естьОтбор_0 = не номенклатурнаяГруппа.Пустая();
естьОтбор_1 = не видНоменклатуры.Пустая();
если естьОтбор_0 тогда
текстЗапроса = текстЗапроса + » И НоменклатурнаяГруппа = &НоменклатурнаяГруппа»
иначе
текстЗапроса = текстЗапроса + » И НоменклатурнаяГруппа <>> &ПустаяСсылка»
конецЕсли;
если естьОтбор_1 тогда
текстЗапроса = текстЗапроса + » И ВидНоменклатуры = &ВидНоменклатуры»
конецЕсли;
запрос.Текст = текстЗапроса;
запрос.УстановитьПараметр(«ПустаяСсылка», справочники.НоменклатурныеГруппы.ПустаяСсылка());
запрос.УстановитьПараметр(«НоменклатурнаяГруппа», НоменклатурнаяГруппа);
запрос.УстановитьПараметр(«ВидНоменклатуры», ВидНоменклатуры);
результатЗапроса = запрос.Выполнить();
//
// Передаем результаты запроса в таблицу значений
тз = результатЗапроса.Выгрузить();
тз.сортировать(«НоменклатурнаяГруппа, ВидНоменклатуры, НоменклатураСсылка»);
// Вывод заголовка отчета, отборов (если имеются) и заголовка таблицы
отчетОбъект = РеквизитФормыВЗначение(«Отчет»);
макет = отчетОбъект.получитьМакет(«Номенклатура»);
ОбластьЗаголовок = макет.ПолучитьОбласть(«Заголовок»);
ОбластьЗаголовок.Параметры.дата = формат(текущаяДата(), «ДЛФ = Д»);
Результат.Очистить();
Результат.Вывести(ОбластьЗаголовок);
если естьОтбор_0 или естьОтбор_1 тогда
ОбластьОтбор = макет.ПолучитьОбласть(«Отбор»);
Результат.Вывести(ОбластьОтбор);
если естьОтбор_0 тогда
ОбластьОтбор = макет.ПолучитьОбласть(«ОтборНГ»);
ОбластьОтбор.Параметры.номенклатурнаяГруппа = номенклатурнаяГруппа;
Результат.Вывести(ОбластьОтбор);
конецЕсли;
если естьОтбор_1 тогда
ОбластьОтбор = макет.ПолучитьОбласть(«ОтборВН»);
ОбластьОтбор.Параметры.видНоменклатуры = видНоменклатуры;
Результат.Вывести(ОбластьОтбор);
конецЕсли;
конецЕсли;
ОбластьЗаголовокТаблицы = макет.ПолучитьОбласть(«Заголовок2»);
Результат.Вывести(ОбластьЗаголовокТаблицы);
//
// Перенос таблицы значений в табличный документ
ОбластьСтрокаОтчета = макет.ПолучитьОбласть(«Строка»);
для каждого стр из тз цикл
ОбластьСтрокаОтчета.Параметры.Заполнить(стр);
Результат.Вывести(ОбластьСтрокаОтчета);
конецЦикла;
Результат.АвтоМасштаб = Истина;
Результат.Защита = Истина;
Результат.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
возврат тз.количество();
конецФункции
1с скд макет отчета как сделать
8(495)005-62-29
skype: live:di-sem
@programmist_1C
Отправить заявку
1С свой макет в СКД создать и использовать
Задача:
Сделать свой макет скд вместо стандартного
Решение:
Создадим простейший отчет СКД.
тут сразу уберем галочку:
Создадим свой макет СКД (макет оформления компановки данных):
Загрузим в макет стандартный макет и чуть чуть его подправим:
Изменим фон заголовков:
я еще поправил цвет шрифта группировок
Теперь нужно его как-то загрузить.
Идем в модуль объекта нашего отчета и создаем предопределенную процедуру «ПриКомпоновкеРезультата»