Здравствуйте.
Имеется табличная часть, один из реквизитов которой имеет тип ХранилищеЗначения. Задача помещать файлы в данный реквизит без обязательной записи в базу.
Как видим, объект записывается автоматически в процедуре ОбработатьНаСервере, если убрать из этой процедуры ДокументОбъект.Записать(), тогда при нажатии кнопки записи, реквизиты ИмяФайла,и РасширениеФайла сохраняются, а вот реквизит Файл с типом ХранилищеЗначения - нет.
Тут дилемма, с одной стороны хочется дать возможность пользователю не сохранять сделанные изменения, а с другой - все таки хранить в базе присоединенные файлы.
Да, можно заполнять реквизит Файл в событии ПриЗаписи, но я не понимаю как передать туда несколько адресов из временного хранилища - вдруг пользователь добавил не один файл в табличную часть, а несколько! А вдруг добавил, удалил, снова добавил...
Хотелось бы заполнять реквизит файл так же независимо от сохранения как и реквизиты ИмяФайла,и РасширениеФайла.
Имеется табличная часть, один из реквизитов которой имеет тип ХранилищеЗначения. Задача помещать файлы в данный реквизит без обязательной записи в базу.
&НаКлиенте
Процедура ЗагрузитьДанные(Команда)
ПриЗавершении = Новый ОписаниеОповещения("ПоместитьФайлКомандаЗавершение", ЭтотОбъект);
ПередПомещением = Новый ОписаниеОповещения("ПоместитьФайлКомандаПередПомещением", ЭтотОбъект);
ДиалогВыбораФайлов = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайлов.Заголовок = "Выбор файл вложения";
ДиалогВыбораФайлов.МножественныйВыбор = Ложь;
НачатьПомещениеФайла(ПриЗавершении, , ДиалогВыбораФайлов, Истина, , ПередПомещением);
КонецПроцедуры
&НаКлиенте
Процедура ПоместитьФайлКомандаЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Результат Тогда
ОбработатьНаСервере(Адрес);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоместитьФайлКомандаПередПомещением(ПомещаемыйФайл, ОтказОтПомещенияФайла, ДополнительныеПараметры) Экспорт
Если ПомещаемыйФайл.Размер() > 25000000 Тогда //примерно 25 мегабайт
ПоказатьПредупреждение(, "Превышен максимальный размер файла: " + Строка(ПомещаемыйФайл.Размер()));
ОтказОтПомещенияФайла = Истина;
КонецЕсли;
Файл = ПомещаемыйФайл.Файл.ПолноеИмя;
ИмяФайлаДиалог = ПомещаемыйФайл.Файл.ИмяБезРасширения;
РасширениеИзДиалога = ПомещаемыйФайл.Файл.Расширение;
КонецПроцедуры
&НаСервере
Процедура ОбработатьНаСервере(Адрес)
ДанныеИзФайла = ПолучитьИзВременногоХранилища(Адрес);
ДокументОбъект = РеквизитФормыВЗначение("Объект");
КоличествоСтрок = ДокументОбъект.Документация.Количество();
ДокументОбъект.Документация.Добавить();
ДокументОбъект.Документация[КоличествоСтрок].Файл = Новый ХранилищеЗначения(ДанныеИзФайла, Новый СжатиеДанных(9));
ДокументОбъект.Документация[КоличествоСтрок].ИмяФайла = ИмяФайлаДиалог;
ДокументОбъект.Документация[КоличествоСтрок].РасширениеФайла = РасширениеИзДиалога;
ДокументОбъект.Записать();
ЗначениеВРеквизитФормы(ДокументОбъект,"Объект");
КонецПроцедуры
ПоказатьКак видим, объект записывается автоматически в процедуре ОбработатьНаСервере, если убрать из этой процедуры ДокументОбъект.Записать(), тогда при нажатии кнопки записи, реквизиты ИмяФайла,и РасширениеФайла сохраняются, а вот реквизит Файл с типом ХранилищеЗначения - нет.
Тут дилемма, с одной стороны хочется дать возможность пользователю не сохранять сделанные изменения, а с другой - все таки хранить в базе присоединенные файлы.
Да, можно заполнять реквизит Файл в событии ПриЗаписи, но я не понимаю как передать туда несколько адресов из временного хранилища - вдруг пользователь добавил не один файл в табличную часть, а несколько! А вдруг добавил, удалил, снова добавил...
Хотелось бы заполнять реквизит файл так же независимо от сохранения как и реквизиты ИмяФайла,и РасширениеФайла.
По теме из базы знаний
- 1С 8.1: Неопознанная ошибка HRESULT=80004005 или почему не выгружаются базы данных в dt
- Альтернативное получение значения из хранилища значения. Свой ХранилищеЗначения.Получить();
- Неограниченное количество строк в табличной части документа
- История одного сложного обновления: как смотреть в будущее при выполнении доработок 1С
- Интеграция 6 поставщиков в КА 2.5 на базе HTTP Connector (API, XML, YML) (Загрузка номенклатуры, установка цен роботами по расписанию)
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) как вариант на форме можно сделать адреса временного хранилища в строках,
файлы помещать во временное хранилище, а адреса оставлять на форме..
а при записи по адресам достаем файлы и помещаем в хранилище значения.
а еще можно двоичные данные в строку сериализовать
файлы помещать во временное хранилище, а адреса оставлять на форме..
а при записи по адресам достаем файлы и помещаем в хранилище значения.
а еще можно двоичные данные в строку сериализовать
(5) хамством в интернете сейчас никого не удивить. И уж тем более, обижаться.
Неприятно встречаться с такими персонажами в профессиональной среде.
А по поводу хрень - не хрень, это никак не вам решать. Критикуешь - предлагай.
Я считаю, что человеку надо подсказывать возможности платформы, и это его наведет на идеи решения конкретно его прикладной задачи и это конструктивный диалог.
А обиженка, это походу ты, минусы в ответ на конструктивную критику ставить..
Неприятно встречаться с такими персонажами в профессиональной среде.
А по поводу хрень - не хрень, это никак не вам решать. Критикуешь - предлагай.
Я считаю, что человеку надо подсказывать возможности платформы, и это его наведет на идеи решения конкретно его прикладной задачи и это конструктивный диалог.
А обиженка, это походу ты, минусы в ответ на конструктивную критику ставить..
(6)У тебя 2 предложения во (2) - первое нормальное, адреса в каждую строку, второе какая то херня.
Дополнительно тут больше нечего предлагать. С адресами это нормальное и рабочее решение.
Зачем ты начал минусы ставить для меня загадка, но я тоже могу, мне не сложно.
Дополнительно тут больше нечего предлагать. С адресами это нормальное и рабочее решение.
Зачем ты начал минусы ставить для меня загадка, но я тоже могу, мне не сложно.
(1)
Новый реквизит формы ДвоичныеДанные - тип произвольный, туда пишите двоичные данные. Код делаете так чтобы при открытии формы хранилище грузилось в ДвоичныеДанные, при открытии данные брались из ДвоичныеДанные. Пишите туда же при подборе. При сохранении надо просто перекинуть в ХЗ.
реквизит Файл с типом ХранилищеЗначения
Новый реквизит формы ДвоичныеДанные - тип произвольный, туда пишите двоичные данные. Код делаете так чтобы при открытии формы хранилище грузилось в ДвоичныеДанные, при открытии данные брались из ДвоичныеДанные. Пишите туда же при подборе. При сохранении надо просто перекинуть в ХЗ.
Проблема в том, что количество файлов заранее не известно. У разных контрагентов разное количество документов. И вопрос № 2: как отображать на форме еще не записанные данные? Так же как и сейчас?
А если хранить ссылки на файлы, а при записи ти файлы подгружать, а ссылки очищать?
А если хранить ссылки на файлы, а при записи ти файлы подгружать, а ссылки очищать?
получать объект из реквизита формы нужно только в случае если нужен доступ к контексту, а если необязательно то и незачем, в коде ниже получается будет добавляться строка в данные формы коллекцию, и передаваться на клиент соответственно. А после окончания редактирования уже запишете объект через стандартную кнопку записи.
По моему так должно работать
По моему так должно работать
&НаСервере
Процедура ОбработатьНаСервере(Адрес)
ДанныеИзФайла = ПолучитьИзВременногоХранилища(Адрес);
КоличествоСтрок = Объект.Документация.Количество();
Объект.Документация.Добавить();
Объект.Документация[КоличествоСтрок].Файл = Новый ХранилищеЗначения(ДанныеИзФайла, Новый СжатиеДанных(9));
Объект.Документация[КоличествоСтрок].ИмяФайла = ИмяФайлаДиалог;
Объект.Документация[КоличествоСтрок].РасширениеФайла = РасширениеИзДиалога;
КонецПроцедуры
Показать
(17) По моему не корректно так отвечать когда Вам помогают, действительно хранилище значений не пройдет, значит нужно обойти это через временное хранилище как уже советовали в комментариях. Либо вообще просится отдельный справочник файлов, примеров как это реализовать море. Вам стоит более сдержано реагировать на комментарии и побольше изучать возможности платформы и прокачивать свои скиллы, а не требовать готовых решений.
Друзья, попробуйте сами!
Прикрепляю демобазу.
P.S. Один, но главный ньюанс - у нас клиент серверная конфигурация. Файлы хранятся и код выполняется на другом ПК.
Прикрепляю демобазу.
P.S. Один, но главный ньюанс - у нас клиент серверная конфигурация. Файлы хранятся и код выполняется на другом ПК.
Прикрепленные файлы:
ТестоваяБаза.dt
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот