Добрий день. Мені потрібно скачати файл фото з сайиу і приєднати до номенклатури номенклатури. Роблю так
Попытка
Ответ = Соединение.Получить(Запрос);
Исключение
Сообщить("Пропущена картинка в строке " + сч + "( " + Стр.Код_товара + " ) по причине " + ОписаниеОшибки() + " (" + АдресИзображения + ")");
Продолжить;
КонецПопытки;
Если НЕ Ответ.КодСостояния = 200 Тогда
СчКартПроп = СчКартПроп + 1;
Сообщить("Пропущена картинка в строке " + сч + "( " + Стр.Код_товара + " ) по причине " + Ответ.КодСостояния + " (" + АдресИзображения + ")");
Продолжить;
КонецЕсли;
ДвоичныеДанныеКартинки = Ответ.ПолучитьТелоКакДвоичныеДанные();
АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, ЭтаФорма.УникальныйИдентификатор);
СтруктураИмени = ВернутьСтруктуруИмениФайла(АдресИзображения);
ПараметрыФайла = Новый Структура("ВладелецФайлов, Автор, ИмяБезРасширения, РасширениеБезТочки, ВремяИзмененияУниверсальное",
НоменклатураСсылка,
ПараметрыСеанса.ТекущийПользователь,
СтруктураИмени.Имя,
СтрЗаменить(СтруктураИмени.Расширение, ".", ""),
ТекущаяУниверсальнаяДата());
//ИзображениеСсылка = ПрисоединенныеФайлы.ДобавитьПрисоединенныйФайл(ПараметрыФайла, АдресФайлаВоВременномХранилище,,"");
Если Сч = 1 Тогда
НоменклатураОбъект = НоменклатураСсылка.ПолучитьОбъект();
НовыйОбъект = Справочники.ХранилищеДополнительнойИнформации.СоздатьЭлемент();
НовыйОбъект.ВидДанных = Перечисления.ВидыДополнительнойИнформацииОбъектов.Изображение;
НовыйОбъект.Хранилище = Новый ХранилищеЗначения(АдресФайлаВоВременномХранилище, Новый СжатиеДанных);
НовыйОбъект.Объект = НоменклатураСсылка;
НовыйОбъект.Записать();
НоменклатураОбъект.ОсновноеИзображение = НовыйОбъект.Ссылка;
НоменклатураОбъект.Записать();
КонецЕсли;
мне кажется, что вы в Хранилище значения записываете адрес, а не реальные двоичные данные. Через время в том адресе ничего не будет
в свое время пришлось вычищать людям базу, когда таких картинок стало под 10Гб в ней. Лучше сделайте хранение на жестком диске, иначе у вас база будет распухать высокими темпами
xlmel @ Сегодня, 11:46
,
В ХранилищеЗначения потрібно другим параметром передавати ДвоичніеДанные?
// справочник "ПодписиМенеджеров"
// на форме элемента создаем реквизит типа Строка (неограниченной длины) с именем "СсылкаНаКартинку" для отображения и работы с картинкой
// реквизит справочника "Подпись" имеет тип ХранилищеЗначения
// потом (это фрма элемента справочника ПодписиМенеджеров)
&НаКлиенте
Процедура СсылкаНаКартинкуНажатие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.ПолноеИмяФайла = "";
Фильтр = "Файл PNG (*.png)|*.png";
ДиалогОткрытия.Фильтр = Фильтр;
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберете файл для загрузки";
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗагрузкиФайла",ЭтаФорма);
ДиалогОткрытия.Показать(ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗагрузкиФайла(ВыбранныйФайл,ДопПараметр) Экспорт
Если ВыбранныйФайл = Неопределено Тогда
Возврат;
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтаФорма);
НачатьПомещениеФайла(ОписаниеОповещения,, ВыбранныйФайл[0], Ложь, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла,ДопПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
СсылкаНаКартинку = Адрес;
Модифицированность = Истина;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища(СсылкаНаКартинку) Тогда
ФайлКартинки = ПолучитьИзВременногоХранилища(СсылкаНаКартинку);
ТекущийОбъект.Подпись = Новый ХранилищеЗначения(ФайлКартинки);
УдалитьИзВременногоХранилища(СсылкаНаКартинку);
СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(Объект.Ссылка,"Подпись");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(Объект.Ссылка,"Подпись");
КонецПроцедуры
// а это документ "ЗаказПокупателя"
// и потом в заказе покупателя процедура печати
// тут просто ищем в справочнике нужного пользователя по нужной фирме и если нашли его факсимиле -- выдаем его
_факсимиле = Документы.ЗаказПокупателя._ПолучитьСсылкуНаПодписьМенеджера(Объект.Ответственный, Объект.Организация);
// и показываем картинку на макете
Если _факсимиле = Неопределено Тогда
Сообщить("Не определено факсимиле для текущего пользователя", СтатусСообщения.Информация);
Иначе
// получаем и отображаем факсимиле
ОбластьЗаголовок.Рисунки.ФаксимильнаяПечать.Картинка = Новый Картинка(_факсимиле.Подпись.Получить());
КонецЕсли;
andytg @ Сегодня, 14:52
,
це все добре, але у мене звичайні форми. На керованих у мене теж все працює
andytg @ Сегодня, 15:05
,
Несоответсвие типов
{Справочник.ХранилищеДополнительнойИнформации.Форма.ФормаСпискаФайловИИзображений.Форма(99)}: Ошибка при установке значения атрибута контекста (Картинка)
ЭлементыФормы.ПолеИзображения.Картинка = ?(ТекущаяКартинка <> Неопределено, ТекущаяКартинка, Новый Картинка());
по причине:
Несоответствие типов
kostya77 @ Сегодня, 13:14
,
Вроде первым параметром должен иметь тип Картинка. То есть, полученный файл надо сохранить на диск, потом получить Изображение = Новый Картинка(полученный файл) и потом это изображение поместить в ХранилищеЗначения
kostya77 @ Сегодня, 14:47
,
ДвоичныеДанныеКартинки = Ответ.ПолучитьТелоКакДвоичныеДанные();
Вы получили ДвоичныеДанные. Сохраните их в файл при помощи метода Записать
ДвоичныеДанныеКартинки.Записать(ПутьКФайлу);
Дальше поместите в ХранилищеЗначения и файл с диска удалите, чтобы не засорять диск. Ну или переделайте систему, чтобы файлы хранились на диске. а не в базе
Наглядный пример для обычных форм
"Зарплата и управление для Украины" - справочник: "Физические лица"
Всім дякую. Допоміг варіант зі збереженням файлу в католог тимчасових файлів
andytg @ Вчера, 22:51
,
Странно, что разработчики БСП не поддерживают Ваше мнение и дают хранить присоединенные файлы на диске. а не загружать в базу. У меня есть клиент, у которого и картинки были в базе, и вложения писем. В какой-то момент эти бинарные файлы занимали больше 80% размера базы. Ну а сложности переноса я не видел. Так же, как бэкап базы делался бэкап папки с файлами, даже если сразу забудешь развернуть, то быстро исправишь. Надеюсь, что бэкапы не являются "таким себе решением"?
Vofka @ Сегодня, 7:48
,
Мне всегда казалось, что чем меньше база, тем легче с ней работать и ее обслуживать, особенно это касается MS SQL. С одной стороны, вроде как, идет борьба, чтобы не дублировать сущности в базе данных, а с другой кладем кирпич в несколько Гб.
Vofka @ Сегодня, 13:08
,
Хорошо, надеюсь, что Вы в курсе, что кода в программном коде Вы обращаетесь к реквизиту справочника Номенклатура через точку, то считывается весь объект, вместе с основным изображением. Хотите увеличить траффик - имеете право, ввиду того, что у топик-стартера что-то из УТ2.3 или УТП или УПП, то код будет выполняться в толстом клиенте и фактически нужно будет донести эти мегабайты до компьютера пользователя.
Что вы вкладываете в понятие "легче с ней работать и ее обслуживать"? И не надо ли вам как-то обслуживать каталог с картинками: настроить доступ с разных устройств (если вы работаете через тонкий клиент в браузере с разных регионов, как папку нормально пошарить между всеми?), настроить какие-никакие права (чтобы кто-то не зашел и не поудалял там все), бекапить и т.п.? - На сервере 1с папка которую все могут читать, но не все могут записывать. Путь к папке зашит в константе, при переезде только поменяли константу. У топик-стартера обычные формы, судя по коду, поэтому тонкого клиента нет, а кроме того, все конфигурации на БСП как-то справляются с хранением на диске
Какая связь между "дублированием сущностей" и "несколько ГБ" места в БД? Картинки в БД это дубли чего? - ну в MS SQL важным файлом является файл транзакций, если в него напихать картинок, то он увеличится размерах, при этом для всех версий будет храниться это изображение.
А какие проблемы с этим были? - база тупо стала тормозить. После того как просто убрал картинки и файлы, ситуация существенно улучшилась
Vofka @ Сегодня, 8:48
,
Выскажу свое мнение.
Если прикрепленных файлов уже 5-10 Гб и они хранятся в Базе, то на эти же 5-10 Гб увеличиваются все архивы Базы и копии Базы. Если места дофига и База одна и копия Базы для разработки тоже одна, то проблем нет, но в какой-то момент место начинает заканчиваться. А для разработки, как правило, файлы не нужны
Хотя, есть и обратная сторона медали: возможные разборки из серии "кто удалил мой любимый файл?". Но я с таким не сталкивался
В общем-то, если файлов немного, то хранить их в Базе, конечно, удобнее. Но, начиная с некоторого объема (я бы сказал, 5Гб), они начинают раздражать
А, да, еще был случай. Вендоры что-то изменили в системе хранения файлов в каком-то жестком обновлении. И tmp файл при реорганизации начал резко отжирать память, поскольку все прикрепленные файлы пошли в него. Пришлось плясать с бубном. Если я не ошибаюсь, это было при переходе ЕРП 2.1 -> 2.5
Vofka @ Сегодня, 14:16
,
Вам хочется поспорить?
В курсе не только лишь я, а и разработчики типовых конфигураций, которые еще 100 лет назад вынесли картинки из основных справочников в отдельные справочники. - Топикстартер привел код для УТ/УТП/УПП. Там основное изображение - реквизит справочника и имеет тип Хранилище значений. Я давал свои рекомендации касательно этого вида конфигураций, и обсуждать имеются ли в каких-то конфигурациях отдельные справочники для хранения чего-то считаю бессмысленным
И разве ж это "легче работать и обслуживать"? - да, база стала существенно меньше в размерах, стала легче открываться, как только все бинарные файлы были выгружены из нее. Есть золотое правило механики, но оно прекрасно работает и в других областях. Я выиграл в быстродействии, в том. что MS SQL перестал выбирать всю память на сервере, люди смогли для нужд интернет-магазина хранить по несколько картинок при 20к позиций в справочнике Номенклатуры.
А как БСП справляется, например, с доступом к внешнему каталогу файлов, в зависимости от RLS или каких-то настроек, типа "Васе можно редактировать картинки из группы Крупы, а Пете из группы Овощи"? - практически точно так же как и обычные формы. прямого доступа к диску нет ни у кого из пользователей, то есть можно добавлять/изменять/удалять только через карточку Номенклатуры, а здесь РЛС можно настроить
Со своего опыта вы можете сказать зачем вам БД с пишушимся файлом транзакций? Чтобы что? Только не из теоретической плоскости, а из практической, желательно с примером того, какую проблему вы решили этим. - я практикующий программист 1с, по настройке серверов БД посмотрел несколько курсов, но по большей части, чтобы объяснить администраторам что я хочу, чтобы не просить невозможного. Знаю, что данный файл по умолчанию есть, знаю, что он нужен для восстановления данных в результате сбоев. Я не хочу особо вникать в детали, иначе нужно менять профессию. Практический пример не приведу, но на курсах вроде рассказывалась возможность отката до определенной операции, сами понимаете, что если база достаточно большая, то восстановление из бэкапа может быть достаточно продолжительной операцией и потом перебивать данные с момента бэкапа. Даже если Вы настроили бэкап каждый час, то с большой долей вероятности потеряете несколько часов на восстановление и повторное введение информации.
Т.е. проведение документов тупило, отчеты тупили, а потом после удаления картинок, перестали тупить? Вам самому это не странно звучит? - Я про проведение документов ничего не писал и про формирование отчетов вроде ни слова не было, просто само открытие базы стало происходить существенно быстрее. В этот момент, насколько я помню, происходит считывание кэша, в котором могут находиться наиболее часто используемые данные. Если менеджеры по продажам/закупкам в основном работают со справочником номенклатуры, то вполне возможно, что там хранятся и какие-то данные. Еще один момент, зачастую франчайзи включают версионирование объектов. Это тоже кандидат на увеличение размеров базы, и там по умолчанию в типе объекта стоит любой справочник и документ.
Можно заставлять клиента докупать память на сервер или менять железо, и я сталкивался с такими случаями, а можно попробовать сделать так, чтобы база продолжала работать с нормальным быстродействием. Клиенты сейчас не супербогатые, так что если деньги уйдут на покупку железа, то мне заказов не будет, так что я стараюсь больше для себя. Но никого не заставляю. Каждый сам себе выбирает путь.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua