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

После формирования отчета нам нужно, чтобы при клике на ячейку Описание(Номенклатура.Комментарий) можно было изменить реквизит элемента справочника.
Первым делом нам надо переопределить процедуру отчета ПриСозданииНаСервере. Заходим в модуль объекта нашего отчета и пишем следующий код:
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.События.ПриСозданииНаСервере = Истина;
КонецПроцедуры
Теперь, если запустить отчет, то нам выдаст такую ошибку:

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

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