Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Завантаження скачаних фото в Номенклатуру 2 страниц V   1 2 >          
kostya77 Подменю пользователя
сообщение 28.05.25, 9:41
Сообщение #1

Завсегдатай
****
Группа: Пользователи
Сообщений: 205
Спасибо сказали: 7 раз
Рейтинг: 6

Добрий день. Мені потрібно скачати файл фото з сайиу і приєднати до номенклатури номенклатури. Роблю так

Попытка
    Ответ     = Соединение.Получить(Запрос);
Исключение
    Сообщить("Пропущена картинка в строке " + сч + "( " + Стр.Код_товара + " ) по причине " + ОписаниеОшибки() + " (" + АдресИзображения + ")");
    Продолжить;
КонецПопытки;

Если НЕ Ответ.КодСостояния = 200 Тогда
    СчКартПроп = СчКартПроп + 1;
    Сообщить("Пропущена картинка в строке " + сч + "( " + Стр.Код_товара + " ) по причине " + Ответ.КодСостояния + " (" + АдресИзображения + ")");
    Продолжить;
КонецЕсли;

ДвоичныеДанныеКартинки             = Ответ.ПолучитьТелоКакДвоичныеДанные();
АдресФайлаВоВременномХранилище     = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, ЭтаФорма.УникальныйИдентификатор);

СтруктураИмени = ВернутьСтруктуруИмениФайла(АдресИзображения);

ПараметрыФайла = Новый Структура("ВладелецФайлов, Автор, ИмяБезРасширения, РасширениеБезТочки, ВремяИзмененияУниверсальное",
НоменклатураСсылка,
ПараметрыСеанса.ТекущийПользователь,
СтруктураИмени.Имя,
СтрЗаменить(СтруктураИмени.Расширение, ".", ""),
ТекущаяУниверсальнаяДата());

//ИзображениеСсылка = ПрисоединенныеФайлы.ДобавитьПрисоединенныйФайл(ПараметрыФайла, АдресФайлаВоВременномХранилище,,"");

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


Номенклатура не відкривається - помилка свариться на ОсновноеИзображение . Що роблю не так?

Сообщение отредактировал Vofka - 28.05.25, 11:05

xlmel Подменю пользователя
сообщение 28.05.25, 10:46
Сообщение #2

Говорящий
***
Группа: Пользователи
Сообщений: 56
Из: Харьков
Спасибо сказали: 28 раз
Рейтинг: 30.7

мне кажется, что вы в Хранилище значения записываете адрес, а не реальные двоичные данные. Через время в том адресе ничего не будет
в свое время пришлось вычищать людям базу, когда таких картинок стало под 10Гб в ней. Лучше сделайте хранение на жестком диске, иначе у вас база будет распухать высокими темпами

Спасибо сказали: andytg,

kostya77 Подменю пользователя
сообщение 28.05.25, 13:14
Сообщение #3

Завсегдатай
****
Группа: Пользователи
Сообщений: 205
Спасибо сказали: 7 раз
Рейтинг: 6

xlmel @ Сегодня, 11:46 * ,
В ХранилищеЗначения потрібно другим параметром передавати ДвоичніеДанные?

andytg Подменю пользователя
сообщение 28.05.25, 13:52
Сообщение #4

Общительный
**
Группа: Пользователи
Сообщений: 31
Из: Киев
Спасибо сказали: 7 раз
Рейтинг: 7

Цитата(kostya77 @ 28.05.25, 10:41) *
Що роблю не так?


покажу свой вариант -- в свое время понадобилось хранить в БД факсимиле менеджеров с печатями (для выставления счетов от имени разных фирм, где работают менеджеры по совместительству)

делал так:

// справочник "ПодписиМенеджеров"
// на форме элемента создаем реквизит типа Строка (неограниченной длины) с именем "СсылкаНаКартинку" для отображения и работы с картинкой
// реквизит справочника "Подпись" имеет тип ХранилищеЗначения

// потом (это фрма элемента справочника ПодписиМенеджеров)

&НаКлиенте
Процедура СсылкаНаКартинкуНажатие(Элемент, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Режим = РежимДиалогаВыбораФайла.Открытие;
    ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
    ДиалогОткрытия.ПолноеИмяФайла = "";
    Фильтр = "Файл PNG (*.png)|*.png";
    ДиалогОткрытия.Фильтр = Фильтр;
    ДиалогОткрытия.МножественныйВыбор = Ложь;
    ДиалогОткрытия.Заголовок = "Выберете файл для загрузки";
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗагрузкиФайла",ЭтаФорма);
    ДиалогОткрытия.Показать(ОписаниеОповещения);    
КонецПроцедуры

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

&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла,ДопПараметры) Экспорт
    Если Не Результат Тогда
        Возврат;
    КонецЕсли;
    СсылкаНаКартинку = Адрес;
    Модифицированность = Истина;
КонецПроцедуры

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(Объект.Ссылка,"Подпись");
КонецПроцедуры


// а это документ "ЗаказПокупателя"
// и потом в заказе покупателя процедура печати

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


в таком виде работает уже шестой год

Сообщение отредактировал Vofka - 29.05.25, 7:47

kostya77 Подменю пользователя
сообщение 28.05.25, 13:54
Сообщение #5

Завсегдатай
****
Группа: Пользователи
Сообщений: 205
Спасибо сказали: 7 раз
Рейтинг: 6

andytg @ Сегодня, 14:52 * ,
це все добре, але у мене звичайні форми. На керованих у мене теж все працює

andytg Подменю пользователя
сообщение 28.05.25, 14:05
Сообщение #6

Общительный
**
Группа: Пользователи
Сообщений: 31
Из: Киев
Спасибо сказали: 7 раз
Рейтинг: 7

Цитата(kostya77 @ 28.05.25, 10:41) *
Номенклатура не відкривається - помилка свариться на ОсновноеИзображение

как именно ругается, что пишет в режиме отладки?

kostya77 Подменю пользователя
сообщение 28.05.25, 14:09
Сообщение #7

Завсегдатай
****
Группа: Пользователи
Сообщений: 205
Спасибо сказали: 7 раз
Рейтинг: 6

andytg @ Сегодня, 15:05 * ,
Несоответсвие типов

{Справочник.ХранилищеДополнительнойИнформации.Форма.ФормаСпискаФайловИИзображений.Форма(99)}: Ошибка при установке значения атрибута контекста (Картинка)
ЭлементыФормы.ПолеИзображения.Картинка = ?(ТекущаяКартинка <> Неопределено, ТекущаяКартинка, Новый Картинка());
по причине:
Несоответствие типов

xlmel Подменю пользователя
сообщение 28.05.25, 14:40
Сообщение #8

Говорящий
***
Группа: Пользователи
Сообщений: 56
Из: Харьков
Спасибо сказали: 28 раз
Рейтинг: 30.7

kostya77 @ Сегодня, 13:14 * ,
Вроде первым параметром должен иметь тип Картинка. То есть, полученный файл надо сохранить на диск, потом получить Изображение = Новый Картинка(полученный файл) и потом это изображение поместить в ХранилищеЗначения

kostya77 Подменю пользователя
сообщение 28.05.25, 14:47
Сообщение #9

Завсегдатай
****
Группа: Пользователи
Сообщений: 205
Спасибо сказали: 7 раз
Рейтинг: 6

xlmel @ Сегодня, 15:40 * ,
Как сохранить на диск?

andytg Подменю пользователя
сообщение 28.05.25, 14:55
Сообщение #10

Общительный
**
Группа: Пользователи
Сообщений: 31
Из: Киев
Спасибо сказали: 7 раз
Рейтинг: 7

Цитата(kostya77 @ 28.05.25, 15:47) *
Как сохранить на диск?

судя по ПолучитьТелоКакДвоичныеДанные() вы его откуда-то скачиваете http-запросами?

тогда ДвоичныеДанныеКартинки.Записать(ИмяВременногоФайла)
куда-то во временный каталог
потом временный каталог почистить, после того как

xlmel Подменю пользователя
сообщение 28.05.25, 14:56
Сообщение #11

Говорящий
***
Группа: Пользователи
Сообщений: 56
Из: Харьков
Спасибо сказали: 28 раз
Рейтинг: 30.7

kostya77 @ Сегодня, 14:47 * ,
ДвоичныеДанныеКартинки = Ответ.ПолучитьТелоКакДвоичныеДанные();

Вы получили ДвоичныеДанные. Сохраните их в файл при помощи метода Записать
ДвоичныеДанныеКартинки.Записать(ПутьКФайлу);

Дальше поместите в ХранилищеЗначения и файл с диска удалите, чтобы не засорять диск. Ну или переделайте систему, чтобы файлы хранились на диске. а не в базе

Спасибо сказали: kostya77,

AnryMc Подменю пользователя
сообщение 28.05.25, 14:58
Сообщение #12

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 522
Спасибо сказали: 136 раз
Рейтинг: 138.7

Наглядный пример для обычных форм

"Зарплата и управление для Украины" - справочник: "Физические лица"


Signature
Я можу зробити цю роботу:
- Швидко
- Якісно
- Дешево

Виберіть 2 будь-які пункти

kostya77 Подменю пользователя
сообщение 28.05.25, 19:42
Сообщение #13

Завсегдатай
****
Группа: Пользователи
Сообщений: 205
Спасибо сказали: 7 раз
Рейтинг: 6

Всім дякую. Допоміг варіант зі збереженням файлу в католог тимчасових файлів

Спасибо сказали: andytg,

andytg Подменю пользователя
сообщение 28.05.25, 22:51
Сообщение #14

Общительный
**
Группа: Пользователи
Сообщений: 31
Из: Киев
Спасибо сказали: 7 раз
Рейтинг: 7

Цитата(xlmel @ 28.05.25, 15:56) *
Ну или переделайте систему, чтобы файлы хранились на диске. а не в базе

