Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / [игнор отключен] [закрыт для гостей] / Как присвоить строке тип хранлище значений? / 11 сообщений из 11, страница 1 из 1
17.09.2010, 10:29
    #36851724
Программист 1с
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присвоить строке тип хранлище значений?
Есть строка - она точно содержит в себе картинку - фактическу нужно выполнить только методо строка.получить(). Но проблема в том что тип(Строка)- это строка а не хранилище значений.

Преамбула. Включаем версионирование объектов. Включаем его и для справочника - хранилище дополнительной информации. В одном из элементов справочника содержится картинка. И по сути получается что картинка первый раз упакована в хранилище значений в этом элементе справочника. Второй раз в регистре сведений версии объектов (там тоже тип хранилище значений). Но когда мы извлекаем из регистра сведений .получить() получаем все с типом строка... Задача как раз в том чтобы присвоить этой строке тип хранилище значений и еще раз воспользоваться методом получить.

Ниже приведен пример - как выглядит информация полученная из регистра сведений после метода .получить(). Побайтно сравнивал с картинкой - не то

<?xml version="1.0" encoding="UTF-8"?>
<CatalogObject.ХранилищеДополнительнойИнформации xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CatalogObject.ХранилищеДополнительнойИнформации">
<Ref>964dfd1f-be43-11df-bb95-e03fd99327b1</Ref>
<DeletionMark>false</DeletionMark>
<Description/>
<ВидДанных>Изображение</ВидДанных>
<ИмяФайла>Фото 366.jpg</ИмяФайла>
<Объект xsi:type="CatalogRef.Номенклатура">dfddf12c-e133-11d8-937c-000d884f5d5e</Объект>
<Хранилище>AgFTS2/0iI3BTqDV67a9oKcNdZLNasJAEMe3H5CiiLdeI9tDc0jAoG3wZJ+id+vHWbxsQMQlFxdSyKv0KPTQPIDQVxB66a29JdDidGY31rXQmZ1df/+/O7ua3DMTH88vc37F/fHt5CaMwm7QC4cPQXc0HAe97gSn9mDcwQwHo9Bv1OYdv0NLe+Fz7gchjTYJWmvUFr6eqfPutDqCnWC2Wuf68zuql7h6WC2sO+0bj/3u+BtSDyalWShJwinPc1RADwZgFkqSaPovHHGMsRBHqIQlINpMaLETr2wWsZoZnmqO1Ypzz+Ik4ZxbfK047tizk3gqwRRVQ2J1zCRYjM1NP2GOQ04MT/VxB18zNuM8sVnNvAzAsEO9VVYqCQU1dAxm8BllUHFWPm5eP6MLBZrJBfQlcazdDYhptG7i9+OsAHIZi1IHj1sWgrhQ9WhN110Kw3Idpczy66nxHRQo1pWPDw6+Uoroqfr/l6CjODxasf9x+A68oSUBdqwPJXNhiyWZu2PM/WasaVeJW+3CO5/ZtcVX1a4cNawmlrsv1F3c2we6lmTwAw==</Хранилище>
<ТекстФайла>AQEIAAAAAAAAAO+7v3siVSJ9</ТекстФайла>
</CatalogObject.ХранилищеДополнительнойИнформации>
...
Рейтинг: 0 / 0
17.09.2010, 10:30
    #36851726
Программист 1с
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присвоить строке тип хранлище значений?
Есть строка - она точно содержит в себе картинку - фактическу нужно выполнить только методо строка.получить(). Но проблема в том что тип(Строка)- это строка а не хранилище значений.

Преамбула. Включаем версионирование объектов. Включаем его и для справочника - хранилище дополнительной информации. В одном из элементов справочника содержится картинка. И по сути получается что картинка первый раз упакована в хранилище значений в этом элементе справочника. Второй раз в регистре сведений версии объектов (там тоже тип хранилище значений). Но когда мы извлекаем из регистра сведений .получить() получаем все с типом строка... Задача как раз в том чтобы присвоить этой строке тип хранилище значений и еще раз воспользоваться методом получить.

Ниже приведен пример - как выглядит информация полученная из регистра сведений после метода .получить(). Побайтно сравнивал с картинкой - не то
...
Рейтинг: 0 / 0
17.09.2010, 11:11
    #36851809
Нет реги
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присвоить строке тип хранлище значений?
Код: plaintext
1.
2.
3.
4.
5.
6.
	Картинка = Новый Картинка("C:\1.bmp");
	Сжатие = Новый СжатиеДанных( 1 );
	ХранилищеЗначенияПервогоУровня = Новый ХранилищеЗначения(Картинка, Сжатие);
	ХранилищеЗначенияВторогоУровня = Новый ХранилищеЗначения(ХранилищеЗначенияПервогоУровня, Сжатие);
	
	ЭлементыФормы.ПолеКартинки.Картинка = ХранилищеЗначенияВторогоУровня.Получить().Получить();

