Как правильно хранить картинки в 1с
В первой части Пошагового примера загрузки, хранения и отображения картинок (фотографий) в справочниках мы с вами реализовали минимальный функционал, позволяющий нам выводить фото для элементов любого справочника.
На данный момент конфигурация из нашего примера имеет следующие недостатки (убедитесь сами):
- если в открытой форме элемента справочника Сотрудники мы с помощью кнопки «Добавить картинку» будем последовательно выбирать несколько картинок (даже без выполнения команды «Записать»), то все эти картинки будут сохраняться в справочнике Файлы;
- при выборе для Сотрудника новой картинки старая (которая была установлена до этого) не удаляется из справочника Файлы, а остается в нем;
- если мы в открытой форме элемента справочника Сотрудники заменим фотографию сотрудника и попробуем закрыть форму, то форма закроется без каких-либо уведомлений – то есть система «не видит», что в элемент справочника внесены изменения и не спрашивает пользователя сохранять или нет эти изменения.
1. Прежде чем приступ ить к исправлению имеющихся «глюков» давайте сделаем наш справочник Файлы более удобным и функциональным. Для этого по аналогии с шагами 6-8 первой части пошагового примера сделаем так, чтобы мы могли просматривать хранимые картинки в самом справочнике Файлы.
Создадим Форму элемента справочника Файлы:
Тип формы: Форма элемента справочника;
Реквизиты формы: Код, Наименование.
2. В конструкторе форм создайте новый реквизит формы Фото, тип – Строка, длина 0.
3. Мышкой перетащите созданный в шаге 2 реквизит Фото на Форму элемента справочника Файлы. В свойстве «Вид» получившегося поля меняем значение с «Поле ввода» на «Поле картинки».
4. Для отображения картинки на форме выделяем Форму, в свойствах нашей Формы переходим на закладку «События» и переходим к событию ПриСозданииНаСервере .
5. Напишем программный код процедуры ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) :
//устанавливаем автомасштаб для картинки
Элементы . Фото . РазмерКартинки = РазмерКартинки . АвтоРазмер ;
КонецПроцедуры
6. Запускаем систему в режиме 1С:Предприятие и смотрим что у нас получилось:
7. Теперь самое время приступить к исправлению найденных «глюков» при загрузке и хранении фотографий. Для этого в модуле формы справочника Сотрудники доработаем нашу серверную процедуру УстановитьКартинку() – см. 11 пункт 1 части пошагового примера. Для удобства добавленные строки программного кода выделены подчеркиванием:
&НаСервере
Процедура УстановитьКартинку ()
//создаем новый элемент в Справочнике Файлы
НовыйФайлКартинки = Справочники . Файлы . СоздатьЭлемент ();
//в реквизит СправочникаФайлы Файл помещаем выбранную ранее Картинку,
НовыйФайлКартинки . Файл = Новый ХранилищеЗначения ( ПолучитьИзВременногоХранилища ( Фото ));
Фото = ПоместитьВоВременноеХранилище ( НовыйФайлКартинки . Файл . Получить ());
//записываем новый элемент справочника Файлы
НовыйФайлКартинки . Записать ();
//добавили во 2 ЧАСТИ ПРИМЕРА
// тут проверим была ли ранее установлена картинка и если да - то удалим ее из справочника Файлы
//вторая проверка Объект.Картинка.ПолучитьОбъект()<>Неопределено нужна чтобы проверить если ли в справочнике
//Файлы элемент, на который ссылается наш реквизит Картинка.
//Тем не менее, картинки может не быть по 2 причинам:
//1 если мы удалим картинку из справочника Файлы вручную
//2 если мы установим новую картинку, но откажемся от сохранения изменений в данный элемент
Если Объект . Картинка . Пустая () = Ложь и Объект . Картинка . ПолучитьОбъект ()<>Неопределено Тогда
СтарыйФайлКартинки = Объект . Картинка . ПолучитьОбъект ();
СтарыйФайлКартинки . Удалить ();
КонецЕсли;
//конец того, что добавили во 2 ЧАСТИ ПРИМЕРА
//устанавливаем значение реквизита Картинка Справочника Сотрудники
Объект . Картинка = НовыйФайлКартинки . Ссылка ;
//добавили во 2 ЧАСТИ ПРИМЕРА. Модифицированность. Программно укажем, что данный элемент справочника был изменен.
ЭтаФорма . Модифицированность =Истина;
//если модифицированности недостаточно, то можно использовать метод формы Записать (снять комментарий с последней строки)
//ЭтаФорма.Записать();
8. Внимательно прочитайте комментарии в программном коде нашей серверной процедуры УстановитьКартинку() .
9. Обратите внимание на следующую сроку кода:
ЭтаФорма . Модифицированность =Истина;
Тут мы свойству Формы «Модифицированность» присвоили значение истина. Так как ссылку на картинку (значение реквизита Картинка справочника Сотрудники) мы устанавливаем программно (в программном модуле, а не интерактивно), то программа «не видит» когда мы меняем значение данного реквизита. Но мы можем программно изменить данное свойство, что мы и делаем.
Теперь, если мы в открытой форме элемента справочника Сотрудники заменим фотографию сотрудника и попробуем закрыть форму, то система «увидит», что форма была модифицирована и задаст нам соответствующий вопрос:
Файлы изображений могут быть достаточно объемными, поэтому их хранение в базе может привести к сильному увеличению размеров информационной базы. Это в свою очередь приводит к разрастанию резервных копий базы, к повышенному времени создания таких резервных копий.
Поэтому достаточно часто используется такой подход – вместо изображения в информационной базе хранится только путь к файлу с картинкой, а само изображение хранится на диске в отдельном каталоге. Если возникает потребность отобразить в программе прикрепленное изображение, система обращается к файлу с картинкой на диске, выводит его на форму. Таким образом, в базе не хранится объемная информация графических файлов, а только пути к таким файлам, что существенно уменьшает размеры хранящейся в базе информации.
Однако при таком подходе требуется отдельно выполнять резервное копирование базы данных и отдельно копировать каталог на диске, где хранятся файлы изображений.
Главным недостатком такого способа хранения данных является возможность получения несогласованных данных. Файлы изображений хранятся отдельно, не в информационной базе, поэтому файл может быть удален с диска, а в базе останется ссылка на него. Также возможна обратная ситуация – элемент справочника в базе будет удален, а на диске будет храниться файл, не связанный ни с каким элементом базы данных.
На экзамене может быть предложено реализовать хранение присоединенных изображений во внешних файлах на диске. Условие задачи может быть примерно таким:
Необходимо обеспечить возможность прикреплять изображение к элементу справочника Номенклатура. Изображения следует хранить в виде отдельных файлов на диске. Прикрепленное изображение номенклатуры должно отображаться на форме элемента.
Создадим команду ЗагрузитьКартинку формы элемента справочника Номенклатура и разместим ее на форме. После выбора данной команды пользователь выбирает файл на диске, который будет прикреплен к карточке номенклатуры:
Рисунок 1 – Выбор файла картинки
Как организовать хранение изображений во внешних файлах на диске
Поскольку не требуется хранить само изображение в информационной базе, организуем хранение только имени файла, где расположено изображение, прикрепленное к карточке номенклатуры. Для этого в справочнике Номенклатура создадим реквизит ПутьКФайлуКартинки с типом Строка:
Рисунок 2 – Реквизит справочника Номенклатура для хранения пути к файлу картинки
Путь к файлу и его имя могут быть достаточно длинными, поэтому для реквизита ПутьКФайлуКартинки установим галочку Неограниченная длина:
Рисунок 3 – Свойство Неограниченная длина реквизита «ПутьКФайлуКартинки»
Как загрузить картинку для номенклатуры
Настройка формы элемента справочника Номенклатура для отображения картинки выполняется одинаково как при хранении изображений в информационной базе, так и при хранении изображений во внешних файлах. Подробно основные принципы рассмотрены в предыдущем блоке. Сейчас отметим основные отличия, характерные для хранения изображений во внешних файлах.
К сожалению, у Вас недостаточно прав для дальнейшего просмотра.
Если Вы приобрели курс, но еще не активировали токен — пожалуйста, активируйте доступ по инструкциям, высланным на Ваш email после покупки.
Если Вы не залогинены на сайте — залогиньтесь, вернитесь на эту страницу и обновите ее.
Если Вы залогинены, у Вас активирован токен доступа, но Вы все равно видите эту запись — напишите нам на e-mail поддержки.
Мне нужно хранить картинки отдельно а в базе только ссылки, прикладываю скрины если я правильно понял как это делать?
(3)Понимаете правильно.
В наименовании писать то, как вы том будете в самой 1С идентифицировать среди множества других.
Путь указывать в формате \\ИмяОбщегоРесурса. К этому общему ресурсу должны быть права у учетной записи, от имени которой запущен 1С сервис.
Я так понимаю это говорит о том что пока нет изображений или каких то файлов, переносить нечего, так?
Если я создал папку и начинаю грузить изображения в программу они получается после такой настройки будут в папку грузится?
Или постоянно нужно будет делать перенос?
(7)Да, но нужно задействовать методы сохранения файла из конфигурации(общих модулей).
Если записывать файлы "вручную", то можно так же хранить их в БД.
(1)Включить в администрировании эту возможность, добавить том размещения файлов и перенести файлы из БД в новое хранилище.
перенос, однако, типовой есть.
Мне нужно хранить картинки отдельно а в базе только ссылки, прикладываю скрины если я правильно понял как это делать?
(3)Понимаете правильно.
В наименовании писать то, как вы том будете в самой 1С идентифицировать среди множества других.
Путь указывать в формате \\ИмяОбщегоРесурса. К этому общему ресурсу должны быть права у учетной записи, от имени которой запущен 1С сервис.
Я так понимаю это говорит о том что пока нет изображений или каких то файлов, переносить нечего, так?
Если я создал папку и начинаю грузить изображения в программу они получается после такой настройки будут в папку грузится?
Или постоянно нужно будет делать перенос?
(7)Да, но нужно задействовать методы сохранения файла из конфигурации(общих модулей).
Если записывать файлы "вручную", то можно так же хранить их в БД.
Как это сделать?
Я не совсем знаком с конфигуратором, что бы так работать, если я задействовал в программе места хранения файлов, это же будет работать?
или надо еще вот это сделать?
(7)Да, но нужно задействовать методы сохранения файла из конфигурации(общих модулей).
Если записывать файлы "вручную", то можно так же хранить их в БД.
(11)РаботаСФайлами.ДобавитьФайл() - возвращает ссылку на элемент справочника.
(13)Нужно задействовать внутренние механизмы конфигурации для работы с файлами.
Для этого необходимо понимать, что/как/где хранится, указывается в качестве входного параметра той или иной функции/процедуры.
В рамках общения на форуме это не объяснить, вам придется самостоятельно разобраться в функционале работы с файлами, предоставляемым конфигурацией. Отправную точку я вам обозначил.
Сегодня мы разберем, как с помощью только средств технологической платформы 1С 8.3 и пары картинок создать небольшую презентацию. Способ, описанный ниже, можно также использовать в качестве небольшого шаблона для хранения картинок в базе, например, фотографий сотрудников и т. д.
Для начала создадим справочник «Презентации». Для хранения картинок в базе данных обычно используют либо подчиненный справочник, либо регистр сведений 1С. Воспользуемся первым способом и создадим справочник «ХранилищеФайлов», подчиненный справочнику «Презентации». Добавим ему реквизиты – ДанныеХранилищаЗначений (тип – хранилище значений), ДанныеТекущаяДата (тип – дата), ИмяФайла (тип – строка).
Рисунок 1. Реквизиты справочника «Хранилище файлов»
Создадим форму элемента справочника и реализуем на ней следующее:
1. Добавим динамический список, в котором будем указывать информацию о картинках.
2. Создадим кнопку, по нажатию на которую мы сможем добавить картинку в базу.
3. Добавим поле, в которое по нажатию на любую строку динамического списка будет выводиться демо-версия картинки (предварительный просмотр)
Для реализации первого пункта необходимо создать реквизит формы типа ДинамическийСписок. Назовем его «Файлы». В свойствах поставим галочку «Произвольный запрос», откроем «настройка списка» и напишем следующий запрос (рисунок 2).
Рисунок 2. Запрос в динамическом списке
После проделанных манипуляций выведем список на форму и получим следующее (рисунок 3):
Рисунок 3. Динамический список
Следующим пунктом добавим на форму команду «Добавить картинку». Добавим для этой команды процедуру, которая будет вызывать стандартный диалог выбора файлов через «ОписаниеОповещения» (рисунок 4).
Рисунок 4. Диалог выбора файла
Единственным отличием будет то, что в конце мы будем сохранять в справочник «Хранилище файлов» в виде двоичных данных (рисунок 5):
Рисунок 5. Сохранение картинки в «Хранилище файлов».
Перейдем к третьему пункту. Для его реализации нужно добавить событие для динамического списка «При активации строки» и написать код, который будет по ссылке получать навигационную ссылку из вспомогательного справочника и сохранять в реквизит формы строкового типа, после чего платформа автоматически преобразует его в картинку (рисунок 6).
Рисунок 6. Получение навигационной ссылки из справочника «Хранилище Файлов»
Таким вот несложным образом мы организовали хранение и получение картинок в базе данных. Теперь перейдем непосредственно к слайд-шоу.
2. Режим просмотра слайдов
Для того чтобы реализовать полноценную презентацию, необходимо создать обработку с реквизитом Презентация – СправочникСсылка.Презентации. С помощью него будем выбирать необходимый элемент в справочнике. Добавим основную форму и создадим команду «Просмотр» (рисунок 7).
Рисунок 7. Основная форма обработки
Теперь необходимо создать события. Конечно, в первую очередь хочется сделать предварительный просмотр документа, чтобы не нажимать лишние кнопки, если вдруг выбрал не ту презентацию. Выглядеть и реализовываться предварительный просмотр будет при мерно также, как и в справочнике, который мы создавали до этого (рисунок 8).
Рисунок 8. Предварительный просмотр презентации
Теперь добавим действие для команды «Просмотр».
По нажатию на кнопку будет открываться вторая электронная форма обработки, которая и будет отвечать за полноценный режим показа слайдов.
Так же, как и до этого, добавим реквизит формы, в который будет выводиться картинка. Повторим тот же код что и до этого.
Можно также добавить группу страницы, и создать таблицу со списком слайдов, по нажатию на один из которых будет отображаться именно он, делается это аналогично всем предыдущем действиям, а также добавить кнопку «Показать/скрыть список слайдов», которая будет включать и отключать видимость этой таблицы.
После всех проделанных манипуляций мы получили слайд-шоу, которое можно показать прямо в 1С, без использования сторонних программ. Конечно есть недостатки, например, все слайды нужно отдельно загружать. Но зато все хранится в одном месте, привязано к конкретному справочнику и в целом работает. В следующей статье я разберу, как хранить в базе графические схемы при помощи двоичных данных.
Специалист компании ООО «Кодерлайн»
Вас могут заинтересовать следующие статьи:
94 [PROP_CODE] => TAGS2 [TITLE] => Вас могут заинтересовать следующие семинары: ) --> 95 [PROP_CODE] => TAGS [TITLE] => Вас могут заинтересовать следующие вебинары: ) -->
Вас могут заинтересовать следующие вебинары:
В ходе разработки регулярно встречается пожелание клиента о хранении присоединенных к документу (или элементу справочника) файлов пользователя в 1С. Эта возможность реализована в Библиотеке стандартных подсистем (БСП). Но использование Библиотеки стандартных подсистем для этой задачи требует снятия базы с режима полной поддержки. Поэтому может возникнуть желание организовать хранение файлов без БСП.
Мы рассмотрим вариант хранения файлов вне базы данных (БД), чтобы избежать бесконтрольного увеличения объема БД.
Для решения задачи организовать хранение файлов без БСП нам понадобится:
1. Выделить место хранения файлов пользователя, доступное с сервера 1С.
2. Создать регистр сведений, содержащий служебную информацию для сохранения файлов.
3. Добавить в объект, к которому добавляется возможность хранения файлов пользователя, табличную часть и две команды: Загрузить файл и Открыть Файл.
Созданный регистр сведений имеет простейшую структуру. Ни одного измерения, а это гарантирует, что запись будет только одна, ресурсов два:
· КаталогХранилища – указывает на место хранения файлов пользователя, строка необходимой длины.
· НомерФайлаВКаталоге – указывает имя последнего файла, записанного в каталог.
Для удобства использования решения имеет смысл сделать служебную процедуру, получающую имя каталога, ближайший пустой номер файла и изменяющий запись в регистре 1С, увеличивая номер файла на единицу.
Поместить процедуру можно в общем модуле (как приведенную), так и в менеджере регистра сведений.
В объекте, который мы хотим модифицировать для хранения присоединенных файлов, требуется создать табличную часть Документы для хранения данных о присоединенных файлах. В реквизиты документа для хранения данных табличной части можно записать и тип присоединяемого документа (договор, доверенность, схема решения, прочее). Но три реквизита должны быть обязательно:
· ИмяФайла – имя файла, приложенного пользователем. Файл с этим именем мы и будем пользователю возвращать.
· ИмяФайлаВХранилище – наше внутреннее имя файла, использующееся для того, чтобы исключить совпадающие имена.
· ЕстьДокумент – Булево, показывающее факт наличия документа в хранилище.
Осталось сделать две команды, первая из которых будет помещать файл в хранилище 1С, а вторая – извлекать оттуда и открывать файл пользователю в 1С.
1. Помещение файла в хранилище 1С
Команду мы назовем Документы_ЗагрузитьФайл.
Для помещения файла в хранилище 1С в современных конфигурациях режим модальности не приветствуется. Поэтому мы решим задачу с использованием немодальных методов.
Процедура обработки команды начинает помещение файла в хранилище 1С, которое будет доступно и на сервере.
После завершения помещения файла в хранилище 1С вызывается процедура ВыполнитьЗагрузку на клиентской части, откуда уже вызывается процедура ЗагрузитьФайлНаСервере, записывающая файл в хранилище и возвращающая его имя, если запись прошла успешно.
Процедура получает в качестве параметров адрес временного хранилища 1С, где находится содержимое файла и его расширение. Структуру хранения файлов пользователя (каталог, имя файла без расширения) процедура получает из описанной выше процедуры общего модуля Служебный.
В результате исполнения данной команды файл пользователя в 1С будет помещен в хранилище. А в реквизиты выбранной строки ТЧ Документы нашего объекта будут записаны имя файла, загружавшегося пользователем и имя файла в хранилище. Расширения у них совпадают.
2. Получение файла из хранилища 1С
Команду мы назовем Документы_ОткрытьФайл.
Команда сначала проверяет существование флажка ЕстьДокумент, выдавая ошибку в случае, если документа в хранилище нет. Это нам необходимо для того чтобы не обращаться к Библиотеке Стандартных Подсистем.
Затем команда обращается на сервер за получением данных во временное хранилище 1С, которое будет доступно и «на клиенте». Файл, полученный во временное хранилище 1С, записывается в каталог хранения файлов пользователя во временных файлах под именем того изначального файла, который когда-то загружал пользователь.
После записи файла пользователя в 1С выполняется попытка его открытия назначенным в системе приложением. Если это не получается, то пользователю предлагается указать каталог для сохранения файла и производится сохранение в указанный каталог.
Обратим внимание, что при получении структуры хранилища в качестве параметра процедуры указывается, что она вызывается не для записи, что не меняет номер текущего файла в хранилище 1С. Здесь мы используем только имя каталога.
Таким образом, мы получили возможность записывать файлы пользователя в 1С на сервер и получать их обратно по запросу без использования Библиотеки стандартных подсистем.
Специалист компании ООО «Кодерлайн»
Вас могут заинтересовать следующие статьи:
Читайте также: