Каталог решений - Редактирование данных в ячейках СКД (простая реализация)

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

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

В наличии

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

Категория:

Описание

Можете скачать обработку, либо реализовать её самостоятельно по следующей инструкции.

1. В конфигураторе создаем внешний отчёт

2. В отчёте создаем схему компоновки данных, добавляем набор данных "Запрос" с текстом:

ВЫБРАТЬ ПЕРВЫЕ 1000
	Номенклатура.Ссылка КАК Ссылка,
	Номенклатура.Артикул КАК Артикул,
	Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
	Номенклатура.Производитель КАК Производитель
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	НЕ Номенклатура.ПометкаУдаления
	И НЕ Номенклатура.ЭтоГруппа

3. В СКД на последней вкладке добавляем "Детальные записи", выбираем все колонки запроса в последовательности: Ссылка, Артикул, ВидНоменклатуры, Производитель

4. В модуле объекта прописываем код:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	НастройкиСКД = КомпоновщикНастроек.ПолучитьНастройки();
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиСКД, ДанныеРасшифровки);
	
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
	
	ИзменяемыеПоля = Новый Структура;
	ИзменяемыеПоля.Вставить("Ссылка", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
	ИзменяемыеПоля.Вставить("Артикул", ОбщегоНазначения.ОписаниеТипаСтрока(50));
	ИзменяемыеПоля.Вставить("ВидНоменклатуры", Новый ОписаниеТипов("СправочникСсылка.ВидыНоменклатуры"));
	ИзменяемыеПоля.Вставить("Производитель", Новый ОписаниеТипов("СправочникСсылка.Производители"));
	
	Для НомерСтроки = ДокументРезультат.ФиксацияСверху + 1 По ДокументРезультат.ВысотаТаблицы цикл
		
		Для НомерКолонки = ДокументРезультат.ФиксацияСлева + 1 По ДокументРезультат.ШиринаТаблицы цикл
			
			ТекущаяОбласть = ДокументРезультат.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
			
			Если ТекущаяОбласть.Расшифровка = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			
			ЗначенияРасшифровки = ПолучитьВсеЗначенияРасшифровки(ДанныеРасшифровки.Элементы[ТекущаяОбласть.Расшифровка]);
			
			Для каждого Элемент Из ИзменяемыеПоля Цикл
				
				Если ЗначенияРасшифровки.Свойство(Элемент.Ключ) Тогда
					ТекущаяОбласть.Защита = Ложь;
					ТекущаяОбласть.СодержитЗначение = Истина;
					ТекущаяОбласть.ТипЗначения = Элемент.Значение;
					ТекущаяОбласть.Значение = ЗначенияРасшифровки[Элемент.Ключ];
				КонецЕсли; 
				
			КонецЦикла; 
			
			Если ЗначенияРасшифровки.Свойство("Ссылка") Тогда
				ТекущаяОбласть.Защита = Истина;
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЦикла;
КонецПроцедуры

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

	ЗначенияРасшифровки = Новый Структура;
    Поля = Данные.ПолучитьПоля();
	
	Для каждого текПоле из Поля цикл
		ЗначенияРасшифровки.Вставить(СтрЗаменить(текПоле.Поле, ".", "_"), текПоле.Значение);
	КонецЦикла;
	
	Возврат ЗначенияРасшифровки;
	
КонецФункции

5. Создаем форму отчёта, в модуле формы прописываем код:

&НаКлиенте
Процедура РезультатПриИзменении(Элемент)
	ИзменитьДанныеНоменклатуры();
КонецПроцедуры

&НаСервере
Процедура ИзменитьДанныеНоменклатуры()
	
	НомерСтроки = Элементы.Результат.ТекущаяОбласть.Верх;
	НомерКолонки = Элементы.Результат.ТекущаяОбласть.Лево;
	
	СоответствиеКолонок = Новый Соответствие;
	СоответствиеКолонок.Вставить(2, "Артикул");
	СоответствиеКолонок.Вставить(3, "ВидНоменклатуры");
	СоответствиеКолонок.Вставить(4, "Производитель");
	
	НовоеЗначение = Результат.ПолучитьОбласть(НомерСтроки, НомерКолонки).ТекущаяОбласть.Значение;
	
	Номенклатура = ПолучитьНоменклатуру();
	НоменклатураОбъект = Номенклатура.ПолучитьОбъект();
	ЕстьИзменения = Ложь;
	
	ИмяПоля = СоответствиеКолонок[НомерКолонки];
	
	Если НоменклатураОбъект[ИмяПоля] <> НовоеЗначение Тогда
		НоменклатураОбъект[ИмяПоля] = НовоеЗначение;
		ЕстьИзменения = Истина;
	КонецЕсли; 
	
	Если ЕстьИзменения Тогда
		Попытка
			НоменклатураОбъект.Записать();
		Исключение
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = ОписаниеОшибки();
			Сообщение.Сообщить(); 
		КонецПопытки;
	КонецЕсли; 
	
КонецПроцедуры

&НаСервере
Функция ПолучитьНоменклатуру()
	
	Номенклатура = Неопределено;
	НомерСтроки = Элементы.Результат.ТекущаяОбласть.Верх;
	Область = Результат.ПолучитьОбласть(НомерСтроки, 0);
	ТекОбласть = Область.ТекущаяОбласть;
	
	Если ТекОбласть.СодержитЗначение Тогда
		Номенклатура = ТекОбласть.Значение;
	КонецЕсли;
	
	Возврат Номенклатура;
	
КонецФункции

6. Привязываем событие "ПриИзменении" поля "Результат" формы к добавленной в модуль формы процедуре "РезультатПриИзменении"

7. Запускаем отчёт в режиме 1С Предприятие и проверяем его работу.

Обратите внимание в коде на переменные "ИзменяемыеПоля" и "СоответствиеКолонок", они определяют какие колонки будут редактироваться.

Тестировал на платформе 8.3.20.1710.

has been added to your cart:
Оформление заказа