Расшифровка табличного документа, сформированного СКД

Программирование - Практика программирования

Функция делает постобработку табличного документа, чтобы можно было открыть поля ссылочного типа, не имея данных расшифровки (например, после сохранения в mxl)

При стандартном формировании отчета на СКД  в расшифровке хранится идентификатор расшифровки, при этом объекты ссылочного типа не открываются. Таким образом, если сохранить табличный документ в формате mxl, а затем его снова открыть, то при клике в ячейку открывается идентификатор расшифровки(просто число), а не сам объект, ссылка на который была сохранена

Чтобы победить эту проблему, необходимо заменить значение расшифровки в ячейках табличного документа просто на объекты ссылочного типа

Процедура ОбработатьРасшифровкиОтчетаНаСКД(ТабДок, ДанныеРасшифровки)
	
	Если ТабДок.ШиринаТаблицы * ТабДок.ВысотаТаблицы > 10000 Тогда
		Ответ = Вопрос("You are about to save document " + ТабДок.ШиринаТаблицы + " x " + ТабДок.ВысотаТаблицы + " in dimensions.
		|This will take at least " + Цел(ТабДок.ШиринаТаблицы * ТабДок.ВысотаТаблицы/700) + " sec. Are you sure?", РежимДиалогаВопрос.ДаНет,,, Метаданные().Синоним);
		Если Ответ = КодВозвратаДиалога.Нет Тогда
			Возврат
		КонецЕсли;
	КонецЕсли;
	
	Состояние("Окучиваем табличный документ...");
	ПрошлоВремени = ТекущаяДата();
	
	ТипВсеСсылкиСправочники = Справочники.ТипВсеСсылки();
	ТипВсеСсылкиДокументы = Документы.ТипВсеСсылки();
	
	КэшНужныхТипов = Новый Соответствие;
	Для Каждого Тип Из ТипВсеСсылкиСправочники.Типы() Цикл
		КэшНужныхТипов.Вставить(Тип, Истина);
	КонецЦикла;
	
	Для Каждого Тип Из ТипВсеСсылкиДокументы.Типы() Цикл
		КэшНужныхТипов.Вставить(Тип, Истина);
	КонецЦикла;
	
	Для Row = 1 По ТабДок.ВысотаТаблицы Цикл
		Для Col = 1 По ТабДок.ШиринаТаблицы Цикл
			
			Ячейка = ТабДок.Область(Row, Col);
			
			Если ТипЗнч(Ячейка.Расшифровка) <> Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
				Продолжить;
			КонецЕсли;
			
			// Так же из данных расшифровки возьмем ссылку на номенклатуру
			//МассивПолейРасшифровки = ТиповыеОтчеты.ПолучитьМассивПолейРасшифровки(Ячейка.Расшифровка, ДанныеРасшифровки);
			ЭлементРасшифровки = ДанныеРасшифровкиКонсоли.Элементы[Ячейка.Расшифровка];
			Если ЭлементРасшифровки.ОсновноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда
				МассивПолейРасшифровки = ЭлементРасшифровки.ПолучитьПоля();
				Для Каждого ЭлементМассива Из МассивПолейРасшифровки Цикл
					
					ТипЗначения = ТипЗнч(ЭлементМассива.Значение);
					
					Если ТипЗнч(ЭлементМассива) = Тип("ЗначениеПоляРасшифровкиКомпоновкиДанных")
						И (КэшНужныхТипов.Получить(ТипЗначения) = Истина)
						И	 ЭлементМассива.Иерархия = Ложь Тогда
						
						Ячейка.Расшифровка = ЭлементМассива.Значение;
						Прервать;
						
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
			
			ОбработкаПрерыванияПользователя();
			
		КонецЦикла;
	КонецЦикла;
	
	ПрошлоВремени = ТекущаяДата()-ПрошлоВремени;
	Сообщить("Затрачено времени на выполнение процесса: "+Формат('00010101'+ПрошлоВремени,"ДЛФ=T; ДП=0")+" сек");
	
КонецПроцедуры

После того как расшифровка табличного документа будет доработана, его можно будет сохранить в формате mxl и впоследствии открыть в этой же базе, при этом сохранится возможность открывать объекты ссылочного типа.

Про расшифровку табличного документа на сайте ИТС

В качестве примера доработанная Консоль отчетов СКД+ (обычное приложение).

Скачать файлы

Наименование Файл Версия Размер
Консоль отчетов СКД+
.erf 55,05Kb
27.06.17
4
.erf 55,05Kb 4 Скачать

См. также

Комментарии
1. Maxim Kolkin (the1) 283 29.06.17 10:57 Сейчас в теме
Тогда уж
Состояние("Spuding spreadsheet document...");
=)
А вообще, неплохо бы добавить очистку ячеек от элементов расшифровки типа ДействиеОбработкиРасшифровкиКомпоновкиДанных.Расшифровать и т.п.
2. Информационно-технического развития Служба (SITR-utyos) 587 29.06.17 19:48 Сейчас в теме
(1) Дельная мысль, спасибо. Доработаем
3. Lubov Ufimtseva (Aurius) 30.06.17 12:08 Сейчас в теме
Спасибо, интересно. Возьму на заметку.
Оставьте свое сообщение