честно говоря, такое себе решение -- хранить что-то вне базы, это такой "клюшечный" вариант smile.gif, т.к. 7.7 не умела в blob-поля (binary loading object), но и там был вариант, например, конвертировать двоичные файлы в текст mime/base64 и хранить в memo-полях, которые поддерживались в dbf

но так оно хоть не потеряется при возможном переносе базы, особенно, если делать его будет кто-то, кто не знаком с тонкостями устройства местной БД

xlmel Подменю пользователя
сообщение 29.05.25, 7:16
Сообщение #15

Говорящий
***
Группа: Пользователи
Сообщений: 56
Из: Харьков
Спасибо сказали: 28 раз
Рейтинг: 30.7

andytg @ Вчера, 22:51 * ,
Странно, что разработчики БСП не поддерживают Ваше мнение и дают хранить присоединенные файлы на диске. а не загружать в базу. У меня есть клиент, у которого и картинки были в базе, и вложения писем. В какой-то момент эти бинарные файлы занимали больше 80% размера базы. Ну а сложности переноса я не видел. Так же, как бэкап базы делался бэкап папки с файлами, даже если сразу забудешь развернуть, то быстро исправишь. Надеюсь, что бэкапы не являются "таким себе решением"?

Vofka Подменю пользователя
сообщение 29.05.25, 7:48
Сообщение #16

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 14050
Из: Киев
Спасибо сказали: 4612 раз
Рейтинг: 3748.8

Цитата(xlmel @ 29.05.25, 8:16) *
В какой-то момент эти бинарные файлы занимали больше 80% размера базы.

Какие проблемы это создает?

xlmel Подменю пользователя
сообщение 29.05.25, 9:10
Сообщение #17

Говорящий
***
Группа: Пользователи
Сообщений: 56
Из: Харьков
Спасибо сказали: 28 раз
Рейтинг: 30.7

Vofka @ Сегодня, 7:48 * ,
Мне всегда казалось, что чем меньше база, тем легче с ней работать и ее обслуживать, особенно это касается MS SQL. С одной стороны, вроде как, идет борьба, чтобы не дублировать сущности в базе данных, а с другой кладем кирпич в несколько Гб.

AnryMc Подменю пользователя
сообщение 29.05.25, 11:39
Сообщение #18

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 522
Спасибо сказали: 136 раз
Рейтинг: 138.7

Цитата(andytg @ 28.05.25, 22:51) *
честно говоря, такое себе решение -- хранить что-то вне базы, это такой "клюшечный" вариант smile.gif, т.к. 7.7 не умела в blob-поля (binary loading object), но и там был вариант, например, конвертировать двоичные файлы в текст mime/base64 и хранить в memo-полях, которые поддерживались в dbf


Константа "ХранитьФайлыВТомахНаДиске"???


Signature
Я можу зробити цю роботу:
- Швидко
- Якісно
- Дешево

Виберіть 2 будь-які пункти

Vofka Подменю пользователя
сообщение 29.05.25, 13:08
Сообщение #19

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 14050
Из: Киев
Спасибо сказали: 4612 раз
Рейтинг: 3748.8

Цитата(xlmel @ 29.05.25, 10:10) *
Мне всегда казалось, что чем меньше база, тем легче с ней работать и ее обслуживать, особенно это касается MS SQL.

Что вы вкладываете в понятие "легче с ней работать и ее обслуживать"? И не надо ли вам как-то обслуживать каталог с картинками: настроить доступ с разных устройств (если вы работаете через тонкий клиент в браузере с разных регионов, как папку нормально пошарить между всеми?), настроить какие-никакие права (чтобы кто-то не зашел и не поудалял там все), бекапить и т.п.?

Цитата(xlmel @ 29.05.25, 10:10) *
С одной стороны, вроде как, идет борьба, чтобы не дублировать сущности в базе данных, а с другой кладем кирпич в несколько Гб.

Какая связь между "дублированием сущностей" и "несколько ГБ" места в БД? Картинки в БД это дубли чего?

Вы выше писали:
Цитата(xlmel @ 28.05.25, 11:46) *
в свое время пришлось вычищать людям базу, когда таких картинок стало под 10Гб в ней

А какие проблемы с этим были?

Я не докапываюсь, мне дейсвительно интересно послушать мнения на этот счет.

Спасибо сказали: andytg,

andytg Подменю пользователя
сообщение 29.05.25, 14:06
Сообщение #20

Общительный
**
Группа: Пользователи
Сообщений: 31
Из: Киев
Спасибо сказали: 7 раз
Рейтинг: 7

Цитата(Vofka @ 29.05.25, 14:08) *
И не надо ли вам как-то обслуживать каталог с картинками: настроить доступ с разных устройств (если вы работаете через тонкий клиент в браузере с разных регионов, как папку нормально пошарить между всеми?), настроить какие-никакие права (чтобы кто-то не зашел и не поудалял там все), бекапить и т.п.?

вот это самая главная засада при хранении чего-то (картинок/доков/писем) вне базы

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


2 страниц V   1 2 >
Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 14.06.25, 20:03
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!