Перейти к содержимому


- - - - -

(РЕШЕНО) Хранилище значения в ТЧ Справочника


Сообщений в теме: 10

#1 FLoYD777

    Частый гость


  • 121 сообщений

Отправлено 21 февраля 2012 - 14:29

Доброго времени суток!!
Просмотрел кучу похожих тем, но на свой вопрос так и не смог ответить.

У меня с нуля написанная конфигурация. Работающая на платформе 8.2.
Управляемые формы и все остальное.

Есть справочник «Компоненты» и табличная часть «Вложения» с реквизитом «ДанныеФайла» с типом «ХранилищеЗначения».
Сохранить данные в базе мне удалось. А вот выгрузить нужные файлы не получилось.
Вот код процедуры сохранения файла на диск:


&НаКлиенте
Процедура СохранитьКомпоненту(Команда)

НомерСтроки = Элементы.Вложения.ТекущиеДанные.ПолучитьИдентификатор();
Если Объект.Вложения[НомерСтроки].ИмяФайла = "" Тогда
  Предупреждение("Нет сохраненного в базе файла");
Иначе
  СсылкаНаФайлВИБ = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Вложения.ДанныеФайла",НомерСтроки);
  ПолучитьФайл(СсылкаНаФайлВИБ, Объект.Вложения[НомерСтроки].ИмяФайла);
КонецЕсли;[/font]
[font="Arial, sans-serif"]КонецПроцедуры


При выполнении процедуры открывает окно с выбором каталога куда сохранять, указываю каталог и нажимаю ОК и получаю ошибку:

{Справочник.Компоненты.Форма.ФормаЭлемента.Форма(94)}: Ошибка при вызове метода контекста (ПолучитьФайл)
ПолучитьФайл(СсылкаНаФайлВИБ, Объект.Вложения[НомерСтроки].ИмяФайла);
по причине:
Ошибка при выполнении файловой операции '/e1cib/data/Справочник.Компоненты.Вложения.ДанныеФайла?ref="ac08b870f4abd58011e15c0ef6abff7b"&index=1'

Где у меня ошибка?

Сообщение отредактировал FLoYD777: 21 февраля 2012 - 14:31


#2 BabySG

    Любитель программирования


  • 12 211 сообщений

Отправлено 21 февраля 2012 - 14:42

Это никак не номер строки! Это ИДЕНТИФИКАТОР (sic!) строки.
НомерСтроки = Элементы.Вложения.ТекущиеДанные.ПолучитьИдентификатор();

Поэтому вообще не очень понятно, как у Вас там что-то работает.
Ничто так сильно не укрепляет веру в человека, как ПРЕДОПЛАТА!

#3 FLoYD777

    Частый гость


  • 121 сообщений

Отправлено 21 февраля 2012 - 14:43

Если я ставлю точку останова на
ПолучитьФайл(СсылкаНаФайлВИБ, Объект.Вложения[НомерСтроки].ИмяФайла);

то значения переменных такие:
Объект.Ссылка = 00000000009 ТИП - СправочникСсылка.Компоненты
СсылкаНаФайлВИБ = "e1cib/data/Справочник.Компоненты.Вложения.ДанныеФайла?ref="ac08b870f4abd58011e15c0ef6abff7b"&index=1" ТИП - Строка
Объект.Вложения[НомерСтроки].ИмяФайла = "nsMess.ctk" ТИП - Строка

#4 BabySG

    Любитель программирования


  • 12 211 сообщений

Отправлено 21 февраля 2012 - 14:43

Цитата

ПолучитьИдентификатор (GetID)

Синтаксис:
ПолучитьИдентификатор()

Возвращаемое значение:
Тип: Число.

Описание:
Получает идентификатор для элемента коллекции. Этот идентификатор не привязан к позиции элемента в коллекции.

Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент.

Ничто так сильно не укрепляет веру в человека, как ПРЕДОПЛАТА!

#5 FLoYD777

    Частый гость


  • 121 сообщений

