8.х Поместить файл в базу

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

  1. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    Надо поместить файл в базу. Есть кнопка на форме справочника. По ней должен загружаться файл ексель. Пока написала это
    Код:
    &НаКлиенте
    Процедура ЗагрузитьВБазу(Команда)
        АдресВХранилище = "";
        ВыбранноеИмяФайла = "";
        Если ПоместитьФайл(АдресВХранилище, , ВыбранноеИмяФайла
            , , УникальныйИдентификатор) Тогда
            Файл = Новый Файл(ВыбранноеИмяФайла);
            ИмяФайла = Файл.Имя;
            СсылкаНаФайлВоВременномХранилище = АдресВХранилище;
            Модифицированность = Истина;
        КонецЕсли;
        Объект.ИмяФайла = ИмяФайла;     
    КонецПроцедуры
    
    Это я просто записала в справочник, в имя файла. А как дальше? Спасибо.
  2. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    Переделала.
    Код:
    &НаКлиенте
    Процедура ЗагрузитьВБазу(Команда)
        Перем ВыбранноеИмя;
        Перем АдресВременногоХранилища;
        АдресВХранилище = "";
            НовыйОбъект = Объект.Ссылка.Пустая();
        Если ПоместитьФайл(АдресВременногоХранилища, "", ВыбранноеИмя, Истина) Тогда
            Объект.ИмяФайла = ВыбранноеИмя;
            ПоместитьФайлОбъекта(АдресВременногоХранилища);
        КонецЕсли;
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ОткрытьФайл(Команда)
        Адрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка,"ФайлОписания");
        ПолучитьФайл(Адрес, Объект.ИмяФайла, Истина);   
    КонецПроцедуры
    
    &НаСервере
    Процедура ПоместитьФайлОбъекта(АдресВременногоХранилища)
        ЭлементСправочника = РеквизитФормыВЗначение("Объект");
        ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
        ЭлементСправочника.ФайлОписания = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных());
        Файл = Новый Файл(ЭлементСправочника.ИмяФайла);
        ЭлементСправочника.ИмяФайла = Файл.Имя;
        ЭлементСправочника.Записать();
        Модифицированность = Ложь;
        УдалитьИзВременногоХранилища(АдресВременногоХранилища);
        ЗначениеВРеквизитФормы(ЭлементСправочника, "Объект");
    КонецПроцедуры
    
    Так работает. Но теперь другая проблема. Этот файл должен открываться из всех элементов справочника одинаковый. Т.е. он один на всю базу.
  3. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    Решила вынести в константы. Начала с имя файла. Но не работает, выдает ошибку. {Справочник.Товарищи.Форма.ФормаЭлемента.Форма(2163)}: Ошибка при вызове метода контекста (ПолучитьФайл)
    ПолучитьФайл(Адрес, ПолучитьКонстантуНаСервере(), Истина);
    по причине:
    Неправильный путь к файлу 'e1c://filev/C/Users/я/Documents/InfoBase/e1cib/data/Справочник.Товарищи.Файл?ref=a537000a5e6556ac11de071cce2e4
    Вот такой у меня код.
    Код:
    Процедура ЗагрузитьВБазу(Команда)
        Перем ВыбранноеИмя;
        Перем АдресВременногоХранилища;
        АдресВХранилище = "";
        Если ПоместитьФайл(АдресВременногоХранилища, "", ВыбранноеИмя, Истина) Тогда
            УстановитьКонстантуНаСервере(ВыбранноеИмя);
            ПоместитьФайлОбъекта(АдресВременногоХранилища);
        КонецЕсли;
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ОткрытьФайл(Команда)
        Адрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка,"ФайлОписания");
        ПолучитьФайл(Адрес, ПолучитьКонстантуНаСервере(), Истина);
    КонецПроцедуры
    
    &НаСервере
    Процедура ПоместитьФайлОбъекта(АдресВременногоХранилища)
        ЭлементСправочника = РеквизитФормыВЗначение("Объект");
        ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
        ЭлементСправочника.ФайлОписания = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных());
        Файл = Новый Файл(Константы.ИмяФайлаКлиента.Получить());
        Константы.ИмяФайлаКлиента.Установить(Файл.Имя);
        ЭлементСправочника.Записать();
        Модифицированность = Ложь;
        УдалитьИзВременногоХранилища(АдресВременногоХранилища);
        ЗначениеВРеквизитФормы(ЭлементСправочника, "Объект");
    КонецПроцедуры
    
    &НаСервере
    Процедура УстановитьКонстантуНаСервере(ВыбранноеИмя)
        Константы.ИмяФайлаКлиента.Установить(ВыбранноеИмя);
    КонецПроцедуры
    
    &НаСервере
    Функция ПолучитьКонстантуНаСервере()
        Возврат Константы.ИмяФайлаКлиента.Получить()
    КонецФункции
  4. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    Блин, совсем замучилась. Перенесла и имя файла и сам файл в константы. Но не работает. Та же самая ошибка.
    Сейчас такой код.
    Код:
    &НаКлиенте
    Процедура ЗагрузитьВБазу(Команда)   
        Перем ВыбранноеИмя;
        Перем АдресВременногоХранилища;
        АдресВХранилище = "";
        НовыйОбъект = Объект.Ссылка.Пустая();
        Если ПоместитьФайл(АдресВременногоХранилища, "", ВыбранноеИмя, Истина) Тогда
            УстановитьКонстантуНаСервере(ВыбранноеИмя);
            ПоместитьФайлОбъекта(АдресВременногоХранилища);
        КонецЕсли;
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ОткрытьФайл(Команда)
        Адрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ФайлОписания");
        ПолучитьФайл(Адрес, ПолучитьКонстантуНаСервере(), Истина);
    КонецПроцедуры
    
    &НаСервере
    Процедура ПоместитьФайлОбъекта(АдресВременногоХранилища)
        ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
        Константы.ХранилищеЗначенияКлиента.Установить(Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных()));
        Файл = Новый Файл(Константы.ИмяФайлаКлиента.Получить());
        Константы.ИмяФайлаКлиента.Установить(Файл.Имя);
        УдалитьИзВременногоХранилища(АдресВременногоХранилища);
    КонецПроцедуры
    
    &НаСервереБезКонтекста
    Процедура УстановитьКонстантуНаСервере(ВыбранноеИмя)
        Константы.ИмяФайлаКлиента.Установить(ВыбранноеИмя);
    КонецПроцедуры
    
    &НаСервере
    Функция ПолучитьКонстантуНаСервере()
        Возврат Константы.ИмяФайлаКлиента.Получить()
    КонецФункции
    
  5. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Из всего этого пока не понятно: нужно хранить имя файла, сам файл или оба значения?
  6. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    По идее нужно 2 значения. Потому что файл может перезаписываться. Ну там внесли изменения и записали новый. Я не могу понять, почему когда все хранилось в самом справочнике, в элементе справочника все работало..А когда я перенесла в константы - нет..
  7. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Если поменяют имя файла без замены содержимого файла - не важно?

    А какой код использовался раньше?
    Последнее редактирование: 21 янв 2016
  8. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    Нет, надо все менять и сам файл и название.
    Вот такой код был раньше. И он работал.
    Код:
    &НаКлиенте
    Процедура ЗагрузитьВБазу(Команда)
        Перем ВыбранноеИмя;
        Перем АдресВременногоХранилища;
        АдресВХранилище = "";
            НовыйОбъект = Объект.Ссылка.Пустая();
        Если ПоместитьФайл(АдресВременногоХранилища, "", ВыбранноеИмя, Истина) Тогда
            Объект.ИмяФайла = ВыбранноеИмя;
            ПоместитьФайлОбъекта(АдресВременногоХранилища);
        КонецЕсли;
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ОткрытьФайл(Команда)
        Адрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка,"ФайлОписания");
        ПолучитьФайл(Адрес, Объект.ИмяФайла, Истина);  
    КонецПроцедуры
    
    &НаСервере
    Процедура ПоместитьФайлОбъекта(АдресВременногоХранилища)
        ЭлементСправочника = РеквизитФормыВЗначение("Объект");
        ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
        ЭлементСправочника.ФайлОписания = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных());
        Файл = Новый Файл(ЭлементСправочника.ИмяФайла);
        ЭлементСправочника.ИмяФайла = Файл.Имя;
        ЭлементСправочника.Записать();
        Модифицированность = Ложь;
        УдалитьИзВременногоХранилища(АдресВременногоХранилища);
        ЗначениеВРеквизитФормы(ЭлементСправочника, "Объект");
    КонецПроцедуры
  9. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Что содержится в ДвоичныеДанные после:

    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);

    ?
  10. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    Если строка
    УстановитьКонстантуНаСервере(ВыбранноеИмя) закомментарена, то
    двоичные данные. Значение - 50 4B 03 04 14 00 06 00 ... Тип - ДвоичныеДанные". А если нет комментария, то пусто.
    Последнее редактирование: 21 янв 2016
  11. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Внимательно прочитайте С-П про ПоместитьФайл на тему времени жизнии помещенного во временное хранилище значения.
  12. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    Я делала и без серверного вызова. Просто писала имя файла. Но тоже не открывается.
    --- Объединение сообщений, 21 янв 2016 ---
    Вот так писала. Все одно.
    Файл = "Книга1.xlsx";
    Адрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ФайлОписания");
    ПолучитьФайл(Адрес, Файл, Истина);
    Так, а у меня же нет ПоместитьФайл.
  13. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Что значит "без серверного вызова. Просто писала имя файла"?
    Как код выглядел при этом?
  14. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    Выше написала.

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