Здравствуйте.
Допустим, Вы сделали красивый и, ужас какой, нужный отчет, но до полного идеала не хватает маленького шажочка - нужно по щелчку ячейки отчета вывести дополнительные данные.
Это называется расшифровкой. Стандартно, расшифровка строится только для ссылочных данных: если в ячейке указан какой-то документ, то щелкнув по этой ячейке документ и откроется.
Если Вы начнете искать в интернете информацию по расшифровке. То получите огромное количество информации, как изменить команды расшифровки, как добавить свое действие... Все это будет сопровождаться сотнями строк кода.
Однако, в 99% случаев задача перед программистом стоит такая: по щелчку мыши вывести дополнительную информацию. И все! 99% изученной информации Вам не потребуется.
Вы, конечно же, во всем разберетесь, но если тратить время не хочется, то я покажу как всего несколькими строчками кода изменить поведение Вашего отчета - получить расшифровку, любого поля, изменить расшифровку, которая идет по умолчанию.
Прежде всего следует понять, что расшифровка делается не в данных, а в элементе на форме. То есть, мы будем менять не данные отчета, а то, куда эти данные выводятся.
В 99% случаях, данные выводятся в табличный документ.
Форму с этим элементом может создать за Вас система 1С автоматически, но в этом случае, в рамках данной статьи, повлиять на работу данного элемента не получится. Поэтому форму отчета Вам придется создать самим.
При создании пользовательской формы отчета, система автоматически создает на ней элемент вывода данных. Как правило, это табличный документ с именем Результат:
обычные формы
У данного элемента есть событие Обработка расшифровки. Создайте событие, выбрав его:
Мы увидим следующий текст:
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
// Вставить содержимое обработчика.
КонецПроцедуры
Комментарий нам не нужен, можете как оставить его так и удалить.
Прежде всего, нужно указать системе, что стандартное поведение расшифровки нас не устраивает, для этого вставим строку:
СтандартнаяОбработка = Ложь;
Если Вы теперь запустите свой отчет, то никакой расшифровки проводиться не будет. Даже стандартной. То есть мы отключили стандартное поведение, а из стандартных команд расшифровки осталась только "Открытие", но так как и ее поведение мы еще не программировали, то и оно не работает.
Затем, следует запомнить выражение: ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0]
Именно здесь система хранить информацию о ячейке, по которой пользователь щелкнул мышью. Присвоив переменной данное выражение, мы получим переменную, состоящую из нескольких полей. Нас будут интересовать поля: Поле и Значение.
Данные = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0];
Допустим, наш отчет имеет следующий вид:
Щелкнув по ячейке "1000", наша переменная Данные "получит информацию". Данные.Поле будет содержать "СуммаДокумента", а Данные.Значение будет содержать "1000". А вот если щелкнуть, по сотруднику Юмин КГ, то Данные.Поле станет "Сотрудник", а Данные.Значение, будет содержать ссылку на элемент справочника Сотрудники - Юмина КГ.
Но почему, в первом случае был просто текст, а во-втором - ссылка на сотрудника? Просто, в схеме компоновки данных отчета, я так указал именно эти типы полей:
Кстати, тип значения полей можно и не указывать, главное понимать, какие типы данных возвращает запрос к базе.
Перейдем к практике.
Стандартно, данный отчет по щелчку на сотруднике должен открывать справочник сотрудника. Изменим поведение, чтобы открывался не сотрудник, а физическое лицо, которое привязано к этому сотруднику.
Не забываем отменить стандартное поведение расшифровки:
СтандартнаяОбработка = Ложь;
Далее мы должны посмотреть, а не щелкнул ли пользователь по полю сотрудника, и если это так, то открыть физическое лицо:
Если ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Поле = "Сотрудник" Тогда
Ссылка = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Значение;
ОткрытьЗначение(Ссылка.ФизЛицо);
КонецЕсли;
Вот и все!
Теперь, давайте попробуем не ссылочный тип данных: выведем в текстовой документ сумму документа, если пользователь щелкает по сумме:
Если ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Поле = "СуммаДокумента" Тогда
СуммаДокумента = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Значение;
Текст = Строка(СуммаДокумента);
ТекстовойДокумент = Новый ТекстовыйДокумент;
ТекстовойДокумент.ДобавитьСтроку(Текст);
ТекстовойДокумент.Показать();
КонецЕсли;
В итоге, вся процедура расшифровки получилась такой:
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
СтандартнаяОбработка = Ложь;
Если ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Поле = "Сотрудник" Тогда
Ссылка = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Значение;
ОткрытьЗначение(Ссылка.ФизЛицо);
КонецЕсли;
Если ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Поле = "СуммаДокумента" Тогда
СуммаДокумента = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Значение;
Текст = Строка(СуммаДокумента);
ТекстовойДокумент = Новый ТекстовыйДокумент;
ТекстовойДокумент.ДобавитьСтроку(Текст);
ТекстовойДокумент.Показать();
КонецЕсли;
КонецПроцедуры
Для управляемых форм почти все тоже самое, отличие в том что, данные расшифровки не в памяти, а в хранилище, и их надо получить, кроме того, работа с расшифровкой в управляемых формах должна проводиться на сервере:
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
СтандартнаяОбработка = Ложь;
СтруктураДанных = ПолучитьРасшифровку(Расшифровка, ДанныеРасшифровки);
Если СтруктураДанных.Поле = "Склад" Тогда
ОткрытьЗначение(СтруктураДанных.Значение);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьРасшифровку(Расшифровка, ДанныеРасшифровки)
//получим из хранилища данные
ДанныеРасшифровкиОбъект = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
//вернулись к строке вида: ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0]
Данные = ДанныеРасшифровкиОбъект.Элементы[Расшифровка].ПолучитьПоля()[0];
//переменную Данные в управляемых формах на клиент передавать нельзя, а потому, перобразуем ее в структуру
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Поле", Данные.Поле);
СтруктураДанных.Вставить("Значение", Данные.Значение);
//возвращаем
Возврат СтруктураДанных;
КонецФункции
P.S. При усложнении схемы, а точнее ее настроек, значения полей расшифровки могут "теряться". Например, при введении группировок... Тогда следует получать расшифровку не прямым указанием: взять первое поле элемента расшифровки... Но это тема отдельной статьи. Главное новичку понять откуда что берется и только затем ставить перед собой более сложные задачи!
На сегодня это все! Жду вопросов, критики и пожеланий....