Так работает, значит дело не в хранилище.
...
Рейтинг: 0 / 0
17.09.2010, 12:13
    #36851938
Нет реги
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присвоить строке тип хранлище значений?
З.Ы.
Сдается мне, что если получать значение через ПрочитатьXML(), то в полученном объекте хранилище значения будет именно хранилищем, а не строкой.
...
Рейтинг: 0 / 0
17.09.2010, 12:41
    #36852010
Программист 1с
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присвоить строке тип хранлище значений?
Нет региЗ.Ы.
Сдается мне, что если получать значение через ПрочитатьXML(), то в полученном объекте хранилище значения будет именно хранилищем, а не строкой.Думал уже об этом. Тип то задан "<ТекстФайла>", а если не задан - то попробовать самому вписать тег. Вечером опробую.
...
Рейтинг: 0 / 0
20.09.2010, 12:51
    #36855222
Программист 1с
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присвоить строке тип хранлище значений?
// Процедура считывает данные XML из файла и заполняет структуры данных
//
// Возвращаемое значение:
// Структура, содержащая два соответствия: ТабличныеЧасти, Реквизиты
// Структура хранения данных:
// Соответствие ТабличныеЧасти, которое содержит в себе значения табличных частей
// формат:
// СоответствиеИмя1 -> ТаблицаЗначений1
// | | ... |
// Поле1 Поле2 ПолеM1
//
// СоответствиеИмя2 -> ТаблицаЗначений2
// | | ... |
// Поле1 Поле2 ПолеM2
//
//
// СоответствиеИмяN -> ТаблицаЗначенийN
// | | ... |
// Поле1 Поле2 ПолеM3
//
// Соответствие ЗначенияРеквизитов
// ИмяРеквизита1 -> Значение1
// ИмяРеквизита2 -> Значение2
// ...
// ИмяРеквизитаN -> ЗначениеN
//
Функция РазборПредставленияОбъектаXML(СтрокаXML, Ссылка)

// содержит имя метаданного измененного объекта
Перем ИмяОбъекта;

// Содержит положение маркера в дереве XML.
// Требуется для идентификации текущего элемента.
Перем УровеньЧтения;

// Содержат значения реквизитов справочников / документов
ЗначенияРеквизитов = Новый ТаблицаЗначений;

ЗначенияРеквизитов.Колонки.Добавить("НаименованиеРеквизита");
ЗначенияРеквизитов.Колонки.Добавить("ЗначениеРеквизита");
ЗначенияРеквизитов.Колонки.Добавить("ТипРеквизита");

ТабличныеЧасти = Новый Соответствие;

ЧтениеXML = Новый ЧтениеXML;

ЧтениеXML.УстановитьСтроку(СтрокаXML);

// уровень позиции маркера в иерархии XML:
// 0 - уровень не задан
// 1 - первый элемент (имя объекта)
// 2 - описание реквизита или табличной части
// 3 - описание строки табличной части
// 4 - описание поля строки табличной части
УровеньЧтения = 0;

ТабличныеЧастиМТД = Ссылка.Метаданные().ТабличныеЧасти;

ТипЗначения = "";

// основной цикл разбора по XML
Пока ЧтениеXML.Прочитать() Цикл

Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
УровеньЧтения = УровеньЧтения + 1;
Если УровеньЧтения = 1 Тогда // указатель на первом элементе XML - корень XML
ИмяОбъекта = ЧтениеXML.Имя;
ИначеЕсли УровеньЧтения = 2 Тогда // указатель на втором уровне - это реквизит или имя табличной части
ИмяРеквизита = ЧтениеXML.Имя;
Если ТабличныеЧастиМТД.Найти(ИмяРеквизита) <> Неопределено Тогда
ИмяТабличнойЧасти = ИмяРеквизита;
// создаем новую таблицу значений в таблице соответствий
Если ТабличныеЧасти[ИмяТабличнойЧасти] = Неопределено Тогда
ТабличныеЧасти.Вставить(ИмяТабличнойЧасти, Новый ТаблицаЗначений);
КонецЕсли;
КонецЕсли;
НовоеЗР = ЗначенияРеквизитов.Добавить();
НовоеЗР.НаименованиеРеквизита = ИмяРеквизита;

Если ЧтениеXML.КоличествоАтрибутов() > 0 Тогда
Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.Атрибут
И ЧтениеXML.Имя = "xsi:type" Тогда
НовоеЗР.ТипРеквизита = ЧтениеXML.Значение;
КонецЕсли;
КонецЦикла;
КонецЕсли;

ИначеЕсли (УровеньЧтения = 3) и (ЧтениеXML.Имя = "Row") Тогда // указатель на поле табличной части
ТабличныеЧасти[ИмяТабличнойЧасти].Добавить();
ИначеЕсли УровеньЧтения = 4 Тогда // указатель на поле табличной части

