Реализация расшифровки в отчетах, создаваемых в 1С 8, — как с использованием Системы Компоновки Данных (СКД), так и без нее — 1c-h
 

Реализация расшифровки в отчетах, создаваемых в 1С 8, — как с использованием Системы Компоновки Данных (СКД), так и без нее

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...

В этой статье мы по шагам рассмотрим два простейших примера реализации расшифровки в отчете на платформе 8.1.

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

Допустим, у нас есть справочник:

Вид расчетаСумма
Начисление 13
Начисление 24
Начисление 36
Начисление 19

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

Вид расчетаСумма
Начисление 112
Начисление 24
Начисление 36

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

В справочнике два элемента «Начисление 1», с суммами 3 и 9. Таким образом, при расшифровке суммы этого начисления, должна получиться примерно такая табличка:

Вид расчетаСумма
Итого12
Начисление 13
Начисление 19

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

Вы можете скачать и развернуть у себя базу с примерами реализации этого отчета вот по этой ссылке:

(ссылка не работает из соображений безопасности, если база нужна, напишите комментарий к этой статье, вышлем базу)

Реализация расшифровки в отчете, созданном без использования СКД

Сначала создадим в конфигураторе новый отчет. Назовем его «ОтчетСРасшифровкойБезСКД». В этом отчете создадим новую форму и добавим в диалоге формы поле табличного документа:

Рис 1. Создание формы отчета.

В разделе «События» свойств поля табличного документа назначаем процедуру обработки расшифровки (см. на рисунке — выделено в рамку).

На вкладке модуля формы, во-первых, создаем процедуру-обработчик нажатия на кнопку «Сформировать», во вторых, пишем код процедуры обработки расшифровки:

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

Рис.2. Создание макета отчета и макета расшифровки отчета.

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

Вот и все. Теперь можно открыть 1С:Предприятие и убедиться, что разработанный отчет покажет требуемую расшифровку:

Реализация отчета с использованием Системы Компоновки Данных (СКД)

В прилагаемой в качестве примера конфигурации отчет назван «ОтчетСРасшифровкойСКД».

Итак, последовательность разработки отчета следующая.

Создаем новый отчет. Назначаем ему новую схему компоновки данных (см. рисунок — отмечено цифрой 1). Создаем в ней новый набор данных — запрос (см. рис — отметка 2). Пишем текст запроса(см. рисунок — отметка 3):

Переходим на вкладку «Настройки» схемы компоновки и с помощью конструктора настроек определяем список выводимых полей:

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

Самое интересное — это как получить и проверить имя расшифровываемого поля. Чтобы в процедуре «ПолеТабличногоДокументаОбработкаРасшифровки» определить, какое поле пытается расшифровать пользователь, нам нужно получить его наименование (специальная обработка расшифровки у нас должна быть назначена для поля «Сумма» — именно так его имя определено в СКД конструктором). Имя этого поля можно извлечь из предопределенного параметра «Расшифровка» процедуры ПолеТабличногоДокументаОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка). К сожалению, во встроенном в конфигуратор синтакс-помощнике достаточно трудно разобраться, как это сделать. Поэтому поясним подробнее.

Для нашего примера проверка имени этого поля выполняется вот в таком операторе сравнения:

У любой формы любого отчета среди свойств есть свойство «ДанныеРасшифровки». Посмотрим, что об этом говорится в синтакс-помощнике конфигуратора. Расширение формы отчета:

**********************************************************

Расширение формы отчета (Report form extension)
Свойства:

ВосстанавливатьЗначенияПриОткрытии (RestoreValuesOnOpen)
ДанныеРасшифровки (DetailsData)
РезультатОтчета (ReportResult)

События:

ПередСохранениемЗначений (BeforeSaveValues)
ПослеВосстановленияЗначений (AfterRestoreValues)

Описание:

Дополнительные свойства и события объекта «Форма отчета».
Недоступен на сервере 1С:Предприятие. Не используется в модуле внешнего соединения.

**********************************************************

Его свойство «ДанныеРасшифровки»:

**********************************************************
Расширение формы отчета (Report form extension)

ДанныеРасшифровки (DetailsData)
Использование:

Чтение и запись.

Описание:

Тип: ДанныеРасшифровкиКомпоновкиДанных. Содержит данные расшифровки последнего выполненного отчета.
Недоступно на сервере 1С:Предприятие. Не используется в модуле внешнего соединения.

**********************************************************

Посмотрим, что это за тип такой, ДанныеРасшифровкиКомпоновкиДанных:

**********************************************************
ДанныеРасшифровкиКомпоновкиДанных (DataCompositionDetailsData)

Свойства:

Настройки (Settings)
Элементы (Items)

Конструкторы:

По умолчанию

Описание:

