Просмотр изображений через тонкий клиент с жесткого диска сервера UPD

02.12.13

Разработка - Работа с интерфейсом

Загрузка с сервера, автоматическое масштабирование, увеличение-уменьшение, поворот. На примере просмотра фотографии сделанных торговыми агентами через систему приема заявок МОБИ-С. UPD: при вставке кода процедуры УстановитьТекстHTMLСФото не вставился собственно html код, исправил

Скачать файлы

Наименование Файл Версия Размер
mavПросмотрФотоМобиС.epf
.epf 22,88Kb
26
.epf 22,88Kb 26 Скачать

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

Система Моби-с загружает фотографии от торговых клиентов и хранит их в папках агентов. Фотографии могут быть привязаны как к товарам, так и к контрагентам. Интересовало именно  фотографии привязанные к контрагентам. Привязка к контрагенту осуществляется через название файла.

Небольшое тестирование показало, что подгружать фотографии сразу в тонкий клиент слишком долго. Поэтому обработка сначала кэширует данные в папке Мои документы на локальном компьютере, куда сохраняет ещё не загруженные фотографии (с отбором по агенту). Кроме того, было выяснено, что предлагаемый 1с способ размещения картинки на форме через декорацию и временное хранилище всё равно прогоняет данные с локального компьютера на сервер. Это опять-таки негативно сказывается на скорости просмотра фотографий. Поэтому в обработке реализован просмотр через html-поле и динамическую генерации кода. Кроме того, разными средставами реализовано:

  • автоматическое масштабирование под размер окна 
  • увеличение-уменьшение изображения
  • поворот изображения
  • открытие в программе для просмотра изображений

Выбор периода осуществляется с помощью публикации Диалог ввода периода, УФ

Собственно процедуры и функции:

Сохранение изображений

&НаКлиенте
Процедура СохранитьФайлыАгента(ТекДанные) //сохраняет фотографии на жесткий диск, ТекДанные - строка дерева значений (динамического списка)
	
	Если ТекДанные = Неопределено Тогда Возврат; КонецЕсли;
	
 	Агент = ТекДанные["ОсновнойМенеджерПокупателя"];
	КодАгента = ПолучитьКодАгента(Агент);
	
	Если КодАгента = "" Тогда Возврат; КонецЕсли; 
	
	Агент = Строка(Агент);
	
	Картинка = Элементы.Декорация1.Картинка; //картинка для индикатора
	КаталогФото = ПолучитьКаталогФото(КодАгента, КаталогЛогФайлов); //каталог, где хранятся фото агента, может быть сетевым, но должен быть доступен на сервере
	СоздатьКаталог(ПапкаМоиДокументы + "\Agents\" + СокрЛП(КодАгента) + "\Photo\Clients"); //создает  папки агента на локальном компьютере в Моих документах. Процедура получения папки Мои документы ниже 
	Файлы = ПолучитьФотографииОбъектовСервер(КаталогФото); //функция на сервере которая получает список всех изображений в папке агента
	Количество = Файлы.Количество();
	Загружено = 0;
	Проверено = 0;
	Шаг = Количество/100;
	Для Каждого Файл из Файлы Цикл
		ОбработкаПрерыванияПользователя();
		ИмяФайла = Файл.ПолноеИмя;
		ИмяФайлаКлиент = СохранитьФайлЛокально(ИмяФайла, Проверено, Загружено); //загружает, если надо файл локально
		Состояние("Проверено: " + Проверено + " из " + Количество + ". Загружено новых: " + Загружено, Проверено/шаг, Агент + " (прервать - CTRL+Break)", Картинка);		
	КонецЦикла;
	Сообщить(""+ Агент + ". Проверено: " + Проверено + ". Загружено новых: " + Загружено);	
КонецПроцедуры

&НаКлиенте
Функция МоиДокументы()
    
    Попытка
        WshShell = Новый COMОбъект("Wscript.Shell");
        WshFolder = WshShell.SpecialFolders.Item("MyDocuments");
        Возврат WshFolder;
    Исключение
        Возврат "";
    КонецПопытки;
    
КонецФункции

&НаКлиенте
Функция СохранитьФайлЛокально(ИмяФайла, Проверено = 0, Загружено = 0) 
	ИмяФайлаКлиент = ПолучитьИмяФайлаКлиент(ИмяФайла);
	Проверено = Проверено + 1;
	Если НайтиФайлы(ИмяФайлаКлиент).Количество() <> 0 Тогда
		Возврат(ИмяФайлаКлиент);
	КонецЕсли;
	АдресФайла = ФайлВоВременноеХранилищеСервер(ИмяФайла);
	ПолучитьФайл(АдресФайла, ИмяФайлаКлиент, Ложь);
	Сообщить("Сохранили: " + ИмяФайлаКлиент); 
	УдалитьИзВременногоХранилища(АдресФайла);		
	Загружено = Загружено + 1;
	Возврат(ИмяФайлаКлиент);
КонецФункции

&НаКлиенте
Функция ПолучитьИмяФайлаКлиент(ИмяФайла)
	Возврат(СтрЗаменить(ИмяФайла, КаталогЛогФайлов, ПапкаМоиДокументы + "\"));
КонецФункции

&НаСервереБезКонтекста
Функция ФайлВоВременноеХранилищеСервер(ИмяФайла)

	Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла));	
	Возврат(Адрес);

КонецФункции // ФайлВоВременноеХранилище()

Обновление списка файлов:

 

&НаКлиенте
Процедура ОбновитьСписокФото(Команда)
	
	СписокФото.Очистить();
	ТекДанные = Элементы.СписокКонтрагентов.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	КодАгента	= ПолучитьКодАгента(ТекДанные["ОсновнойМенеджерПокупателя"]);
	КаталогФото 	= ПолучитьКаталогФото(КодАгента, КаталогЛогФайлов);
	Если ТипЗнч(ТекДанные) = Тип("СправочникСсылка.Контрагенты") Тогда
		КодКонтрагента = СокрЛП(ТекДанные.Код);
	Иначе
		КодКонтрагента = "";
	КонецЕсли;
	Файлы = ПолучитьФотографииОбъектовСервер(КаталогФото, КодКонтрагента); //список фото на сервере, возвращает массив с элементами типа Структура, чтобы протащить их с сервера на клиент
	СоздатьКаталог(ПапкаМоиДокументы + "\Agents\" + СокрЛП(КодАгента) + "\Photo\Clients"); //создаем на всякий случай, т.к. при просмотре отсутствующие локально фото сохраняются
	Для Каждого Файл из Файлы Цикл //далее в цикле разбираем имя файла на части, алгоритм от Моби-С
		ФайлСтр = Файл.ИмяБезРасширения;
		Комп = СтрЗаменить(ФайлСтр, "_", Символы.ПС);
		Дата = СтрПолучитьСтроку(Комп, 2);
		Время = СтрПолучитьСтроку(Комп,3);
		ДатаФайла = Дата(Прав(Дата, 4), Сред(Дата, 3, 2), Лев(Дата, 2), Лев(Время, 2), Сред(Время, 3, 2), Прав(Время, 2));
		ДатаФайла = КонвертироватьUTCВремяВЛокальное(ДатаФайла, 99);
		Если НЕ ((ДатаФото1 = '00010101' Или ДатаФайла >= НачалоДня(ДатаФото1)) И (ДатаФото2 = '00010101' ИЛИ ДатаФайла  "" И КодОбъекта <> КодКонтрагента Тогда Продолжить; КонецЕсли;
		Контрагент = ПолучитьКонтрагента(КодОбъекта);
		стр = СписокФото.Добавить();
		стр.ИмяФайла = Файл.ПолноеИмя;
		стр.Дата = ДатаФайла;
		стр.Контрагент = Контрагент;
	КонецЦикла;

	СписокФото.Сортировать("Дата");
	
КонецПроцедуры


Генерация html-кода при  выборе фотографии

 

&НаКлиенте
Процедура УстановитьТекстHTMLСФото(СсылкаНаКартинку)
	СтрокаМасштаба = "width='";
	
	Попытка //пытаемся получить размеры фото, чтобы выяснить по ширине или высоте масштабировать
		Image = Новый COMОбъект("WIA.ImageFile");
		Image.LoadFile(СсылкаНаКартинку);
		Если Image.Height > Image.width Тогда
			СтрокаМасштаба = "height='";
		КонецЕсли;
		Image = "";
	Исключение
	КонецПопытки;
	СтрокаМасштаба = СтрокаМасштаба + Масштаб + "%'"; //в зависимости от реквизита формы, который обычно 100
	Фото = "
        |
        |
        |
        |


        |
        |"; КонецПроцедуры // УстановитьТекстHTMLСФото()

Поворот изображения

 

&НаКлиенте
Процедура ПовернутьФото(Градус) //описание есть в мое публикации про сканирование

	Если Элементы.СписокФото.ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ИмяФайла = Элементы.СписокФото.ТекущиеДанные.ИмяФайла;
	ИмяФайла = ПолучитьИмяФайлаКлиент(ИмяФайла);
	Если НайтиФайлы(ИмяФайла).Количество() = 0 Тогда
		Сообщить("Нечего поворачивать");
		Возврат;
	КонецЕсли;
	
	Image = Новый COMОбъект("WIA.ImageFile");
 	Image.LoadFile(ИмяФайла);
	
	Если Image = Неопределено Тогда
        Возврат;
    КонецЕсли;

    IP = Новый COMОбъект("WIA.ImageProcess"); //создаем объект WIA для редактирования изображения
    IP.Filters.Add(IP.FilterInfos("RotateFlip").FilterID); //создаем WIA-фильтр для поворота
    IP1 = IP.Filters(1);
    Для К = 1 По IP1.Properties.Count Цикл
        Если IP1.Properties(К).Name = "RotationAngle" Тогда
            IP1.Properties(К).Value = Градус; //вертеть можно на 90,180 и 270 грудосов
            Прервать;
        КонецЕсли;
    КонецЦикла;

    Image = IP.Apply(Image);
	КопироватьФайл(ИмяФайла, ИмяФайла + "1");
	УдалитьФайлы(ИмяФайла);
	Image.SaveFile(ИмяФайла);
	УдалитьФайлы(ИмяФайла + "1");
	ОбновитьФото();
	Image = "";
	IP = "";
	IP1 = "";
	
КонецПроцедуры
 

Открытие в программе просмотра изображений

&НаКлиенте
Процедура ОткрытьФото(Команда)
	ЗапуститьПриложение(Элементы.СписокФото.ТекущиеДанные.ИмяФайла);
КонецПроцедуры

моби-с mobi-s фото картинки изображения тонкий

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61713    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54322    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    16626    21    4    

35

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2025    21    progmaster    7    

3

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3582    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12014    1    5    

10

Условное оформление элементов форм в пользовательском режиме 1С (управление видимостью и доступностью элементов форм)

Работа с интерфейсом Платформа 1С v8.3 Платные (руб)

Подсистема условного оформления элементов форм (далее подсистема) предназначена для настройки оформления элементов форм (видимость, доступность, цвет фона, цвет текста и прочее) в пользовательском режиме 1С. Также подсистему возможно использовать для ограничения доступа к реквизитам формы для определенных пользователей (или групп пользователей).

6000 руб.

18.01.2022    8775    1    2    

6
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. sikuda 673 28.11.13 09:34 Сейчас в теме
А почему не засунуть все фото на сервере во временное хралилище и пользуясь кэшом браузера показывать их в HTML поле? Типа < img src='"+СсылкаНаКартинку+"'/ >
2. anig99 2841 28.11.13 10:05 Сейчас в теме
(1) кэш браузера не очень надежная вещь + так заранее нельзя подгрузить все фото. Кроме того, нужно придумывать как сделать, чтобы навигационные ссылки были одинаковые в разных сеансах. А так, как раз подгружать приходиться только НОВЫЕ фото.
3. anton.fly7 173 28.11.13 16:48 Сейчас в теме
а возможно как то в тонком клиенте вставить изображение из буфера обмена и передать его на сервер? в идеале хотелось бы делать это в веб-браузере, но тонкий тоже подойдет
4. anig99 2841 28.11.13 17:10 Сейчас в теме
(3) копать в эту сторону. http://help1c.com/faq/view/705.html
Если удастся буфер в двоичные данные перегнать, то можно и на сервер отправить.
5. anig99 2841 02.12.13 11:46 Сейчас в теме
упорно не хочет вставлять код в процедуре УстановитьТекстHTMLСФото
Фото = "
	    |<!DOCTYPE html>
	    |<html>
	    |<body>
	    |<img src='" + СсылкаНаКартинку + "' " + СтрокаМасштаба + ">
	    |</body>
	    |</html>";
6. sikuda 673 20.12.13 17:28 Сейчас в теме
(5) Доделал свой просмоторщик без COM+.
Если размер легко поменять, то поворот это только CSS3 и тонкий клиент 1С в пролете.
Но это разве может нас остановить http://infostart.ru/public/242659/
7. mastersva 27.02.14 09:07 Сейчас в теме
Подскажите, а как обстоит ситуация с оперативной памятью, просто при просмотре через поле картинки на управляемой форме память растет как на дрожжах.
8. anig99 2841 27.02.14 12:36 Сейчас в теме
(7) не проверял, но тут не поле картинки. Вроде лучше должно быть
Оставьте свое сообщение