Отправлено 21 февраля 2012 - 14:49

Просмотр сообщенияBabySG (21 февраля 2012 - 14:43) писал:


Хорошо, нужно написать вот так:
НомерСтроки = Элементы.Вложения.ТекущаяСтрока;
Правильно?

#6 BabySG

    Любитель программирования


  • 12 211 сообщений

Отправлено 21 февраля 2012 - 15:03

Нет, неправильно.
По полученному идентификатору нужно получить индекс в коллекции.
Кстати, а сколько всего строк в коллекции (ТЧ)?
Ничто так сильно не укрепляет веру в человека, как ПРЕДОПЛАТА!

#7 FLoYD777

    Частый гость


  • 121 сообщений

Отправлено 21 февраля 2012 - 15:09

Просмотр сообщенияBabySG (21 февраля 2012 - 15:03) писал:

Нет, неправильно.
По полученному идентификатору нужно получить индекс в коллекции.
Кстати, а сколько всего строк в коллекции (ТЧ)?

В ТЧ 2 строки

#8 BabySG

    Любитель программирования


  • 12 211 сообщений

Отправлено 21 февраля 2012 - 15:15

Обратите внимание, что первая строка в ТЧ имеет индекс 0, таким образом - Вы по индексу 1 получите строку №2
А вообще - не очень понятно, в чем тут Вас проблема.
Попробуйте сделать мини конфу и воспроизвести эту ситуацию и выкладывайте ее.
Ничто так сильно не укрепляет веру в человека, как ПРЕДОПЛАТА!

#9 FLoYD777

    Частый гость


  • 121 сообщений

Отправлено 21 февраля 2012 - 15:20

Просмотр сообщенияBabySG (21 февраля 2012 - 15:15) писал:

Обратите внимание, что первая строка в ТЧ имеет индекс 0, таким образом - Вы по индексу 1 получите строку №2
А вообще - не очень понятно, в чем тут Вас проблема.
Попробуйте сделать мини конфу и воспроизвести эту ситуацию и выкладывайте ее.

я понимаю что первая строка в ТЧ имеет индекс 0. Я и выгружаю 2 строку которая имеет индекс 1.
в основной базе так и не получилось уладить эту ошибку, поэтому я взял и создал пустую конфу и начал пробовать.
вот могу привести весь код:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

ЭлементСправочника = РеквизитФормыВЗначение("Объект");
Для каждого ТекСтрока Из ЭлементСправочника.Вложения Цикл
	    Если ЭтоАдресВременногоХранилища(ТекСтрока.АдресВременногоХранилища) Тогда
		    Данные			    = ПолучитьИзВременногоХранилища(ТекСтрока.АдресВременногоХранилища);
		    ХЗ				    = Новый ХранилищеЗначения(Данные);
		    ТекСтрока.ДанныеФайла = ХЗ;
	    КонецЕсли;
КонецЦикла;
ЗначениеВРеквизитФормы(ЭлементСправочника, "Объект");

КонецПроцедуры
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

Для каждого ТекСтрока Из Объект.Вложения Цикл
	    Если ЭтоАдресВременногоХранилища(ТекСтрока.АдресВременногоХранилища) Тогда   
		    УдалитьИзВременногоХранилища(ТекСтрока.АдресВременногоХранилища);
   ТекСтрока.АдресВременногоХранилища = "";
	    КонецЕсли;
КонецЦикла;

КонецПроцедуры
&НаКлиенте
Процедура ДобавитьКомпоненту(Команда)

АдресВХранилище = "";
ВыбранноеИмяФайла = "";

Если ПоместитьФайл(АдресВХранилище, , ВыбранноеИмяФайла, , УникальныйИдентификатор) Тогда
 
  Файл = Новый Файл(ВыбранноеИмяФайла);
 
  ТекСтрока						  = Объект.Вложения.Добавить();
  ТекСтрока.Версия				   = "1.0." + Строка(ТекСтрока.ПолучитьИдентификатор() + 1);
  ТекСтрока.ДатаФайла			    = ТекущаяДата();
  ТекСтрока.ИмяФайла				 = Файл.Имя;
  ТекСтрока.АдресВременногоХранилища = АдресВХранилище;
 
  Модифицированность = Истина;
 
