Как в отчете на СКД настроить создание нового документа при расшифровке ячейки?

Программист 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

При разработке отчетов по остаткам товаров в 1С:Розница 2.3 часто возникает прикладная задача: вместо стандартного открытия карточки номенклатуры сразу сформировать новый документ (например, Заказ покупателя) и подставить в него выбранный товар и склад. Разберем по шагам, как переопределить стандартную расшифровку системы компоновки данных и передать выбранные значения в создаваемый документ.

Принцип работы механизма расшифровки в управляемом приложении

По умолчанию при двойном клике на ячейку отчета срабатывает типовой алгоритм платформы, открывающий значение ссылки или выводящий контекстное меню действий СКД. Чтобы переопределить это поведение, необходимо вмешаться в событие табличного документа отчета РезультатОбработкаРасшифровки.

Важно помнить об особенностях клиент-серверной архитектуры: сам объект ДанныеРасшифровки хранится во временном хранилище на сервере. На стороне клиента доступен только строковый идентификатор расшифровки (Расшифровка). Поэтому получение значений полей строки отчета обязательно выполняется в контексте сервера.

Способ 1. Мгновенное открытие нового документа по двойному клику

Рассмотрим вариант, когда при двойном клике на ячейку номенклатуры стандартное меню полностью отключается, а на экране пользователя сразу открывается форма нового документа с предзаполненными реквизитами.

  1. В форме отчета перейдем к элементу формы табличного документа (как правило, с именем Результат).
  2. Создадим обработчик события ОбработкаРасшифровки на клиенте.
  3. Установим параметр СтандартнаяОбработка = Ложь;, чтобы отменить типовое меню.
  4. Вызовем серверную функцию для извлечения номенклатуры и склада из текущей строки отчета.
  5. Откроем форму нового документа через метод ОткрытьФорму.

Посмотрим на пример клиентского кода обработчика события расшифровки:


&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	
	// Получаем значения полей строки на сервере
	ДанныеСтроки = ПолучитьДанныеСтрокиРасшифровки(Расшифровка);
	
	Если ДанныеСтроки = Неопределено Тогда
		Возврат;
	КонецЕсли;

	// Формируем параметры заполнения нового документа
	ПараметрыЗаполнения = Новый Структура;
	ПараметрыЗаполнения.Вставить("Склад", ДанныеСтроки.Склад);
	
	// Для передачи в форму используем параметр ЗначенияЗаполнения
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ЗначенияЗаполнения", ПараметрыЗаполнения);
	ПараметрыФормы.Вставить("ДанныеДляЗаполненияТЧ", ДанныеСтроки); // Дополнительный параметр для ТЧ
	
	ОткрытьФорму("Документ.ЗаказПокупателя.ФормаОбъекта", ПараметрыФормы, ЭтотОбъект);

КонецПроцедуры

Теперь разберем серверную функцию, которая читает дерево расшифровки по переданному идентификатору:


&НаСервере
Функция ПолучитьДанныеСтрокиРасшифровки(Знач ИдентификаторРасшифровки)

	Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
	
	Если Данные = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ЭлементРасшифровки = Данные.Элементы.Получить(ИдентификаторРасшифровки);
	
	Если ЭлементРасшифровки = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Результат = Новый Структура("Номенклатура,Характеристика,Склад", Справочники.Номенклатура.ПустаяСсылка(), Неопределено, Справочники.Склады.ПустаяСсылка());
	
	// Обходим поля текущей группировки
	Для Каждого Поле Из ЭлементРасшифровки.ПолучитьПоля() Цикл
		Если Поле.Поле = "Номенклатура" Тогда
			Результат.Номенклатура = Поле.Значение;
		ИначеЕсли Поле.Поле = "Характеристика" Тогда
			Результат.Характеристика = Поле.Значение;
		ИначеЕсли Поле.Поле = "Склад" Тогда
			Результат.Склад = Поле.Значение;
		КонецЕсли;
	КонецЦикла;
	
	// Если склад находится в вышестоящей группировке, поднимаемся по родителям
	Родители = ЭлементРасшифровки.ПолучитьРодителей();
	Для Каждого Родитель Из Родители Цикл
		Для Каждого Поле Из Родитель.ПолучитьПоля() Цикл
			Если Поле.Поле = "Склад" И Не ЗначениеЗаполнено(Результат.Склад) Тогда
				Результат.Склад = Поле.Значение;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	Возврат Результат;

КонецФункции

Способ 2. Добавление отдельного пункта в контекстное меню СКД

Если требуется сохранить стандартные действия (открыть номенклатуру, отфильтровать отчет, упорядочить) и при этом добавить дополнительную команду «Создать заказ покупателя», применим объект ОбработкаРасшифровкиКомпоновкиДанных.

Проанализируем алгоритм работы со списком доступных действий:


&НаКлиенте
Процедура РезультатОбработкаРасшифровкиВыборДействия(Элемент, Расшифровка, СтандартнаяОбработка)

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

КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораДействияРасшифровки(ВыбранноеДействие, ПараметрВыполнения, ДополнительныеПараметры) Экспорт

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

КонецПроцедуры

Особенности заполнения табличной части документа

Обратите внимание на системное ограничение платформы «1С:Предприятие»: параметр формы ЗначенияЗаполнения автоматически заполняет только реквизиты шапки (например, Склад, Организация). Заполнить строки табличной части Товары штатным механизмом ЗначенияЗаполнения без доработки формы целевого документа нельзя.

Для корректного добавления номенклатуры в табличную часть нового документа выберите один из двух подходов:

  1. Передача произвольного параметра в форму документа: В обработчике ПриСозданииНаСервере формы документа ЗаказПокупателя (или через расширение) проверяется наличие параметра Параметры.ДанныеДляЗаполненияТЧ. Если он передан, в табличную часть Товары программно добавляется новая строка и вызываются стандартные процедуры пересчета цен и сумм.
  2. Создание объекта на сервере: Создать документ в серверном модуле через Документы.ЗаказПокупателя.СоздатьДокумент(), программно заполнить табличную часть, сохранить документ (или передать его значения) и открыть готовую форму.

Нюансы конфигурации «Розница 2.3» (БСП)

В типовой конфигурации Розница 2.3 большинство отчетов не имеют собственной формы отчета и открываются через общую форму отчетов Библиотеки стандартных подсистем (БСП). В этом случае, чтобы внедрить индивидуальную обработку расшифровки для конкретного отчета, добавьте отчету собственную основную форму либо переопределите поведение расшифровки с помощью механизма расширений конфигурации в модуле отчета.

← На главную