При разработке отчетов по остаткам товаров в 1С:Розница 2.3 часто возникает прикладная задача: вместо стандартного открытия карточки номенклатуры сразу сформировать новый документ (например, Заказ покупателя) и подставить в него выбранный товар и склад. Разберем по шагам, как переопределить стандартную расшифровку системы компоновки данных и передать выбранные значения в создаваемый документ.
По умолчанию при двойном клике на ячейку отчета срабатывает типовой алгоритм платформы, открывающий значение ссылки или выводящий контекстное меню действий СКД. Чтобы переопределить это поведение, необходимо вмешаться в событие табличного документа отчета РезультатОбработкаРасшифровки.
Важно помнить об особенностях клиент-серверной архитектуры: сам объект ДанныеРасшифровки хранится во временном хранилище на сервере. На стороне клиента доступен только строковый идентификатор расшифровки (Расшифровка). Поэтому получение значений полей строки отчета обязательно выполняется в контексте сервера.
Рассмотрим вариант, когда при двойном клике на ячейку номенклатуры стандартное меню полностью отключается, а на экране пользователя сразу открывается форма нового документа с предзаполненными реквизитами.
Результат).ОбработкаРасшифровки на клиенте.СтандартнаяОбработка = Ложь;, чтобы отменить типовое меню.ОткрытьФорму.Посмотрим на пример клиентского кода обработчика события расшифровки:
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Получаем значения полей строки на сервере
ДанныеСтроки = ПолучитьДанныеСтрокиРасшифровки(Расшифровка);
Если ДанныеСтроки = Неопределено Тогда
Возврат;
КонецЕсли;
// Формируем параметры заполнения нового документа
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Склад", ДанныеСтроки.Склад);
// Для передачи в форму используем параметр ЗначенияЗаполнения
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ЗначенияЗаполнения", ПараметрыЗаполнения);
ПараметрыФормы.Вставить("ДанныеДляЗаполненияТЧ", ДанныеСтроки); // Дополнительный параметр для ТЧ
ОткрытьФорму("Документ.ЗаказПокупателя.ФормаОбъекта", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры
Теперь разберем серверную функцию, которая читает дерево расшифровки по переданному идентификатору:
&НаСервере
Функция ПолучитьДанныеСтрокиРасшифровки(Знач ИдентификаторРасшифровки)
Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
Если Данные = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
ЭлементРасшифровки = Данные.Элементы.Получить(ИдентификаторРасшифровки);
Если ЭлементРасшифровки = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Результат = Новый Структура("Номенклатура,Характеристика,Склад", Справочники.Номенклатура.ПустаяСсылка(), Неопределено, Справочники.Склады.ПустаяСсылка());
// Обходим поля текущей группировки
Для Каждого Поле Из ЭлементРасшифровки.ПолучитьПоля() Цикл
Если Поле.Поле = "Номенклатура" Тогда
Результат.Номенклатура = Поле.Значение;
ИначеЕсли Поле.Поле = "Характеристика" Тогда
Результат.Характеристика = Поле.Значение;
ИначеЕсли Поле.Поле = "Склад" Тогда
Результат.Склад = Поле.Значение;
КонецЕсли;
КонецЦикла;
// Если склад находится в вышестоящей группировке, поднимаемся по родителям
Родители = ЭлементРасшифровки.ПолучитьРодителей();
Для Каждого Родитель Из Родители Цикл
Для Каждого Поле Из Родитель.ПолучитьПоля() Цикл
Если Поле.Поле = "Склад" И Не ЗначениеЗаполнено(Результат.Склад) Тогда
Результат.Склад = Поле.Значение;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Результат;
КонецФункции
Если требуется сохранить стандартные действия (открыть номенклатуру, отфильтровать отчет, упорядочить) и при этом добавить дополнительную команду «Создать заказ покупателя», применим объект ОбработкаРасшифровкиКомпоновкиДанных.
Проанализируем алгоритм работы со списком доступных действий:
&НаКлиенте
Процедура РезультатОбработкаРасшифровкиВыборДействия(Элемент, Расшифровка, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Инициализируем обработку расшифровки
ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет.СхемаКомпоновкиДанных);
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, ИсточникНастроек);
// Получаем доступные действия для текущей ячейки
ДополнительныеДействия = Новый СписокЗначений;
ДополнительныеДействия.Добавить("СоздатьЗаказ", "Создать заказ покупателя");
НастройкиРасшифровки = Новый НастройкиРасшифровкиКомпоновкиДанных;
// Формируем диалог выбора действия
ОбработкаРасшифровки.ВыбратьДействие(
Новый ОписаниеОповещения("ПослеВыбораДействияРасшифровки", ЭтотОбъект, Расшифровка),
Расшифровка,
,
ДополнительныеДействия
);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораДействияРасшифровки(ВыбранноеДействие, ПараметрВыполнения, ДополнительныеПараметры) Экспорт
Если ВыбранноеДействие = Неопределено Тогда
Возврат;
КонецЕсли;
ИдентификаторРасшифровки = ДополнительныеПараметры;
Если ВыбранноеДействие = "СоздатьЗаказ" Тогда
// Выполняем логику создания документа
ДанныеСтроки = ПолучитьДанныеСтрокиРасшифровки(ИдентификаторРасшифровки);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ДанныеДляЗаполненияТЧ", ДанныеСтроки);
ОткрытьФорму("Документ.ЗаказПокупателя.ФормаОбъекта", ПараметрыФормы, ЭтотОбъект);
Иначе
// Если выбрано стандартное действие СКД
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет.СхемаКомпоновкиДанных));
ОбработкаРасшифровки.ПрименитьНастройки(ПараметрВыполнения);
Элементы.Результат.Очистить();
СкомпоноватьРезультат();
КонецЕсли;
КонецПроцедуры
Обратите внимание на системное ограничение платформы «1С:Предприятие»: параметр формы ЗначенияЗаполнения автоматически заполняет только реквизиты шапки (например, Склад, Организация). Заполнить строки табличной части Товары штатным механизмом ЗначенияЗаполнения без доработки формы целевого документа нельзя.
Для корректного добавления номенклатуры в табличную часть нового документа выберите один из двух подходов:
ПриСозданииНаСервере формы документа ЗаказПокупателя (или через расширение) проверяется наличие параметра Параметры.ДанныеДляЗаполненияТЧ. Если он передан, в табличную часть Товары программно добавляется новая строка и вызываются стандартные процедуры пересчета цен и сумм.Документы.ЗаказПокупателя.СоздатьДокумент(), программно заполнить табличную часть, сохранить документ (или передать его значения) и открыть готовую форму.В типовой конфигурации Розница 2.3 большинство отчетов не имеют собственной формы отчета и открываются через общую форму отчетов Библиотеки стандартных подсистем (БСП). В этом случае, чтобы внедрить индивидуальную обработку расшифровки для конкретного отчета, добавьте отчету собственную основную форму либо переопределите поведение расшифровки с помощью механизма расширений конфигурации в модуле отчета.