Имя: Пароль:
1C
 
Представление электронного документа
0 Momus
 
25.02.22
10:22
Кто-нибудь работал с библиотекой электронных документов версии 1.9.+? Хочу изменить вывод одного поля при формировании табличного документа из сохраненного xml, но не могу разобраться как. В версии 1.8.+ было все просто, тут логика поменялась: нет привычного макета табличного документа, а используется ПреобразованиеXSL.
1 Мимохожий Однако
 
25.02.22
10:37
Сними покровы со своего кода
2 Momus
 
25.02.22
10:46
(1) всм? Прислать код преобразования, который используется в библиотеке?
3 Momus
 
25.02.22
10:48
Функция ПреобразоватьФорматЭД(ПотокИсходногоXML, Параметры = Неопределено, КонтекстДиагностики = Неопределено) Экспорт
    
    Если Параметры = Неопределено Тогда
        Преобразователь = КонвертацияЭДОПовтИсп.ПреобразованиеXSL_ПараметрыПроизвольногоДокумента();
        Если Преобразователь = Неопределено Тогда
            Возврат Неопределено;
        КонецЕсли;
    Иначе
        ТекстПравила = ТекстПравилаПреобразованияФормата(Параметры, КонтекстДиагностики);
        Если НЕ ЗначениеЗаполнено(ТекстПравила) Тогда
            Возврат Неопределено;
        КонецЕсли;
        
        Преобразователь = Новый ПреобразованиеXSL;
        Преобразователь.ЗагрузитьТаблицуСтилейXSLИзСтроки(ТекстПравила);
        
        ПараметрыXSL = Неопределено;
        Если Параметры.Свойство("ПараметрыXSL", ПараметрыXSL) И ЗначениеЗаполнено(ПараметрыXSL) Тогда
            
            Для Каждого ПараметрXSL Из ПараметрыXSL Цикл
                Если ТипЗнч(ПараметрXSL.Значение) = Тип("Структура") Тогда
                    ЗначениеПараметра = КонвертироватьЗначениеПоИнструкции(ПараметрXSL.Значение);
                    Если ЗначениеПараметра = Неопределено Тогда
                        Продолжить;
                    КонецЕсли;
                    Преобразователь.ДобавитьПараметр(ПараметрXSL.Ключ, ЗначениеПараметра);
                Иначе
                    
                    ЗначениеПараметра = ПараметрXSL.Значение;
                    
                    Если ТипЗнч(ЗначениеПараметра) = Тип("Строка") Тогда
                        Если СтрНайти(ЗначениеПараметра, "'") <> 0 Тогда
                            ЗначениеПараметра = СтрШаблон("""%1""", ЗначениеПараметра);
                        Иначе
                            ЗначениеПараметра = СтрШаблон("'%1'", ЗначениеПараметра);
                        КонецЕсли;
                    КонецЕсли;
                    
                    Если ТипЗнч(ЗначениеПараметра) = Тип("Булево") Тогда
                        ЗначениеПараметра = ?(ЗначениеПараметра, 1, 0);
                    КонецЕсли;

                    Преобразователь.ДобавитьПараметр(ПараметрXSL.Ключ, ЗначениеПараметра);
                    
                КонецЕсли;
            КонецЦикла;
            
        КонецЕсли;
        
    КонецЕсли;
    
    ЧтениеИсходногоXML = Новый ЧтениеXML;
    ЧтениеИсходногоXML.ОткрытьПоток(ПотокИсходногоXML);
    
    ПотокИтоговогоXML = Новый ПотокВПамяти;
    
    ЗаписьИтоговогоXML = Новый ЗаписьXML;
    ЗаписьИтоговогоXML.ОткрытьПоток(ПотокИтоговогоXML);
    
    Попытка
        Преобразователь.Преобразовать(ЧтениеИсходногоXML, ЗаписьИтоговогоXML);
    Исключение
        ЧтениеИсходногоXML.Закрыть();
        ЗаписьИтоговогоXML.Закрыть();
        ПотокИтоговогоXML.Закрыть();
        
        ВидОперации = НСтр("ru = 'Преобразование формата.';
                            |en = 'Format conversion.'");
        ВидОшибки = ОбработкаНеисправностейБЭДКлиентСервер.ВидОшибкиНеизвестнаяОшибка();

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