Объект, содержащий информацию о расшифровке.
XML-сериализация. Поддержка отображения в XDTO; пространство имен: {http://v8.1c.ru/8.1/data-composition-system/details}. Имя типа XDTO: DetailsInformation.

См. также:

ОтчетОбъект, свойство
Расширение формы отчета, свойство ДанныеРасшифровки
ПроцессорКомпоновкиДанных, метод Инициализировать
КомпоновщикМакетаКомпоновкиДанных, метод Выполнить
ОбработкаРасшифровкиКомпоновкиДанных, конструктор На основании данных расшифровки и источника доступных настроек

**********************************************************

Т.е. из описания видим, что у этого типа есть свойство «Элементы». Посмотрим описание этого свойства:

**********************************************************

ДанныеРасшифровкиКомпоновкиДанных (DataCompositionDetailsData)

Элементы (Items)
Использование:

Только чтение.

Описание:

Тип: ЭлементыРасшифровкиКомпоновкиДанных. Содержит элементы расшифровки.
XML-сериализация.

**********************************************************

Посмотрим описание типа «ЭлементыРасшифровкиКомпоновкиДанных», чтобы выяснить, какие методы к нему применимы:

**********************************************************
ЭлементыРасшифровкиКомпоновкиДанных (DataCompositionDetailsItems)

Элементы коллекции:

ЭлементРасшифровкиКомпоновкиДанныхПоля, ЭлементРасшифровкиКомпоновкиДанныхГруппировка
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы расшифровки.
Возможно обращение к элементу посредством оператора […]. В качестве аргумента передается индекс (нумерация с 0), идентификатор расшифровки.

Методы:

Добавить (Add)
Индекс (IndexOf)
Количество (Count)
Получить (Get)

Описание:

Коллекция элементов расшифровки.

См. также:

ДанныеРасшифровкиКомпоновкиДанных, свойство Элементы

**********************************************************

Как видим из описания, к элементу расшифровки компоновки данных применим метод «Получить». Посмотрим его описание в синтакс-помощнике Конфигуратора::

**********************************************************
ЭлементыРасшифровкиКомпоновкиДанных (DataCompositionDetailsItems)

Получить (Get)
Синтаксис:

Получить(<Идентификатор>) (*см примечание)

Параметры:
<Идентификатор> (обязательный)

Тип: ИдентификаторРасшифровкиКомпоновкиДанных. Идентификатор элемента.

Возвращаемое значение:

Тип: ЭлементРасшифровкиКомпоновкиДанныхПоля, ЭлементРасшифровкиКомпоновкиДанныхГруппировка.

Описание:

Получает элемент коллекции по индексу. Работает аналогично оператору [].
**********************************************************

*Примечание. Текст, выделенный серым цветом, отсутствует в синтакс-помощнике конфигуратора, что является ошибкой, и вводит в заблуждение неопытных программистов. Однако некоторым пытливым умам удалось выявить эту ошибку, поэтому приводим тут исправленный вариант. Теперь посмотрим, что это за тип — ЭлементРасшифровкиКомпоновкиДанныхПоля:

**********************************************************
ЭлементРасшифровкиКомпоновкиДанныхПоля (DataCompositionFieldDetailsItem)

Свойства:

Идентификатор (ID)

Методы:

ПолучитьПоля (GetFields)
ПолучитьРодителей (GetParents)

Описание:

Элемент расшифровки, содержащий значения полей.
Поддержка отображения в XDTO; пространство имен: {http://v8.1c.ru/8.1/data-composition-system/details}. Имя типа XDTO: DetailsItemFields.

**********************************************************

Итак, мы добрались до идентификатора «Идентификатор (ID)» и метода «ПолучитьПоля». Тип значения параметра «Расшифровка» в случае расшифровки поля, заполняемого с помощью СКД, — «ИдентификаторРасшифровкиКомпоновкиДанных». Посмотрим описание этого типа в синтакс-помощнике Конфигуратора:

**********************************************************
ИдентификаторРасшифровкиКомпоновкиДанных (DataCompositionDetailsID)

Описание:

Представляет собой специальный объект для идентификации объекта расшифровки.
Поддержка отображения в XDTO; пространство имен: {http://v8.1c.ru/8.1/data-composition-system/details}. Имя типа XDTO: DetailsID.

См. также:

ЭлементРасшифровкиКомпоновкиДанныхПоля, свойство Идентификатор
ЭлементРасшифровкиКомпоновкиДанныхГруппировка, свойство Идентификатор
ОбработкаРасшифровкиКомпоновкиДанных, метод Выполнить
ОбработкаРасшифровкиКомпоновкиДанных, метод ОткрытьЗначение
ОбработкаРасшифровкиКомпоновкиДанных, метод Отфильтровать
ОбработкаРасшифровкиКомпоновкиДанных, метод Упорядочить
ОбработкаРасшифровкиКомпоновкиДанных, метод Сгруппировать
ОбработкаРасшифровкиКомпоновкиДанных, метод Расшифровать
ОбработкаРасшифровкиКомпоновкиДанных, метод ПрименитьНастройки

**********************************************************
ЭлементРасшифровкиКомпоновкиДанныхПоля (DataCompositionFieldDetailsItem)
Идентификатор (ID)
Использование:
Только чтение.
Описание:
Тип: ИдентификаторРасшифровкиКомпоновкиДанных. Идентификатор элемента.

**********************************************************

Пояснение к методу «ПолучитьПоля»:

**********************************************************
ЭлементРасшифровкиКомпоновкиДанныхПоля (DataCompositionFieldDetailsItem)

ПолучитьПоля (GetFields)
Синтаксис:

ПолучитьПоля()

Возвращаемое значение:

Тип: ЗначенияПолейРасшифровкиКомпоновкиДанных.

Описание:

Получает значения полей, установленных в элементе расшифровки.
**********************************************************

Посмотрим описание типа «ЗначенияПолейРасшифровкиКомпоновкиДанных»:

**********************************************************
ЗначенияПолейРасшифровкиКомпоновкиДанных (DataCompositionDetailsFieldValues)

Элементы коллекции:

ЗначениеПоляРасшифровкиКомпоновкиДанных
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются значения полей.
Возможно обращение к значению посредством оператора […]. В качестве аргумента передается имя, индекс (нумерация с 0).

Методы:

Вставить (Insert)
Добавить (Add)
Индекс (IndexOf)
Количество (Count)
Найти (Find)
Очистить (Clear)
Получить (Get)
Сдвинуть (Move)
Удалить (Delete)

Описание:

Коллекция значений полей.

См. также:

ЭлементРасшифровкиКомпоновкиДанныхПоля, метод ПолучитьПоля
ЭлементыРасшифровкиКомпоновкиДанных, метод Добавить
**********************************************************

Как видим, к этому типу применим метод «Найти»:

**********************************************************
ЗначенияПолейРасшифровкиКомпоновкиДанных (DataCompositionDetailsFieldValues)

Найти (Find)
Синтаксис:

Найти(<Имя>)

Параметры:
<Имя> (необязательный)

Тип: Строка. Имя искомого элемента.

Возвращаемое значение:

Тип: ЗначениеПоляРасшифровкиКомпоновкиДанных; Неопределено. Если элемент не найден, будет возвращено значение Неопределено.

Описание:

Осуществляет поиск элемента коллекции по имени.
**********************************************************

ЗначениеПоляРасшифровкиКомпоновкиДанных:

**********************************************************
ЗначениеПоляРасшифровкиКомпоновкиДанных (DataCompositionDetailsFieldValue)

Свойства:

Значение (Value)
Иерархия (Hierarchy)
Поле (Field)

Описание:

Содержит значения полей элемента расшифровки.
Поддержка отображения в XDTO; пространство имен: {http://v8.1c.ru/8.1/data-composition-system/details}. Имя типа XDTO: FieldValue.

См. также:

ЗначенияПолейРасшифровкиКомпоновкиДанных, метод Добавить
ЗначенияПолейРасшифровкиКомпоновкиДанных, метод Вставить
ЗначенияПолейРасшифровкиКомпоновкиДанных, метод Получить
ЗначенияПолейРасшифровкиКомпоновкиДанных, метод Найти
ЗначенияПолейРасшифровкиКомпоновкиДанных, метод Удалить
ЗначенияПолейРасшифровкиКомпоновкиДанных, метод Индекс
ЗначенияПолейРасшифровкиКомпоновкиДанных, метод Сдвинуть
**********************************************************

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

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...

Автор 1С

4 thoughts on “Реализация расшифровки в отчетах, создаваемых в 1С 8, — как с использованием Системы Компоновки Данных (СКД), так и без нее

  1. Огромное спасибо за статью.
    Если нужно, скажем, экспортировать отчет в файл — нужно заменить
    ЭлементыФормы.ПолеТабличногоДокумента.Защита = Истина;
    на
    ЭлементыФормы.ПолеТабличногоДокумента.ТолькоПросмотр = Истина;

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Next Post

Шпаргалка по программированию для системы 1С:Предприятие v8

Ср Авг 17 , 2011
В этой статье будет постепенно публиковаться набор кратких шпаргалок по использованию методов языка и спосбов разработки на платформе 1С:8.2 (часть из них применима и к 8.1, но об этом упоминаться не будет). Вопрос Как сделать так, чтобы автоматически рассчитывалась сумма (Сумма = Количество*Цена) при изменении Цены или Количества в форме […]