218 lines
13 KiB
Plaintext
218 lines
13 KiB
Plaintext
#Область Служебные
|
||
|
||
&НаСервере
|
||
Процедура ВывестиТЗНаФорму(Знач ТаблицаОбъект,СтрОбТб) Экспорт
|
||
ЭлементФормы = Элементы.Найти(СтрОбТб);
|
||
|
||
МассивДобавляемыхРеквизитов = Новый Массив;
|
||
МассивУдаляемыхРеквизитов = Новый Массив;
|
||
Если ЭлементФормы = Неопределено Тогда
|
||
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(СтрОбТб, Новый ОписаниеТипов("ТаблицаЗначений")));
|
||
Иначе
|
||
ЭтаФорма.Элементы.Удалить(ЭлементФормы);
|
||
МассивУдаляемыхРеквизитов.Добавить(СтрОбТб);
|
||
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов,МассивУдаляемыхРеквизитов);
|
||
|
||
МассивУдаляемыхРеквизитов = Новый Массив;
|
||
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(СтрОбТб, Новый ОписаниеТипов("ТаблицаЗначений")));
|
||
КонецЕсли;
|
||
|
||
Для Каждого Колонка Из ТаблицаОбъект.Колонки Цикл
|
||
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, СтрОбТб, Колонка.Заголовок));
|
||
КонецЦикла;
|
||
|
||
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов,МассивУдаляемыхРеквизитов);
|
||
|
||
// Преобразование объекта прикладного типа Таблица_Значений
|
||
// в реквизит управляемой формы (данные формы)
|
||
ЗначениеВРеквизитФормы(ТаблицаОбъект, СтрОбТб);
|
||
|
||
// Создание элемента формы типа ТаблицаФормы для отображения дерева
|
||
ЭлементДерево = Элементы.Добавить(СтрОбТб, Тип("ТаблицаФормы"), Элементы.Редактирование);
|
||
ЭлементДерево.ПутьКДанным = СтрОбТб;
|
||
ЭлементДерево.Отображение = ОтображениеТаблицы.Список;
|
||
//ЭлементДерево.РежимВыделенияСтроки = РежимВыделенияСтрокиТаблицы.Строка;
|
||
|
||
КнопкаВыгрузить = Элементы.Добавить("КнопкаВыгрузить", Тип("КнопкаФормы"), ЭлементДерево.КоманднаяПанель);
|
||
КнопкаЗагрузить = Элементы.Добавить("КнопкаЗагрузить", Тип("КнопкаФормы"), ЭлементДерево.КоманднаяПанель);
|
||
КнопкаВыгрузить.Заголовок = "Выгрузить";
|
||
КнопкаЗагрузить.Заголовок = "Загрузить";
|
||
КнопкаВыгрузить.ИмяКоманды = "Выгрузить";
|
||
КнопкаЗагрузить.ИмяКоманды = "Загрузить";
|
||
|
||
Для Каждого Колонка Из ТаблицаОбъект.Колонки Цикл
|
||
НовыйЭлемент = Элементы.Добавить(СтрОбТб+"_" +Колонка.Имя, Тип("ПолеФормы"), ЭлементДерево);
|
||
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
|
||
НовыйЭлемент.ПутьКДанным = СтрОбТб+"."+Колонка.Имя;
|
||
НовыйЭлемент.Заголовок = Колонка.Заголовок;
|
||
|
||
Если Не ЗначениеЗаполнено(Колонка.Ширина) Тогда
|
||
НовыйЭлемент.Ширина = 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.Закрыть();
|
||
|
||
ВывестиТЗНаФорму(ТЗ, "РеквизитТЗ");
|
||
Элементы.ГрСтраницы.ТекущаяСтраница = Элементы.Редактирование;
|
||
|
||
Для Каждого ТекКолонка Из ТЗ.Колонки Цикл
|
||
НовСтр = КолонкиНовойТЗ.Добавить();
|
||
ЗаполнитьЗначенияСвойств(НовСтр, ТекКолонка, "Имя,Заголовок,Ширина");
|
||
НовСтр.ТипКолонки = ТекКолонка.ТипЗначения;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецПроцедуры
|