ИмяПоляТЧ = ЧтениеXML.Имя; //
Таблица = ТабличныеЧасти[ИмяТабличнойЧасти];
Если Таблица.Колонки.Найти(ИмяПоляТЧ)= Неопределено Тогда
Таблица.Колонки.Добавить(ИмяПоляТЧ);
КонецЕсли;

КонецЕсли;
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
УровеньЧтения = УровеньЧтения - 1;
ТипЗначения = "";
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
Если (УровеньЧтения = 2) Тогда // значение реквизита
НовоеЗР.ЗначениеРеквизита = ЧтениеXML.Значение;
//ЗначенияРеквизитов[ИмяРеквизита] = ЧтениеXML.Значение;

ИначеЕсли (УровеньЧтения = 4) Тогда // значение реквизита
ПоследняяСтрока = ТабличныеЧасти[ИмяТабличнойЧасти].Получить(ТабличныеЧасти[ИмяТабличнойЧасти].Количество()-1);
ПоследняяСтрока[ИмяПоляТЧ] = ЧтениеXML.Значение;
КонецЕсли;
КонецЕсли;
КонецЦикла;

// 2-й этап: из списка реквизитов исключаем табличные части
Для Каждого Элемент Из ТабличныеЧасти Цикл
ЗначенияРеквизитов.Удалить(ЗначенияРеквизитов.Найти(Элемент.Ключ));
КонецЦикла;
//ТабличныеЧастиМТД
Для Каждого ЭлементСоответствия Из ТабличныеЧасти Цикл
Таблица = ЭлементСоответствия.Значение;
Если Таблица.Колонки.Количество() = 0 Тогда
ТаблицаМТД = ТабличныеЧастиМТД.Найти(ЭлементСоответствия.Ключ);
Если ТаблицаМТД <> Неопределено Тогда
Для Каждого ОписаниеКолонки Из ТаблицаМТД.Реквизиты Цикл
Если Таблица.Колонки.Найти(ОписаниеКолонки.Имя)= Неопределено Тогда
Таблица.Колонки.Добавить(ОписаниеКолонки.Имя);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;

Результат = Новый Структура;
Результат.Вставить("Реквизиты", ЗначенияРеквизитов);
Результат.Вставить("ТабличныеЧасти", ТабличныеЧасти);

Возврат Результат;

КонецФункции
...
Рейтинг: 0 / 0
20.09.2010, 12:52
    #36855231
Программист 1с
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присвоить строке тип хранлище значений?
Не помогает. При считывании, Хранилище всегда имеет тип строка.

Интересно а встроенный парсер - по логике должен уметь распознавать тип....
...
Рейтинг: 0 / 0
20.09.2010, 13:38
    #36855383
Нет реги
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присвоить строке тип хранлище значений?
Через ПрочитатьXML() - это и есть встроенный парсер. Версии объектов сериализуются целиком, а не пишутся пореквизитно.
...
Рейтинг: 0 / 0
20.09.2010, 13:41
    #36855391
Нет реги
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присвоить строке тип хранлище значений?
Там же:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
// Восстанавливает сериализованный в XML объект. 
// Параметры
// ИмяФайла - строка - путь к файлу, в котором хранится сериализованное 
//                     представление объекта
//
Функция ПолучитьОбъектИзXML(СтрокаXML)
	
	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(СтрокаXML);
	Если ЧтениеXML.Прочитать() Тогда
		Если ВозможностьЧтенияXML(ЧтениеXML) Тогда
			Объект = ПрочитатьXML(ЧтениеXML);
			ЧтениеXML.Закрыть();
			Возврат Объект;
		Иначе
			ЧтениеXML.Закрыть();
			ВызватьИсключение НСтр("ru = 'Ошибка при восстановлении объекта'");
		КонецЕсли;
	Иначе
		ЧтениеXML.Закрыть();
		ВызватьИсключение НСтр("ru = 'Ошибка чтения данных'");
	КонецЕсли;
	
КонецФункции
...
Рейтинг: 0 / 0
20.09.2010, 13:56
    #36855432
Нет реги
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присвоить строке тип хранлище значений?
З.Ы. В самом XML-представлении нет необходимости задавать тип значения реквизита т.к. оно будет прочитано ровно в той же конфигурации, в какой и записывалось. Поэтому он (тип) там и не задан.
...
Рейтинг: 0 / 0
20.09.2010, 15:21
    #36855624
Программист 1с
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присвоить строке тип хранлище значений?
Нет региЧерез ПрочитатьXML() - это и есть встроенный парсер. Версии объектов сериализуются целиком, а не пишутся пореквизитно.Хм попробую.
...
Рейтинг: 0 / 0
Форумы / [игнор отключен] [закрыт для гостей] / Как присвоить строке тип хранлище значений? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]