epf_ValueTableEditor/РедакторТЗ_XML/Forms/Форма/Ext/Form/Module.bsl

218 lines
13 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#Область Служебные
&НаСервере
Процедура ВывестиТЗНаФорму(Знач ТаблицаОбъект,СтрОбТб) Экспорт
ЭлементФормы = Элементы.Найти(СтрОбТб);
МассивДобавляемыхРеквизитов = Новый Массив;
МассивУдаляемыхРеквизитов = Новый Массив;
Если ЭлементФормы = Неопределено Тогда
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(СтрОбТб, Новый ОписаниеТипов("ТаблицаЗначений")));
Иначе
ЭтаФорма.Элементы.Удалить(ЭлементФормы);
МассивУдаляемыхРеквизитов.Добавить(СтрОбТб);
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов,МассивУдаляемыхРеквизитов);
МассивУдаляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(СтрОбТб, Новый ОписаниеТипов("ТаблицаЗначений")));
КонецЕсли;
Для Каждого Колонка Из ТаблицаОбъект.Колонки Цикл
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, СтрОбТб, Колонка.Заголовок));
КонецЦикла;
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов,МассивУдаляемыхРеквизитов);
// Преобразование объекта прикладного типа Таблица_Значений
// в реквизит управляемой формы (данные формы)
ЗначениеВРеквизитФормы(ТаблицаОбъект, СтрОбТб);
// Создание элемента формы типа ТаблицаФормы для отображения дерева
ЭлементДерево = Элементы.Добавить(СтрОбТб, Тип("ТаблицаФормы"), Элементы.Редактирование);
ЭлементДерево.ПутьКДанным = СтрОбТб;
ЭлементДерево.Отображение = ОтображениеТаблицы.Список;
//ЭлементДерево.РежимВыделенияСтроки = РежимВыделенияСтрокиТаблицы.Строка;
КнопкаВыгрузить = Элементы.Добавить("КнопкаВыгрузить", Тип("КнопкаФормы"), ЭлементДерево.КоманднаяПанель);
КнопкаЗагрузить = Элементы.Добавить("КнопкаЗагрузить", Тип("КнопкаФормы"), ЭлементДерево.КоманднаяПанель);
КнопкаВыгрузить.Заголовок = "Выгрузить";
КнопкаЗагрузить.Заголовок = "Загрузить";
КнопкаВыгрузить.ИмяКоманды = "Выгрузить";
КнопкаЗагрузить.ИмяКоманды = "Загрузить";
Для Каждого Колонка Из ТаблицаОбъект.Колонки Цикл
НовыйЭлемент = Элементы.Добавить(СтрОбТб+"_" +Колонка.Имя, Тип("ПолеФормы"), ЭлементДерево);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = СтрОбТб+"."+Колонка.Имя;
НовыйЭлемент.Заголовок = Колонка.Заголовок;
Если Не ЗначениеЗаполнено(Колонка.Ширина) Тогда
НовыйЭлемент.Ширина = 10;
Иначе
НовыйЭлемент.Ширина = Колонка.Ширина;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
&НаКлиенте
Процедура СоздатьТЗ(Команда)
СоздатьТЗНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура Загрузить(Команда)
ДопПараметры = Новый Структура("ИмяРеквизитаТЗ", "РеквизитТЗ");
НачатьПомещениеФайла(Новый ОписаниеОповещения("Загрузить_ПослеПомещенияфайла", ЭтаФорма, ДопПараметры), ,,Истина);
КонецПроцедуры
&НаКлиенте
Процедура Выгрузить(Команда)
АдресДанных = ПолучитьДанные_ДляВыгрузки("РеквизитТЗ");
Если НЕ ЭтоАдресВременногоХранилища(АдресДанных) Тогда Возврат КонецЕсли;
ПолучитьФайл(АдресДанных, "ТаблицаЗначений."+Формат, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьКолонки(Команда)
ДопПараметры = Новый Структура("ИмяРеквизитаТЗ", "КолонкиНовойТЗ");
НачатьПомещениеФайла(Новый ОписаниеОповещения("Загрузить_ПослеПомещенияфайла", ЭтаФорма, ДопПараметры), ,,Истина);
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузитьКолонки(Команда)
АдресДанных = ПолучитьДанные_ДляВыгрузки("КолонкиНовойТЗ");
Если НЕ ЭтоАдресВременногоХранилища(АдресДанных) Тогда Возврат КонецЕсли;
ПолучитьФайл(АдресДанных, "ТаблицаЗначений."+Формат, Истина);
КонецПроцедуры
&НаКлиенте
Процедура Загрузить_ПослеПомещенияфайла(Результат, Адрес, ВыбранноеИмяФайла, ДопПараметры) Экспорт
Если Ложь = Результат Тогда
Возврат;
КонецЕсли;
Загрузить_НаСервере(Адрес, ВыбранноеИмяФайла, ДопПараметры.ИмяРеквизитаТЗ);
Если НЕ "КолонкиНовойТЗ" = ДопПараметры.ИмяРеквизитаТЗ Тогда
Элементы.ГрСтраницы.ТекущаяСтраница = Элементы.Редактирование;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СоздатьТЗНаСервере()
ТЗ = Новый ТаблицаЗначений;
Для Каждого ТекКолонка Из КолонкиНовойТЗ Цикл
ТЗ.Колонки.Добавить(ТекКолонка.Имя, ТекКолонка.ТипКолонки, ТекКолонка.Заголовок, ТекКолонка.Ширина);
КонецЦикла;
ВывестиТЗНаФорму(ТЗ, "РеквизитТЗ");
Элементы.ГрСтраницы.ТекущаяСтраница = Элементы.Редактирование;
КонецПроцедуры
&НаСервере
Процедура Загрузить_НаСервере(Адрес, ИмяФайла, ИмяРеквизитаТЗ)
Файл = Новый Файл(ИмяФайла);
ФорматФайла = НРег(Файл.Расширение);
Если СтрНачинаетсяС(ФорматФайла, ".") Тогда
ФорматФайла = Прав(ФорматФайла, СтрДлина(ФорматФайла) - 1);
КонецЕсли;
ПоддерживаемыеФорматы = СтрРазделить("xml,json", ",", Ложь);
Если Не Неопределено = ПоддерживаемыеФорматы.Найти(ФорматФайла) Тогда
Формат = ФорматФайла;
КонецЕсли;
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения();
ТЗ = Неопределено;
Если "xml" = Формат Тогда
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьПоток(Поток);
ТЗ = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("ТаблицаЗначений"));
ЧтениеXML.Закрыть();
ИначеЕсли "json" = Формат Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьПоток(Поток);
ТЗ = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON, Тип("ТаблицаЗначений"));
ЧтениеJSON.Закрыть();
КонецЕсли;
Поток.Закрыть();
ДвоичныеДанные = Неопределено;
Если НЕ Тип("ТаблицаЗначений") = ТипЗнч(ТЗ) Тогда
Возврат;
КонецЕсли;
Если "КолонкиНовойТЗ" = ИмяРеквизитаТЗ Тогда
ЗначениеВРеквизитФормы(ТЗ, ИмяРеквизитаТЗ);
Иначе
ВывестиТЗНаФорму(ТЗ, "РеквизитТЗ");
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьДанные_ДляВыгрузки(ИмяРеквизитаТЗ)
Результат = "";
ТЗ = РеквизитФормыВЗначение(ИмяРеквизитаТЗ);
Если "xml" = Формат Тогда
Поток = Новый ПотокВПамяти();
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьПоток(Поток);
ЗаписьXML.ЗаписатьОбъявлениеXML();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ТЗ, "ValueTable", "http://v8.1c.ru/8.1/data/core");
ЗаписьXML.Закрыть();
Данные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Результат = ПоместитьВоВременноеХранилище(Данные, ЭтаФорма.УникальныйИдентификатор);
ИначеЕсли "json" = Формат Тогда
Поток = Новый ПотокВПамяти();
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьПоток(Поток);
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ТЗ);
ЗаписьJSON.Закрыть();
Данные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Результат = ПоместитьВоВременноеХранилище(Данные, ЭтаФорма.УникальныйИдентификатор);
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Формат = "xml";
Если Параметры.Свойство("ТаблицаJSON") Тогда
ТаблицаJSON = Параметры.ТаблицаJSON;
Если Не ПустаяСтрока(ТаблицаJSON) Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТаблицаJSON);
ТЗ = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON, Тип("ТаблицаЗначений"));
ЧтениеJSON.Закрыть();
ВывестиТЗНаФорму(ТЗ, "РеквизитТЗ");
Элементы.ГрСтраницы.ТекущаяСтраница = Элементы.Редактирование;
Для Каждого ТекКолонка Из ТЗ.Колонки Цикл
НовСтр = КолонкиНовойТЗ.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр, ТекКолонка, "Имя,Заголовок,Ширина");
НовСтр.ТипКолонки = ТекКолонка.ТипЗначения;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры