Методические указания по выполнению практической работы по теме «работа с файлами и изображениями в программном коде 1с: предприятие»
МЕТОДИЧЕСКИЕ УКАЗАНИЯ ПО ВЫПОЛНЕНИЮ ПРАКТИЧЕСКОЙ РАБОТЫ
ПО ТЕМЕ «РАБОТА С ФАЙЛАМИ И ИЗОБРАЖЕНИЯМИ В ПРОГРАММНОМ КОДЕ 1С: ПРЕДПРИЯТИЕ»
Подготовка студентов к World Skills Russia по компетенции «ИТ решения для бизнеса на платформе 1С: Предприятие»
Специальность: 09.02.07 Информационные системы и программирование
Томск 2021
Рассмотрен на заседании
МО Информационных технологий
Протокол № ____ от «____» __________________ 2021г.
Методические указания по работе с файлами и изображениями в 1С: Предприятие предназначены для проведения дополнительных заданий в рамках подготовки студентов к чемпионатам World Skills Russia по компетенции «ИТ-решения для бизнеса на платформе 1С: Предприятие 8».
Документ содержит теоретическое положение и порядок выполнения задания для самостоятельной работы студентов.
Методические указания могут быть рекомендованы не только студентам, но и преподавателям, осваивающим данную тематику самостоятельно.
В результате выполнения методических указаний обучающиеся научаться добавлять изображение на форму справочника с помощью программного кода, а также создавать элементы оформления.
СОДЕРЖАНИЕ
Методические указания составлены в соответствии с программой подготовки студентов колледжа к участию в чемпионате World Skills Russia по компетенции «ИТ-решения для бизнеса на платформе 1С: Предприятие 8» по специальности 09.02.07 Информационные системы и программирование. Методические указания предназначены для студентов 1-4 курсов при выполнении практической работы по теме «Работа с файлами и изображениями» (утвержденной программы подготовки студентов колледжа к участию в чемпионатах World Skills Russia по компетенции «ИТ-решения для бизнеса на платформе 1С: Предприятие 8» из раздела № 3 практическая работа №3).
Практическая работа проводится в процессе изучения раздела «Первое знакомство с 1С: Предприятие. Конфигурация. Дерево конфигурации. Объекты конфигурации» программы.
Основной целью работы является подготовка студентов к участию в олимпиадах World Skills разного уровня, подготовка к выполнению демонстрационного экзамена по компетенции «ИТ решения для бизнеса на платформе 1С: Предприятие 8», а также закрепление студентами теоретического материала, развитие аналитического, творческого мышления, формирование профессиональных компетенций, навыков самостоятельной профессиональной деятельности.
Цель данной практической работы – закрепить знания студентов по изученной теме, получить практические навыки по написанию программного кода на загрузку файлов и изображений в конфигурацию.
Выполнение практической работы по данной теме предусматривает изучение и анализ различных видов программ работать на управляемой форме с изображениями в 1С: Предприятие: загружать их на форму, хранить в базе и выводить изображение при открытии формы.
При выполнении практической работы по теме «Работа с файлами и изображениями» студенты решают следующие профессиональные задачи:
Освоение студентами технологии разработки информационных систем.
Разработка моделей бизнес-процессов предметной области.
Изучение студентами алгоритмов и программирования разработки интерфейса программного продукта.
Разработка и настройка интерфейса пользователя.
Работа с модулем управляемого приложения.
Разработка мобильных приложений.
Проведение тестирования и исправления ошибок программного обеспечения.
Представление результатов работы заказчику.
Формы организации работы студентов на данном практическом занятии индивидуальная - каждый студент выполняет индивидуальное задание.
Цель данных методических указаний:
Организовать работу студентов при выполнении практических работ, а также самостоятельно находить необходимые технические данные с помощью дополнительной и справочной литературы.
Формирование у студентов профессиональных и общих компетенций:
ОК 09. Использовать информационные технологии в профессиональной деятельности.
ПК 1.2. Разрабатывать программные модули в соответствии с техническим заданием.
ПК.1.3. Выполнять отладку программных модулей с использованием специализированных программных средств.
Для практической работы определены цель, МТО, задание, порядок выполнения и требования к содержанию отчета. В качестве среды программирования использована платформа 1С: Предприятия учебная версия.
Контроль и оценка выполнения практической работы
Контроль результатов выполнения практической работы осуществляется в формате проверки выполненных заданий. Задания выполняются студентом и представляются дополнительных занятий по подготовке студентов колледжа к участию в чемпионатах World Skills Russia по компетенции «ИТ-решения для бизнеса на платформе 1С: Предприятие 8». Оценивание практических работ проводится дифференцированно по пятибалльной системе в соответствии с универсальной шкалой.
После выполнения данной практической работы студенты смогут выполнить часть модулей №1-4 World Skills Russia по компетенции «ИТ-решения для бизнеса на платформе 1С: Предприятие 8».
Критерии оценки практических работ
Отметка | Процент* | Уровни освоения темы/подтемы |
5 | 87–100 % | высокий |
4 | 66–86 % | оптимальный |
3 | 50–65 % | удовлетворительный |
2 | 2–49 % | неудовлетворительный |
1 | 0–1 % | не выполнено |
*Процент заработанных баллов из максимально возможного количества баллов за все задания в теме/подтеме. Учитываются как решённые, так и нерешённые задания.
РАБОТА С ФАЙЛАМИ И ИЗОБРАЖЕНИЯМИ В ПРОГРАММНОМ КОДЕ 1С: ПРЕДПРИЯТИЕ
Цель: изучить основные принципы работы с файлами и изображениями в программном коде 1с: Предприятие на основе созданной конфигурации путем ее дальнейшей разработки.
Задание:
Изучите работу с тонким и веб-клиентом.
Изучите основные стандартные возможности работы с файлами.
Реализуйте для каждого поставщика возможность добавления файлов. Для каждого поставщика в базе данных должен храниться произвольный файл, содержащий договор с этим поставщиком. Сразу оговоримся, что рассматриваемый пример упрощен и произвольный файл мы будем хранить в одном из реквизитов самого справочника Поставщики.
Реализуйте для справочника Товары возможность добавления изображения и сделать так, чтобы данные изображения отображались при просмотре информации по конкретному товару. Необходимо загрузить изображение, отобразить в форме, сохранить в базе данных и иметь возможность получить из базы данных на клиентский компьютер.
Создайте элементы оформления, которые, как и картинки будут хранятся либо в конфигурации, либо в библиотеке картинок, либо как общие картинки.
Методические указания:
ТОНКИЙ КЛИЕНТ И ВЕБ-КЛИЕНТ
Тонкий клиент и веб-клиент имеют разные возможности по работе с файлами и картинками.
Поскольку веб-клиент является типичным веб-приложением, он ничего не знает о локальной файловой системе компьютера, на котором работает. Его собственные стандартные возможности заключаются лишь в том, чтобы поместить один файл на сервер или получить один файл из базы данных.
Причем и в том, и в другом случае передается только один файл, и эта операция интерактивна в том смысле, что отсутствуют какие-либо средства программной работы с локальной файловой системой клиентского компьютера.
Исходный файл для помещения на сервер должен быть выбран пользователем интерактивно, или путь к нему должен быть указан в явном виде. Аналогично и при получении файла из базы данных – его конечное местоположение должно быть выбрано пользователем интерактивно или в явном виде указано в программном коде.
Тонкий клиент является Windows-приложением и имеет более широкие возможности работы с файлами. В частности, он поддерживает множественный экспорт и импорт файлов и предоставляет программные средства для работы с локальной файловой системой клиентского компьютера.
Для того чтобы веб-клиент смог выполнять такие же действия, на клиентском компьютере необходимо установить и подключить расширение работы с файлами. Это отдельный компонент платформы, его установка и подключение выполняются автоматически средствами встроенного языка. Но установка этого расширения должна быть интерактивной. Пользователь должен самостоятельно принять решение об установке.
Однако использование расширения работы с файлами снижает общую безопасность системы: в браузере Microsoft Internet Explorer требуется разрешение на установку и использование ActiveX, а в браузере Mozilla Firefox необходимо предоставление расширенных привилегий. Пользователь веб-клиента попросту может не иметь подобных прав, если работа выполняется на публичном компьютере или в организации, использующей определенную политику безопасности.
Поэтому при работе с файлами и картинками следует в обязательном порядке реализовывать алгоритмы, использующие стандартные, общие для тонкого и веб-клиента возможности работы с файлами. Кроме того, можно реализовать и другую ветку алгоритма, использующую расширенные возможности работы с файлами. Но эта ветка должна быть опциональной, дополнительной. Нельзя обязательно заставлять пользователя использовать расширение работы с файлами, ведь у него может не быть прав на его установку.
СТАНДАРТНЫЕ ВОЗМОЖНОСТИ
Стандартные возможности работы с файлами реализуются двумя методами встроенного языка: НачатьПомещениеФайла() и ПолучитьФайл().
НачатьПомещениеФайла() – помещает файл из локальной файловой системы во временное хранилище.
ПолучитьФайл() – получает файл из информационной базы и помещает его на клиентский компьютер.
Помещение файла в информационную базу выполняется в два этапа.
Сначала с помощью метода НачатьПомещениеФайла() файл с клиентского компьютера помещается во временное хранилище (рис. 1).
Рис. 1. Помещение файла во временное хранилище
Временное хранилище – это набор служебных файлов кластера, в которых в течение ограниченного времени могут храниться произвольные данные до помещения их в базу данных.
На втором этапе, когда пользователь принимает решение сохранить редактируемые данные в базе данных, файл из временного хранилища помещается в какой-либо реквизит, имеющий тип ХранилищеЗначения, и эти данные записываются в базу данных (рис. 2).
Рис. 2. Перемещение файла из временного хранилища в базу данных
Если же пользователь отказывается от сохранения редактируемых данных, то файл удаляется из временного хранилища либо автоматически, когда будет закрыта форма, с помощью которой он туда был помещен, либо «вручную», из встроенного языка.
Процесс получения файла из информационной базы проще. Он выполняется в один этап, с помощью метода ПолучитьФайл() (рис. 3).
Рис. 3. Извлечение файла из временного хранилища или из базы данных
Файл извлекается из реквизита типа ХранилищеЗначения и помещается на компьютер пользователя.
С помощью этого метода можно получить на клиентский компьютер данные не только из базы данных, но и из временного хранилища. При работе с файлами эта возможность имеет малое практическое значение. Зато она востребована, например, в тех случаях, когда временное хранилище используется для передачи больших массивов данных между двумя формами на клиенте. Такой пример рассмотрен в разделе «Использование временного хранилища для передачи данных между формами».
РАСШИРЕННЫЕ ВОЗМОЖНОСТИКак уже говорилось раньше, в тонком клиенте расширенные возможности работы с файлами доступны всегда. В веб-клиенте для их использования нужно установить и подключить расширение работы с файлами.
Здесь мы лишь перечислим эти возможности, так как их практическое использование, как правило, не вызывает трудностей.
Установка и подключение расширения работы с файлами выполняются с помощью двух методов встроенного языка:
НачатьУстановкуРасширенияРаботыСФайлами(),
НачатьПодключениеРасширенияРаботыСФайлами().
После этого в веб-клиенте становятся доступны методы экспорта/импорта файлов:
НачатьПомещениеФайлов(),
НачатьПолучениеФайлов().
Они аналогичны упоминавшимся ранее методам, но позволяют выполнять операции сразу над группой файлов.
Также становятся доступны методы прямого доступа к локальной файловой системе клиентского компьютера:
НачатьКопированиеФайла(),
НачатьПоискФайлов(),
НачатьПеремещениеФайла(),
НачатьСозданиеКаталога(),
НачатьУдалениеФайлов().
Чтобы не запутаться в различных методах работы с файлами, все их можно представить в виде следующей иерархии (рис. 4).
Рис. 4. Методы работы с файлами
Получение файла и сохранение его в базе данныхВ качестве примера рассмотрим задачу получения файла с клиентского компьютера и сохранения его в реквизите справочника.
Примечание
Пример можно посмотреть в базе «Файлы и картинки», справочник Поставщики.
Пусть в конфигурации существует справочник Поставщики. Для каждого поставщика в базе данных должен храниться произвольный файл, содержащий договор с этим поставщиком.
Сразу оговоримся, что рассматриваемый пример упрощен и произвольный файл мы будем хранить в одном из реквизитов самого справочника Поставщики. В реальной работе, как правило, так не поступают.
Для хранения больших объемов бинарных данных (файлы, картинки) создаются отдельные объекты конфигурации (справочники или регистры сведений), связанные с данным объектом. Такой подход позволяет исключить обязательное считывание больших объемов информации при считывании самого объекта.
Итак, справочник Поставщики будет содержать два реквизита: ФайлДоговора (типа ХранилищеЗначения для хранения двоичных данных) и ИмяФайлаДоговора (типа Строка для хранения имени загруженного файла), рис. 5.
Рис. 5. Структура справочника «Поставщики»
Имя загруженного файла понадобится нам для того, чтобы иметь возможность в дальнейшем этот файл поместить обратно на компьютер пользователя.
Форма элемента справочника Поставщики помимо данных самого объекта будет содержать два дополнительных строковых реквизита: ИмяФайлаДоговора и СсылкаНаФайлВоВременномХранилище (рис. 6).
Рис. 7. Реквизиты формы элемента справочника «Поставщики»
Ссылка на временное хранилище запоминается в форме потому, что она необходима лишь на момент от загрузки файла до записи объекта в базу данных и не является частью прикладных данных объекта.
ИмяФайлаДоговора запоминается в форме для того, чтобы не модифицировать данные объекта до тех пор, пока не начнется запись объекта в базу данных. В принципе, можно обойтись и без него – сохранять имя файла прямо в реквизит объекта, но тогда несколько сложнее станет проверка, выполняемая при сохранении файла на компьютер пользователя.
Для загрузки файла с диска в информационную базу и для сохранения его на диск в форме созданы две локальные команды: ЗагрузитьСДиска и СохранитьНаДиск.
Загрузка файла выполняется с помощью немодального метода глобального контекста НачатьПомещениеФайла(). Первым параметром в этот метод передается описание оповещения, описывающее экспортную процедуру (расположенную в том же модуле – модуле формы) ЗагрузитьСДискаЗавершение(), которая будет вызвана, когда пользователь выберет файл (листинг 1).
В этой процедуре обработки оповещения в случае выбора файла пользователем и будут выполняться действия по загрузке файла с диска (листинг 2).
Листинг 1 Загрузка файла
&НаКлиенте
Процедура ЗагрузитьСДиска(Команда)
НачатьПомещениеФайла(Новый ОписаниеОповещения("ЗагрузитьСДискаЗавершение", ЭтотОбъект), , , Истина , УникальныйИдентификатор);
КонецПроцедуры
Помимо описания оповещения в метод НачатьПомещениеФайла() четвертым параметром передается Истина – признак интерактивного выбора файла. И пятым параметром передается уникальный идентификатор открытой формы, о котором речь пойдет ниже.
Листинг 2. Обработчик оповещения «ЗагрузитьСДискаЗавершение»
&НаКлиенте
Процедура ЗагрузитьСДискаЗавершение(Результат, АдресВХранилище, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Результат Тогда
Файл = Новый Файл(ВыбранноеИмяФайла);
ИмяФайлаДоговора = Файл.Имя;
СсылкаНаФайлВоВременномХранилище = АдресВХранилище;
Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры
В процедуру, вызывающуюся после выбора файла, в параметре Результат передается признак того, что пользователь осуществил выбор файла. Потому что в процессе выбора файла пользователь может, вообще говоря, отказаться от задуманной операции – загрузки файла. Поэтому модификация реквизитов формы выполняется только в том случае, когда файл выбран успешно.
В параметре АдресВХранилище передается адрес во временном хранилище, по которому был помещен файл. И в параметре ВыбранноеИмяФайла передается путь к выбранному файлу.
В случае успешного выбора файла короткое имя файла помещается в реквизит формы ИмяФайлаДоговора, а ссылка на этот файл во временном хранилище помещается в реквизит формы СсылкаНаФайлВоВременномХранилище.
Для того чтобы из полного имени файла получить короткое имя, используется программный объект Файл (листинг 3).
Листинг 3. Получение короткого имени файла
Файл = Новый Файл(ВыбранноеИмяФайла);
ИмяФайлаДоговора = Файл.Имя;
Немного отступим от нашего примера, чтобы дать полезный совет. Быстро и без ошибок создать заготовку процедуры обработки оповещения и сконструировать объект ОписаниеОповещения при вызове немодального метода можно с помощью механизма рефакторинга. Для этого достаточно написать имя метода, поставить открывающую скобку (например, «НачатьПомещениеФайла()»), установить курсор на имя метода и вызвать из контекстного меню команду Рефакторинг – Создать обработку оповещения. Затем в отдельном окне можно задать имя процедуры обработки оповещения или согласиться с тем именем, которое предлагает платформа (рис. 8).
Рис. 8. Создание обработки оповещения с помощью рефакторинга
Вернемся к нашему примеру. Итак, после помещения файл окажется во временном хранилище, а в реквизитах формы будет ссылка на него и его имя (рис. 9).
Рис. 9. Файл во временном хранилище
Примечательным здесь является то, что при помещении файла мы указали последний параметр метода НачатьПомещениеФайла() (листинг 4).
Листинг 4. Привязка файла к открытой форме
НачатьПомещениеФайла(Новый ОписаниеОповещения("ЗагрузитьСДискаЗавершение", ЭтотОбъект), , , Истина , УникальныйИдентификатор);
В качестве этого параметра мы передали уникальный идентификатор нашей открытой формы. Это значит, что файл во временном хранилище будет существовать до тех пор, пока мы не закроем форму. Тогда платформа автоматически удалит его из хранилища. Значит, если пользователь откажется от сохранения изменений, сделанных в форме, нам не нужно заботиться об удалении файла из временного хранилища – платформа это сделает сама.
А вот если пользователь решит сохранить сделанные изменения, тогда будут выполнены следующие действия.
Сначала на сервере будет вызван обработчик события формы Перед записью на сервере (листинг 5).
Листинг 5. Обработчик события «Перед записью на сервере»
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Получить файл из хранилища и поместить его в объект.
Если ЭтоАдресВременногоХранилища(СсылкаНаФайлВоВременномХранилище) Тогда
ДвоичныеДанные = ПолучитьИзВременногоХранилища(СсылкаНаФайлВоВременномХранилище);
ТекущийОбъект.ФайлДоговора = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
ТекущийОбъект.ИмяФайлаДоговора = ИмяФайлаДоговора;
КонецЕсли;
КонецПроцедуры
В этом обработчике мы поместим файл из временного хранилища в реквизит записываемого объекта, и в другой реквизит объекта поместим имя этого файла. Делать это мы будем не всегда (ведь пользователь может записать объект, и не указывая файл договора), а только в том случае, когда реквизит формы действительно хранит ссылку на файл во временном хранилище (листинг 6).
Листинг 6. Проверка того, что навигационная ссылка указывает на временное хранилище
Если ЭтоАдресВременногоХранилища(СсылкаНаФайлВоВременномХранилище) Тогда
В этом случае мы получим из временного хранилища двоичные данные и преобразуем их в объект ХранилищеЗначения, который и поместим в реквизит записываемого объекта (листинг 7).
Листинг 7. Помещение файла в реквизит объекта
ДвоичныеДанные = ПолучитьИзВременногоХранилища(СсылкаНаФайлВоВременномХранилище);
ТекущийОбъект.ФайлДоговора = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
Таким образом, после выполнения этого обработчика мы будем иметь следующую картину (рис. 10).
Рис. 10. Файл в реквизите объекта
Затем платформа начнет запись объекта, и его данные будут помещены в базу данных (рис. 11).
Рис. 11. Запись данных объекта в базу данных
После этого, еще до окончания транзакции записи, на сервере будет вызван обработчик события формы При записи на сервере (листинг 8).
Листинг 8. Обработчик события «При записи на сервере»
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Удалить файл из временного хранилища
Если ЭтоАдресВременногоХранилища(СсылкаНаФайлВоВременномХранилище) Тогда
УдалитьИзВременногоХранилища(СсылкаНаФайлВоВременномХранилище);
КонецЕсли;
КонецПроцедуры
В этом обработчике мы «наведем красоту». Так как данные объекта уже записаны в базу данных, полученный файл успешно сохранен, можно удалить из временного хранилища находящийся там файл. Для этого мы используем ссылку, сохраненную в реквизите формы (рис. 12).
Рис. 12. Удаление файла из временного хранилища
Теоретически можно этого и не делать: платформа все равно автоматически удалит этот файл, когда мы закроем форму. Но в общем случае при интенсивной многопользовательской работе лучше освобождать ресурсы сервера сразу же после того, как необходимость в них исчезает.
Процесс получения файла из информационной базы выглядит гораздо проще. Он целиком реализован в обработчике локальной команды формы СохранитьНаДиск (листинг 9).
Листинг 9. Получение файла из информационной базы
&НаКлиенте
Процедура СохранитьНаДиск(Команда)
Если Объект.ИмяФайлаДоговора = "" Тогда
ПоказатьПредупреждение(, "У поставщика нет сохраненного в базе договора");
Иначе
СсылкаНаФайлВИБ = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ФайлДоговора");
ПолучитьФайл(СсылкаНаФайлВИБ, Объект.ИмяФайлаДоговора);
КонецЕсли;
КонецПроцедуры
Поскольку имя файла договора мы записываем в реквизит объекта только в момент записи, можно использовать его для определения того, есть ли в объекте сохраненный файл или нет.
Если нет, то показываем пользователю сообщение с помощью немодального метода ПоказатьПредупреждение(). Первый параметр – описание оповещения – в этом вызове опущен, так как после вывода предупреждения никаких действий выполнять не требуется.
Чтобы получить файл из информационной базы, нужно иметь навигационную ссылку на этот файл.
Навигационную ссылку мы получаем, указывая ссылку на объект и указывая имя реквизита объекта, в котором хранится файл (листинг 10).
Листинг 10. Получение навигационной ссылки на реквизит объекта
СсылкаНаФайлВИБ = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ФайлДоговора");
Затем просто получаем файл по ссылке СсылкаНаФайлВИБ и сохраняем его на компьютер пользователя с именем, заданным в реквизите ИмяФайлаДоговора (листинг 11).
Листинг 11. Получение файла на компьютер пользователя
ПолучитьФайл(СсылкаНаФайлВИБ, Объект.ИмяФайлаДоговора);
При выполнении этого метода будет открыт стандартный диалог операционной системы, который предложит либо открыть, либо сохранить получаемый файл (рис. 13).
Рис. 13. Диалог получения файла
ИЗОБРАЖЕНИЕ ТОВАРА В ФОРМЕПри работе с картинками используется тот же самый подход, который был описан выше. Отличие заключается только в том, что в предыдущем примере нам не нужно было никак отображать файл в форме элемента справочника Поставщики. А изображение, как правило, загружается в информационную базу именно для того, чтобы отображать ее в какой-либо форме.
Примечание
Пример можно посмотреть в демонстрационной базе «Файлы и картинки», справочник Товары.
Работу с картинками рассмотрим на примере справочника Товары и картинки товара. Ее нужно загрузить, отобразить в форме, сохранить в базе данных и иметь возможность получить из базы данных на клиентский компьютер.
Снова сделаем оговорку. Рассматриваемый пример упрощен, и картинку мы будем хранить в одном из реквизитов самого справочника Товары. В реальной работе, как правило, так не поступают, а хранят картинки в отдельных объектах конфигурации, в справочниках или в регистрах сведений.
Как и в предыдущем примере, справочник Товары будет содержать два реквизита: ФайлКартинки, чтобы хранить саму картинку, и ИмяФайлаКартинки, чтобы знать ее имя при выгрузке на клиентский компьютер (рис. 14).
Рис. 14. Структура справочника «Товары»
Форма элемента справочника Товары также будет содержать два дополнительных реквизита: ИмяФайлаКартинки и СсылкаНаКартинку (рис. 15).
Рис. 15. Реквизиты формы справочника «Товары»
ИмяФайлаКартинки в форме нужно, чтобы не модифицировать данные объекта до того, как начнется запись в базу данных, а СсылкаНаКартинку будет содержать навигационную ссылку на картинку, находящуюся во временном хранилище или в базе данных. Этот реквизит связан с полем формы, имеющим вид Поле картинки. Таким образом, платформа будет автоматически отображать в форме ту картинку, которая находится по ссылке, содержащейся в этом реквизите.
Для загрузки картинки с диска в информационную базу и для сохранения ее на диск в форме созданы две локальные команды: ЗагрузитьСДиска и СохранитьНаДиск.
Загрузка картинки выполняется также с помощью немодального метода НачатьПомещениеФайла(), который мы подробно рассматривали выше на стр. НачатьПомещениеФайла (листинги 12, 13).
Листинг 12. Загрузка картинки
&НаКлиенте
Процедура ЗагрузитьСДиска(Команда)
НачатьПомещениеФайла(Новый ОписаниеОповещения("ЗагрузитьСДискаЗавершение", ЭтотОбъект), , , Истина , УникальныйИдентификатор);
КонецПроцедуры
Листинг 13. Обработчик оповещения «ЗагрузитьСДискаЗавершение»
&НаКлиенте
Процедура ЗагрузитьСДискаЗавершение(Результат, АдресВХранилище, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Результат Тогда
Файл = Новый Файл(ВыбранноеИмяФайла);
ИмяФайлаКартинки = Файл.Имя;
СсылкаНаКартинку = АдресВХранилище;
Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры
Как только в реквизит формы мы поместим ссылку на картинку во временном хранилище (СсылкаНаКартинку = АдресВХранилище), она отобразится в форме (рис. 16).
Рис. 16. Реквизиты формы справочника «Товары»
Таким образом, после помещения картинки она окажется во временном хранилище, а в реквизите формы будет ссылка на нее. Связанное с реквизитом поле картинки отобразит ее в форме (рис. 17).
Рис. 17. Отображение картинки из временного хранилища
Когда пользователь решит сохранить сделанные изменения, на сервере будет вызван обработчик события формы Перед записью на сервере (листинг 14).
Листинг 14. Обработчик события «Перед записью на сервере»
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Получить файл из хранилища и поместить его в объект
Если ЭтоАдресВременногоХранилища(СсылкаНаКартинку) Тогда
ДвоичныеДанные = ПолучитьИзВременногоХранилища(СсылкаНаКартинку);
ТекущийОбъект.ФайлКартинки = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
ТекущийОбъект.ИмяФайлаКартинки = ИмяФайлаКартинки;
КонецЕсли;
КонецПроцедуры
Этот обработчик также аналогичен тому, что рассматривался в листинге 14. Изображение из временного хранилища помещается в объект справочника, туда же помещается имя картинки из реквизита формы (рис. 18).
Рис. 18. Помещение картинки в реквизит справочника
Затем платформа начнет запись объекта, и его данные будут помещены в базу данных (рис. 19).
Рис. 19. Запись данных справочника в базу данных
После этого, еще до окончания транзакции записи, на сервере будет вызван обработчик события формы При записи на сервере (листинг 15).
Листинг 15. Обработчик события «При записи на сервере»
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Удалить файл из временного хранилища.
Если ЭтоАдресВременногоХранилища(СсылкаНаКартинку) Тогда
УдалитьИзВременногоХранилища(СсылкаНаКартинку);
СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(ТекущийОбъект.Ссылка, "ФайлКартинки");
КонецЕсли;
КонецПроцедуры
Здесь есть небольшое отличие от того, что мы делали при работе с файлами.
Как и раньше, мы удаляем картинку из временного хранилища, т. к. она нам больше не нужна, она уже сохранена в базе данных. Но так как форма, как и раньше, должна отображать картинку, в реквизит формы мы помещаем навигационную ссылку на картинку, которая теперь находится в базе данных. Для получения навигационной ссылки указываем ссылку на сам объект и имя его реквизита, в котором хранится изображение (листинг 16).
Листинг 16. Получение навигационной ссылки на реквизит объекта
СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(ТекущийОбъект.Ссылка, "ФайлКартинки");
В результате мы будем иметь следующую картину (рис. 20).
Рис. 20. Отображение картинки из реквизита справочника
Теперь осталось сделать последнюю небольшую доработку. Если сейчас закрыть форму и снова открыть сохраненный элемент, мы не увидим картинки в форме, так как в реквизите формы нет ссылки на сохраненную в базе данных картинку. Поэтому создадим обработчик события формы При создании на сервере и в нем поместим в реквизит формы ссылку на картинку (листинг 17).
Листинг 17. Обработчик события «При создании на сервере»
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.ИмяФайлаКартинки <> "" Тогда
СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ФайлКартинки");
КонецЕсли;
КонецПроцедуры
Листинг 18. Получение картинки из информационной базы
&НаКлиенте
Процедура СохранитьНаДиск(Команда)
Если Объект.ИмяФайлаКартинки = "" Тогда
ПоказатьПредупреждение(, "У товара нет сохраненной в базе картинки");
Иначе
СсылкаНаФайлВИБ = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ФайлКартинки");
ПолучитьФайл(СсылкаНаФайлВИБ, Объект.ИмяФайлаКартинки);
КонецЕсли;
КонецПроцедуры
Рис. 21. Диалог получения файла
КАРТИНКИ, ИСПОЛЬЗУЕМЫЕ ДЛЯ ОФОРМЛЕНИЯКроме картинок, являющихся данными и существующих в виде файлов, в формах могут использоваться картинки, являющиеся элементами оформления. Такие картинки хранятся либо в конфигурации, либо в библиотеке картинок, либо как общие картинки.
Существует три способа использования таких картинок.
Во-первых, такую картинку можно поместить непосредственно в реквизит формы.
Во-вторых, картинку, являющуюся коллекцией, можно поместить в свойство элемента формы Поле, и тогда платформа будет отображать одну из имеющихся картинок коллекции. Здесь возможны два варианта:
Когда поле связано с реквизитом типа Булево, в коллекции должно быть две картинки: одна из них будет отображаться, когда реквизит имеет значение Истина, другая – когда Ложь.
Вторая возможность – связать поле с реквизитом типа Число. Тогда будет отображаться та изображение из коллекции, индекс которой содержится в реквизите.
Рассмотрим перечисленные способы на примере.
Примечание
Пример можно посмотреть в демонстрационной базе «Файлы и картинки», обработка Формирование маршрутных листов.
В качестве «подопытного кролика» будем использовать форму гипотетической обработки ФормированиеМаршрутныхЛистов.
В ней пользователь должен выбрать сначала тип автомобилей, для которых будут формироваться маршрутные листы: «Грузовики» или «Газели». Чтобы тип выбранных автомобилей был хорошо заметен визуально, в левом углу формы мы выведем картинку, иллюстрирующую тот или иной тип автомобиля.
Чтобы выполнить эту задачу, создадим в конфигурации две общие картинки: Грузовик и Газель (рис. 22).
Рис. 22. Общие картинки
Затем создадим реквизит формы обработки ТипАвтомобилей типа Число и свяжем его с полем, имеющим вид Поле переключателя (рис. 23).
Рис. 23 Реквизит формы «ТипАвтомобилей»
Кроме этого, создадим реквизит формы Картинка типа Картинка и свяжем его с полем, имеющим вид Поле картинки (рис. 24).
Рис. 24. Реквизит формы «Картинка»
Теперь для поля ТипАвтомобилей создадим обработчик события ПриИзменении(), в котором напишем следующий текст (листинг 19).
Листинг 19. Обработчик события «При изменении»
&НаКлиенте
Процедура ТипМашинПриИзменении(Элемент)
Если ТипАвтомобилей = 1 Тогда
Картинка = БиблиотекаКартинок.Газель;
ИначеЕсли ТипАвтомобилей = 2 Тогда
Картинка = БиблиотекаКартинок.Грузовик;
КонецЕсли;
КонецПроцедуры
В зависимости от выбранного значения переключателя мы подставляем в реквизит формы ту или иную картинку.
Чтобы при открытии формы были выбраны значения переключателя и картинки, в обработчике события формы При создании на сервере напишем такой код (листинг 20).
Листинг 20. Обработчик события «При создании на сервере»
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ТипАвтомобилей = 1;
Картинка = БиблиотекаКартинок.Газель;
КонецПроцедуры
В результате после открытия формы она будет иметь следующий вид (рис. 25).
Рис. 25. Вид формы после открытия
Если изменить значение переключателя, то изменится и отображаемая в форме картинка (рис. 26).
Рис. 26. Вид формы после переключения типа автомобилей
Теперь займемся списком автомобилей.
Кроме идентификатора автомобиля в этом списке указывается, нужен на данный автомобиль экспедитор или нет. Чтобы визуально быстро выделять автомобили, на которые нужен экспедитор, мы будем использовать пиктограмму, выводимую в первой колонке списка.
Сначала добавим в общие картинки картинку Внимание. Она является коллекцией, состоящей из двух картинок: восклицательного знака и пустой картинки (рис. 27).
Рис. 27. Картинка «Внимание» в режиме коллекции
Если экспедитор требуется, будем показывать восклицательный знак. Если экспедитор не нужен, будем показывать пустую картинку.
Затем создадим реквизит формы СписокАвтомобилей (ТаблицаЗначений) и ее колонки: Автомобиль (Строка) и НуженЭкспедитор (Булево) – рис. 28.
Рис. 28. Реквизиты «Автомобиль» и «НуженЭкспедитор»
Реквизит НуженЭкспедитор свяжем сразу с двумя полями таблицы формы.
Во-первых, с полем СписокАвтомобилейНуженЭкспедитор, имеющим вид Поле флажка. В этом поле мы и будем устанавливать желаемое значение.
Во-вторых, с полем СписокАвтомобилейКартинка, имеющим вид Поле картинки. В этом поле будет отображаться одна из двух пиктограмм.
Чтобы поле СписокАвтомобилейКартинка «знало», где взять пиктограммы, в его свойстве КартинкаЗначений укажем созданную нами общую картинку Внимание (рис. 29).
Рис. 29. Свойство «Картинка значений»
В результате, если в реквизите НуженЭкспедитор будет значение Истина, отобразится первая картинка из коллекции. Если Ложь – вторая, пустая (рис. 30).
Рис. 30. Отображение картинки в форме
Теперь рассмотрим последний способ работы с картинками.
В списке автомобилей желательно также указывать, есть ли необходимость оповещать клиента о предстоящей доставке груза, и если есть – указывать конкретный способ оповещения: по телефону, по электронной почте и т. д. При этом хочется видеть визуальные отметки о том или ином виде оповещения.
Для этого добавим в конфигурацию еще одну общую картинку Оповещения. Она также является коллекцией картинок (рис. 31).
Рис. 31. Картинка «Оповещения» в режиме коллекции
Первая картинка в коллекции – пустая, остальные символизируют определенный вид оповещения.
Также добавим в конфигурацию перечисление ВидыОповещений (рис. 32).
Рис. 32. Перечисление «ВидыОповещений»
После этого в таблицу значений в форме добавим два реквизита.
Первый реквизит – ОповеститьКлиента (с типом ссылки на перечисление ВидыОповещений). Свяжем его с полем таблицы СписокАвтомобилейОповеститьКлиента (рис. 33).
Рис. 33. Реквизиты «ОповеститьКлиента» и «НомерОповещения»
В этом поле мы будем устанавливать нужное значение перечисления.
Второй реквизит – НомерОповещения типа Число. Его свяжем с реквизитом таблицы СписокАвтомобилейКартинкаОповещения, имеющим вид Поле картинки. В этом поле будет отображаться одна из выбранных пиктограмм. В его свойстве КартинкаЗначений выберем нашу общую картинку Оповещения.
Для поля таблицы СписокАвтомобилейОповеститьКлиента создадим обработчик события ПриИзменении(), в котором, в зависимости от выбранного значения перечисления, будем заполнять реквизит НомерОповещения (листинг 21).
Листинг 21. Обработчик события «При изменении»
&НаКлиенте
Процедура СписокАвтомобилейОповеститьКлиентаПриИзменении(Элемент)
ДанныеСтроки = Элементы.СписокАвтомобилей.ТекущиеДанные;
Если ДанныеСтроки.ОповеститьКлиента = ПредопределенноеЗначение("Перечисление.ВидыОповещений.Почта") Тогда
ДанныеСтроки.НомерОповещения = 1;
ИначеЕсли ДанныеСтроки.ОповеститьКлиента = ПредопределенноеЗначение("Перечисление.ВидыОповещений.Телефон") Тогда
ДанныеСтроки.НомерОповещения = 2;
ИначеЕсли ДанныеСтроки.ОповеститьКлиента = ПредопределенноеЗначение("Перечисление.ВидыОповещений.ЭлектроннаяПочта") Тогда
ДанныеСтроки.НомерОповещения = 3;
ИначеЕсли ДанныеСтроки.ОповеститьКлиента = ПредопределенноеЗначение("Перечисление.ВидыОповещений.Интернет") Тогда
ДанныеСтроки.НомерОповещения = 4;
ИначеЕсли ДанныеСтроки.ОповеститьКлиента = ПредопределенноеЗначение("Перечисление.ВидыОповещений.НеОповещать") Тогда
ДанныеСтроки.НомерОповещения = 5;
ИначеЕсли ДанныеСтроки.ОповеститьКлиента.Пустая() Тогда
ДанныеСтроки.НомерОповещения = 0;
КонецЕсли;
КонецПроцедуры
В результате, если значение перечисления не выбрано, будет отображаться пустая пиктограмма. Если выбрано – пиктограмма, соответствующая этому способу оповещения (рис. 34).
Рис. 34. Отображение картинки в форме
Следует сделать небольшое замечание относительно пустых картинок (и картинок вообще), отображаемых в табличной части. Текущая строка списка подсвечивается желтым фоном. Кроме того, к таблице может применяться условное оформление. Поэтому, чтобы пиктограммы хорошо выглядели на любом (не только белом) фоне, нужно делать их фон прозрачным. Особенно это важно для пустых пиктограмм.
В противном случае в текущей строке они будут отображаться в виде белых прямоугольников, что некрасиво и вызывает у пользователя желание нажать на них мышью (рис. 35).
Рис. 35. Отображение картинки с непрозрачным фоном
Чтобы сделать пустую картинку прозрачной, нужно отредактировать ее цвет и установить для него свойство Прозрачность в значение 0 (рис. 36).
Рис. 36. Изменение прозрачности цвета
В результате сделанных изменений проблемы, показанные на рис. 37
Рис. 37. Отображение картинки с прозрачным фоном
СПИСОК ЛИТЕРАТУРЫ
Проектирование информационных систем: учебник и практикум для среднего профессионального образования / Д. В. Чистов, П. П. Мельников, А. В. Золотарюк, Н. Б. Ничепорук; под общей редакцией Д. В. Чистова. — Москва: Издательство Юрайт, 2016. — 258 с. [Электронный ресурс]. – Режим доступа: https://urait.ru/bcode/395599
«1C: Предприятие 8.3. Практическое пособие разработчика. Примеры и типовые приемы» Радченко М. Г. (фирма "1С"), Хрусталева Е. Ю. [Электронный ресурс]. – Режим доступа: https://its.1c.ru/db/pubdevguide83
Разработка интерфейса прикладных решений на платформе "1С: Предприятие 8" В.А. Ажеронок, А.В. Островерх, М.Г. Радченко, Е.Ю. Хрусталева [Электронный ресурс]. – Режим доступа: https://its.1c.ru/db/publab82021#content:31:hdoc.
Расширения конфигураций. Адаптация прикладных решений с сохранением поддержки в облаках и на земле. Разработка в системе 1С: Предприятие 8.3. Издание 2
продолжение названия Е. Ю. Хрусталева [Электронный ресурс] — Режим доступа: https://its.1c.ru/db/pubextensions#content:122:hdoc