8.х Хранилище значения в ТЧ Справочника

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем FLoYD777, 21 фев 2012.

  1. TopicStarter Overlay
    FLoYD777
    Offline

    FLoYD777 Опытный в 1С

    Регистрация:
    4 май 2009
    Сообщения:
    118
    Симпатии:
    0
    Баллы:
    26
    Доброго времени суток!!
    Просмотрел кучу похожих тем, но на свой вопрос так и не смог ответить.

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

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


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


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

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

    Где у меня ошибка?
  2. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Это никак не номер строки! Это ИДЕНТИФИКАТОР (sic!) строки.
    Код:
    НомерСтроки = Элементы.Вложения.ТекущиеДанные.ПолучитьИдентификатор();
    Поэтому вообще не очень понятно, как у Вас там что-то работает.
  3. TopicStarter Overlay
    FLoYD777
    Offline

    FLoYD777 Опытный в 1С

    Регистрация:
    4 май 2009
    Сообщения:
    118
    Симпатии:
    0
    Баллы:
    26
    Если я ставлю точку останова на
    Код:
    ПолучитьФайл(СсылкаНаФайлВИБ, Объект.Вложения[НомерСтроки].ИмяФайла);
    то значения переменных такие:
    Объект.Ссылка = 00000000009 ТИП - СправочникСсылка.Компоненты
    СсылкаНаФайлВИБ = "e1cib/data/Справочник.Компоненты.Вложения.ДанныеФайла?ref="ac08b870f4abd58011e15c0ef6abff7b"&index=1" ТИП - Строка
    Объект.Вложения[НомерСтроки].ИмяФайла = "nsMess.ctk" ТИП - Строка
  4. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
  5. TopicStarter Overlay
    FLoYD777
    Offline

    FLoYD777 Опытный в 1С

    Регистрация:
    4 май 2009
    Сообщения:
    118
    Симпатии:
    0
    Баллы:
    26
    Хорошо, нужно написать вот так:
    Код:
    НомерСтроки = Элементы.Вложения.ТекущаяСтрока;
    Правильно?
  6. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Нет, неправильно.
    По полученному идентификатору нужно получить индекс в коллекции.
    Кстати, а сколько всего строк в коллекции (ТЧ)?
  7. TopicStarter Overlay
    FLoYD777
    Offline

    FLoYD777 Опытный в 1С

    Регистрация:
    4 май 2009
    Сообщения:
    118
    Симпатии:
    0
    Баллы:
    26
    В ТЧ 2 строки
  8. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Обратите внимание, что первая строка в ТЧ имеет индекс 0, таким образом - Вы по индексу 1 получите строку №2
    А вообще - не очень понятно, в чем тут Вас проблема.
    Попробуйте сделать мини конфу и воспроизвести эту ситуацию и выкладывайте ее.
  9. TopicStarter Overlay
    FLoYD777
    Offline

    FLoYD777 Опытный в 1С

    Регистрация:
    4 май 2009
    Сообщения:
    118
    Симпатии:
    0
    Баллы:
    26
    я понимаю что первая строка в ТЧ имеет индекс 0. Я и выгружаю 2 строку которая имеет индекс 1.
    в основной базе так и не получилось уладить эту ошибку, поэтому я взял и создал пустую конфу и начал пробовать.
    вот могу привести весь код:
    Код:
    &НаСервере
    Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    
    ЭлементСправочника = РеквизитФормыВЗначение("Объект");
    Для каждого ТекСтрока Из ЭлементСправочника.Вложения Цикл
    Если ЭтоАдресВременногоХранилища(ТекСтрока.АдресВременногоХранилища) Тогда
    Данные			    = ПолучитьИзВременногоХранилища(ТекСтрока.АдресВременногоХранилища);
    ХЗ				    = Новый ХранилищеЗначения(Данные);
    ТекСтрока.ДанныеФайла = ХЗ;
    КонецЕсли;
    КонецЦикла;
    ЗначениеВРеквизитФормы(ЭлементСправочника, "Объект");
    
    КонецПроцедуры
    &НаСервере
    Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    
    Для каждого ТекСтрока Из Объект.Вложения Цикл
    Если ЭтоАдресВременногоХранилища(ТекСтрока.АдресВременногоХранилища) Тогда   
    УдалитьИзВременногоХранилища(ТекСтрока.АдресВременногоХранилища);
    ТекСтрока.АдресВременногоХранилища = "";
    КонецЕсли;
    КонецЦикла;
    
    КонецПроцедуры
    &НаКлиенте
    Процедура ДобавитьКомпоненту(Команда)
    
    АдресВХранилище = "";
    ВыбранноеИмяФайла = "";
    
    Если ПоместитьФайл(АдресВХранилище, , ВыбранноеИмяФайла, , УникальныйИдентификатор) Тогда
    
    Файл = Новый Файл(ВыбранноеИмяФайла);
    
    ТекСтрока						  = Объект.Вложения.Добавить();
    ТекСтрока.Версия				   = "1.0." + Строка(ТекСтрока.ПолучитьИдентификатор() + 1);
    ТекСтрока.ДатаФайла			    = ТекущаяДата();
    ТекСтрока.ИмяФайла				 = Файл.Имя;
    ТекСтрока.АдресВременногоХранилища = АдресВХранилище;
    
    Модифицированность = Истина;
    
    КонецЕсли;
    
    КонецПроцедуры
    &НаКлиенте
    Процедура СохранитьКомпоненту(Команда)
    
    НомерСтроки = Элементы.Вложения.ТекущиеДанные.ПолучитьИдентификатор();
    
    Если Объект.Вложения[НомерСтроки].ИмяФайла = "" Тогда
    Предупреждение("Нет сохраненного в базе файла");
    Иначе
    СсылкаНаФайлВИБ = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Вложения.ДанныеФайла",НомерСтроки);
    ПолучитьФайл(СсылкаНаФайлВИБ, Объект.Вложения[НомерСтроки].ИмяФайла);
    КонецЕсли;
    КонецПроцедуры
  10. TopicStarter Overlay
    FLoYD777
    Offline

    FLoYD777 Опытный в 1С

    Регистрация:
    4 май 2009
    Сообщения:
    118
    Симпатии:
    0
    Баллы:
    26
    я все равно не понимаю!!!
    Код:
    НомерСтроки = Элементы.Вложения.ТекущаяСтрока;
    я получаю идентификатор строки
    если это первая строка, то значение его = 0
    если вторая строка, то значение его = 1
    и все значения строки берутся правильно и наименование файла и все прочее...
    для чего мне необходимо получать индекс строки??
    и вообще представим что я получил индекс строки на второй строке он так же будет равен 1... и что!? это ведь не меняет ситуацию!?!?
  11. TopicStarter Overlay
    FLoYD777
    Offline

    FLoYD777 Опытный в 1С

    Регистрация:
    4 май 2009
    Сообщения:
    118
    Симпатии:
    0
    Баллы:
    26
    Добрый день)
    Не было времени написать, проблему решил!
    Вот код: :)

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

Поделиться этой страницей