КонецЕсли;

КонецПроцедуры
&НаКлиенте
Процедура СохранитьКомпоненту(Команда)

НомерСтроки = Элементы.Вложения.ТекущиеДанные.ПолучитьИдентификатор();

Если Объект.Вложения[НомерСтроки].ИмяФайла = "" Тогда
  Предупреждение("Нет сохраненного в базе файла");
Иначе
  СсылкаНаФайлВИБ = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Вложения.ДанныеФайла",НомерСтроки);
  ПолучитьФайл(СсылкаНаФайлВИБ, Объект.Вложения[НомерСтроки].ИмяФайла);
КонецЕсли;
КонецПроцедуры


#10 FLoYD777

    Частый гость


  • 121 сообщений

Отправлено 21 февраля 2012 - 15:53

я все равно не понимаю!!!
НомерСтроки = Элементы.Вложения.ТекущаяСтрока;
я получаю идентификатор строки
если это первая строка, то значение его = 0
если вторая строка, то значение его = 1
и все значения строки берутся правильно и наименование файла и все прочее...
для чего мне необходимо получать индекс строки??
и вообще представим что я получил индекс строки на второй строке он так же будет равен 1... и что!? это ведь не меняет ситуацию!?!?

#11 FLoYD777

    Частый гость


  • 121 сообщений

Отправлено Вчера, 10:50

Добрый день)
Не было времени написать, проблему решил!
Вот код: :)

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

Для каждого ТекСтрока Из ТекущийОбъект.Вложения Цикл
  Если ЭтоАдресВременногоХранилища(ТекСтрока.АдресВременногоХранилища) Тогда
   Данные			    = ПолучитьИзВременногоХранилища(ТекСтрока.АдресВременногоХранилища);
   ХЗ				    = Новый ХранилищеЗначения(Данные);
   ТекСтрока.ДанныеФайла = ХЗ;
  КонецЕсли;
КонецЦикла;

КонецПроцедуры
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
 
Для каждого ТекСтрока Из Объект.Вложения Цикл
	    Если ЭтоАдресВременногоХранилища(ТекСтрока.АдресВременногоХранилища) Тогда   
		    УдалитьИзВременногоХранилища(ТекСтрока.АдресВременногоХранилища);
   ТекСтрока.АдресВременногоХранилища = "";
	    КонецЕсли;
КонецЦикла;

КонецПроцедуры
&НаКлиенте
Процедура Загрузить(Команда)

АдресВХранилище   = "";
ВыбранноеИмяФайла = "";
Если ПоместитьФайл(АдресВХранилище, , ВыбранноеИмяФайла, , УникальныйИдентификатор) Тогда
  Файл							   = Новый Файл(ВыбранноеИмяФайла);
  ТекСтрока						  = Объект.Вложения.Добавить();
  ТекСтрока.Версия				   = "1.0." + Строка(ТекСтрока.ПолучитьИдентификатор() + 1);
  ТекСтрока.ДатаФайла			    = ТекущаяДата();
  ТекСтрока.ИмяФайла				 = Файл.Имя;
  ТекСтрока.АдресВременногоХранилища = АдресВХранилище;
 
  Модифицированность = Истина; 
КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура Выгрузить(Команда)

НомерСтроки = Элементы.Вложения.ТекущаяСтрока;
Если Объект.Вложения[НомерСтроки].ИмяФайла = "" Тогда
  Предупреждение("Нет сохраненного в базе файла");
Иначе
  СсылкаНаФайлВИБ = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Вложения.ДанныеФайла",НомерСтроки);
  ПолучитьФайл(СсылкаНаФайлВИБ, Объект.Вложения[НомерСтроки].ИмяФайла);
КонецЕсли;

КонецПроцедуры






Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных