Работа с файлами (картинками) в интерфейсе Такси

Рассмотрим алгоритм работы с файлами и картинками в новом интерфейсе 1С:Предприятие 8.3 "Такси".

Во-первых, почему я решил написать эту статью: Новая концепция 1С — отказ от модальных окон, следовательно все методы и объекты, которые порождали открытие модальных окон в новом интерфейсе работать не смогут, точнее смогут, только если в свойствах конфигурации разрешить модальные окна.

Рассмотрим алгоритм работы с файлами и картинками в новом интерфейсе 1С:Предприятие 8.3 «Такси».

Во-первых, почему я решил написать эту статью: Новая концепция 1С — отказ от модальных окон, следовательно все методы и объекты, которые порождали открытие модальных окон в новом интерфейсе работать не смогут, точнее смогут, только если в свойствах конфигурации разрешить модальные окна.

 

Однако, если разрешить модальные окна, то мы столкнемся с проблемами при работе в web-клиенте.
 
 
Во-вторых, о работе с картинками в управляемых формах часто спрашивают.
 
Итак, задача: в справочнике «Товары» необходимо сохранять и отображать в форме фотографию товара.
Исходная конфигурация не содержит ничего, кроме самого справочника с товарами, выкладывать ее не буду, просто создайте пустую конфигурацию в 8.3.
 
Для хранения самого графического файла, в справочнике создадим реквизит «ДанныеКартинки», с типом «Хранилище значений».
 
 
Если планируете выгружать картинку (файл) из информационной базы обратно в файловую систему, то добавьте еще реквизит, который будет хранить исходное имя файла и его тип.
 
Далее, займемся формой. Как видно на картинке, реквизит с типом хранилище значений в форме недоступен.
 
 
Как будем отображать картинку в форме? Нет, не декорацией с типом «картинка». А в виде реквизита формы с типом «строка». Да, да! Это очевидно, и странно, что мало кто об этом догадывается сам. 😉
 
Все дело в том, что если на форму вынести реквизит с типом «строка», который будет содержать навигационную ссылку на графические данные или адрес временного хранилища которое содержит такие данные, то форма сможет отобразить сами графические данные.
Добавим реквизит формы с именем «СсылкаНаКартинку», тип «строка», длина не ограничена. И поместим его в реквизиты формы.
 
 
По умолчанию, строка в форме будет выглядеть как поле ввода, нам нужно поменять это, в свойствах элемента формы. Выберем в свойстве «Вид» «Поле картинки».
 
 
Интерфейсная часть готова. Займемся кодингом. Создадим команду формы «ВыбратьФайлКартинки», в виде кнопки расположим ее на форме.
 
 
В модуле опишем обработчик события «Действие» для созданной команды формы:

Пару комментариев к вышеописанному коду:
Если бы мы не обращали внимание на режим модальности приложения, то могли вполне использовать метод «ПоместитьФайл», однако цель статьи показать работу с файлами именно в таком режиме.
Метод НачатьПомещениеФайла помещает выбранный файл во временное хранилище (если выбор файла был произведен) и вызывает процедуру «ОбработатьВыборФайла» в этом же модуле.
Обращаю внимание на выделенный «УникальныйИдентификатор», этим свойством мы связали временное хранилище с текущей формой. В противном случае файл в хранилище помещен будет, но само хранилище при серверном вызовет будет уничтожено, а нам оно еще понадобится, для записи файла в реквизит справочника.
Опишем процедуру «ОбработатьВыборФайла»:

Если пользователь не отказался от выбора файла, то в реквизит формы «СсылкаНаКартинку» помещаем адрес во временном хранилище, куда были помещены данные картинки.

 
Вуаля!
 
 
Так, осталось теперь при записи элемента справочника записать данные из временного хранилища в реквизит элемента справочника. Описываем событие ПередЗаписьюНаСервере:

Проверяем в реквизите формы у нас что? Если адрес временного хранилища, пишем данные в реквизит элемента справочника, обращаясь к «ТекущийОбъект», «ТекущийОбъект» — это сконвертированные данные формы, которые пишутся в базу в этот момент времени.

Осталось описать открытие формы, для отображения картинки уже сохраненной в реквизите элемента справочника.

 
Актуальную версию статьи и выгрузку базы с примером можно найти тут.

67 Comments

  1. maxis33

    Просто и доступно, спасибо!

    Reply
  2. Ёпрст

    что такое «модельных окон» ?

    Reply
  3. GROOVY

    Опечатка.

    Reply
  4. Ёпрст

    (3) тогда исправляй везде, а не только в заголовке темы.

    🙂

    Reply
  5. WalterMort

    Вроде как диалоги открытия/закрытия файлов из браузера не требуют отключения блокировки всплывающих окон. Нафиг с ними то так заморочились?

    Reply
  6. YPermitin

    Принцип остался тот же, что и для управляемых форм.

    Так получается?

    Reply
  7. Algiz

    (6) YPermitin, да, такой же

    Reply
  8. GROOVY

    Так это и есть управляемые формы.

    Reply
  9. sikuda

    — Как будем отображать картинку в форме? Нет, не декорацией с типом «картинка». А в виде реквизита формы с типом «строка»…

    Суть этого реквизита — ссылка на ресурс внутри 1С. Если близко рассмотреть текст страницы это то что попадает в поле src

    Reply
  10. GROOVY

    (9) [Суть этого реквизита — ссылка на ресурс внутри 1С.] sikuda, так я вроде как и написал…

    Reply
  11. Evil Beaver

    Не только картинки, а вообще любые ХранилищаЗначения, которые нужно наполнять из управляемой формы требуют такого подхода. Суть проблемы — ХранилищеЗначения недоступно в данных формы. Если установить ему значение на сервере, то оно умрет при возврате на клиента. Нужно всегда использовать ВременноеХранилище, как промежуточный буфер, а в ПередЗаписьюНаСервере уже наполнять ТекущийОбъект нужными данными из временного хранилища.

    Reply
  12. OVladius

    Блин, я такой ложкой как на картинке в детстве борщи хлебал, ностальгия….

    Reply
  13. Evil Beaver

    (12) OVladius, а я до сих пор! 🙂

    Reply
  14. AllexSoft

    (12) OVladius, я думал это намек на ложку дёгтя … )

    Reply
  15. Den_D

    (10) Увидел публикацию, не посмотрел на автора и подумал, что кто-то с Вашего мастер-класса, оказался шустрее автора)))

    Reply
  16. Den_D

    (12) OVladius, эта ложка которой 1С предлагает нам хлебануть г…на с «управляемыми» формами)))

    Reply
  17. ZLENKO

    Ложка весьма символично отражает тему статьи 🙂

    Reply
  18. vano-ekt

    а в обычной уф разве не так? причем тут такси?

    Reply
  19. GROOVY

    (18) vano-ekt,

    1. Такси это и есть УФ.

    2. В Такси отказались от модальных окон.

    Reply
  20. Evg-Lylyk

    (0) Спасибо за публикацию, актуальная тема

    Желательно выложить базу пример.

    Нужна функция очистить картинку

    Reply
  21. sikuda

    (11) Я думаю они это сделали специально. Они не предоставили API для работы с большим объемом данных, поэтому сделали это асинхронно, как загрузка картинок на html страницу. Это не проблема, это фича.

    И есть повод понять что 1С внутри уже другое — Это же асинхронный код!!!

    Оповещение = Новый ОписаниеОповещения(«ОбработатьВыборФАйла», ЭтотОбъект);
    НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
    Reply
  22. Evil Beaver

    (21) sikuda, Нету там асинхронного кода. А не сделали они это да, специально. Я не говорю, что это косяк. Просто нужно понимать упр. форму и знать такую особенность с хранилищем значения.

    А про асинхронку — ОбработкаОповещения — это не совсем то. Она не асинхронна в прямом смысле. Параллельно ничего не выполняется. Callback оповещения стоит в очереди и вызывается, когда это будет можно, но синхронно с остальным кодом.

    Внутри 1С может быть и другое (я не видел), но нам, смертным, асинхронного исполнения не видать еще долго. Имхо.

    Reply
  23. sikuda

    (22) Согласен в текущем состоянии все загоняется в буфер и выпоняется последовательно. Какой то частью мы управляем, а какая-то(хранилище значений) делается без нас.

    Я именно хочу обратить внимание, что выше приведенных код по сути своей асинхронный. И такой код будет все больше и больше проникать в типовые конфигурации, а дальше дело 1С как правильно включить паралельную работу. Асинхронный код это не подарок, это головная боль разработчика…

    Говорить, что в 1С нет паралельной работы я бы не стал:

    ЭтаФорма.СкомпоноватьРезультат(РежимКомпоновкиРезультата.Фоновый);
    Reply
  24. Evil Beaver

    (23) sikuda,

    РежимКомпоновкиРезультата.Фоновый

    Знаете, что тут происходит? Запускается отдельный сеанс с базой данных. Самостоятельный, управляемый планировщиком фоновых заданий. Да, по отношению к вашему коду он будет выполнен параллельно, но ограничений куча же. Все равно не понимаю, какое отношение имеет реквизит управляемой формы «ХранилищеЗначения» и асинхронное исполнение?

    Пока транзакция записи объекта не завершится, ваш код не может ничего сделать, где тут асинхрон? асинхрон по отношению к чему?

    Reply
  25. GROOVY

    (20) Evg-Lylyk, Зачем базу, тут 20 строк кода? Правда нужно?

    Reply
  26. Evg-Lylyk

    (25) Думаю было бы полезно я вот хотел посмотреть как работает после Перечитать.

    Reply
  27. NickOmskiy2

    тоже в свое время брал пример из Профессиональной разработки» http://infostart.ru/public/185351/ с применением для БГУ, но можно и для прочего…

    Reply
  28. sikuda

    (24) Вернемся к асинхронному коду (11) Очень внимательно читаем справку:

    «В тонком и толстом клиентах, в отличие от веб-клиента, метод блокирует исполнение кода языка. Тем не менее, по завершению помещения файла указанный обработчик оповещения также будет вызван, но до исполнения кода, размещенного после вызова метода.»

    И в код после НачатьПомещениеФайла вставим бесконечный цикл. В Тонком клиенте сначала выбор файла. Потом цикл.

    А в web-клиенте наоборот сначала зависаем (браузер просит остановить цикл), потом выбор файла.

    То есть в web-клиенте Оповещение работает как чистый callback javascript.

    Именно это я пытаюсь вложить в фразу «код по сути своей асинхронный». И именно такое поведение стандартное для javascript на web страницах.

    Reply
  29. Evil Beaver

    (28) sikuda, понял, мы говорим о совсем разных вещах, поэтому не понимаем друг-друга 🙂

    Reply
  30. sa1m0nn

    Спасибо за статью.

    Замечание: про размещение на форме строки с видом Картинка и навигационной ссылкой на данные картинки следовало бы описать в статье, что это методика изначально Управляемого приложения, т.е. с 8.2 так работает. А нового здесь — только немодальные «модальные» методы с описанием оповещения.

    Reply
  31. sikuda

    Удалил про html5 (Не будем смущать неокрепшие умы 1С-ников)

    Reply
  32. sikuda

    (0) …(Убрал по просьбе автора)

    Reply
  33. GROOVY

    (32) sikuda, на мой взгляд к моей статье это вообще только словом «картинка» привязать можно 🙂

    Reply
  34. Bukaska

    (33)

    Как будем отображать картинку в форме? Нет, не декорацией с типом «картинка». А в виде реквизита формы с типом «строка». Да, да! Это очевидно, и странно, что мало кто об этом догадывается сам. 😉

    Спасибо! Я всегда пользовалась как раз декарацией(в всяком случае в 8.2)

    По умолчанию, строка в форме будет выглядеть как поле ввода, нам нужно поменять это, в свойствах элемента формы. Выберем в свойстве «Вид» «Поле картинки».

    ну это уж даже самое главное ..

    Правильно я понимаю, что если бы я сделала реквизит типа не строка, а хранилище значения, и указала бы у поля путь к нему.. Пришлось бы мучаться с таким функционалом, как ДанныеФормыВЗначение и ЗначениеВДанныеФормы?

    Reply
  35. GROOVY
    Правильно я понимаю, что если бы я сделала реквизит типа не строка, а хранилище значения, и указала бы у поля путь к нему.. Пришлось бы мучаться с таким функционалом, как ДанныеФормыВЗначение и ЗначениеВДанныеФормы?

    Строка — это реквизит формы. Как Вы собрались реквизит формы с типом ХранилищеЗначения сделать?

    Reply
  36. clev

    Спасибо за прием работы с файлами!

    Помогите разобраться с такой проблемой:

    При активизации строки табличной части пытаюсь отобразить картинку на форме:

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

    Показать

    В момент присвоения СсылкаНаКартинку=ПолучитьКартинку(Элемент.ТекущиеДанные.НомерСтроки); платформа падает.

    СсылкаНаКартинку в этот момент содержит текст:

    «e1cib/data/БизнесПроцесс.СогласованиеДоговора.Файлы.ДанныеКартинки?ref=8711be1ed620b4fc11e38ca646b858c4&index=0»

    В чем может быть проблема?

    Reply
  37. clev

    Все, разобрался. Может, кому-то пригодится. Надо было сначала считать картинки объекта и поместить их во временное хранилище:

    &НаСервере
    Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    Для Каждого СтрФайлы Из Объект.Файлы Цикл
    Хранилище=ТекущийОбъект.Файлы[СтрФайлы.НомерСтроки-1].ДанныеКартинки.Получить();
    
    СтрФайлы.фСсылкаНаКартинку=ПоместитьВоВременноеХранилище(Хранилище, УникальныйИдентификатор);
    КонецЦикла
    КонецПроцедуры
    

    Показать

    Reply
  38. GROOVY

    (37) clev, зачем картинку во временное хранилище пихать? Это же физическая запись на диск. Достаточно навигационную ссылку получить.

    Reply
  39. clev

    (38) не могу разобраться, почему код из (36) не работает. Не подскажете, что не так?

    Reply
  40. alexkon

    (39) clev, я процедуру ПриЧтенииНаСервере() заменил на ПриСозданииНаСервере(). На форме предварительно сделал реквизит типа «ТаблицаЗначений» с колонкой «АдресВременногоХранилища». В ПриСозданииНаСервере() получал данные картинок из ТЧ файлов и клал их во временное хранилище(только надо не забыть преобразовать реквизит формы в значение и после всего обратно в реквизит формы). Адреса временных хранилищ положил в созданный реквизит построчно. А в процедуре ПриАктивизацииСтроки() присваивал СсылкеНаКартинку адреса временных хранилищ(индексы совпадают), полученные из реквизита формы. А изначально платформу тоже вышибало.

    Reply
  41. clev

    (40) alexkon, Так в (37) я почти так и делаю.

    Только не создаю новую ТЗ, а в табличной части формы добавил реквизит c типом «строка».

    И при ПриЧтенииНаСервере() в этот реквизит записываю адрес во временном хранилище.

    В этом варианте все работает. Но GROOVY в (38) говорит, что так не правильно.

    Reply
  42. alf2006x

    С файлом вроде более-менее понятно, но я не могу найти способ немодального «таксишного» выбора каталога. Может кто подскажет как это сделать?

    Мне надо чтобы пользователь выбрал каталог, а после выбора строку каталога записать в реквизит справочника.

    Reply
  43. alf2006x

    (42) alf2006x,

    Процедура ПутьКДНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
    Если ДиалогВыбораФайла.Выбрать() Тогда      //обработка файла Диалог.Каталог;
    Объект.ПутьКД = ДиалогВыбораФайла.Каталог;
    КонецЕсли;
    КонецПроцедуры
    

    Вопрос снят.

    Reply
  44. 911service

    А как в данном способе применить фильтр на тип файла (Расширение)?

    Reply
  45. Smallrat

    (36) clev,

    Вот тоже с похожим случаем столкнулся при изменении режима совместимости конфы:

    Есть два случая — получаю файл из реквизита ссылки:

     Адрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка, «Данные»);
    ПолучитьФайл(Адрес, Объект.ИмяФайла, Истина);

    и получаю из реквизита табличной части ссылки:

     Адрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка, «ПечатныеФормы.Данные», Элементы.ПечатныеФормы.ТекущаяСтрока);
    ПолучитьФайл(Адрес, Элементы.ПечатныеФормы.ТекущиеДанные.ИмяФайла, Истина);
    

    Меняю режим совместимости с 8.2.13 на «не использовать» (для плафтормы 8.3.5), и первый код так и остаётся рабочим, зато второй начинает падать:

    «Неправильный путь к файлу ‘e1c://server/SRV-1С:3541/TestGD/e1cib/data/Справочник.ВариантыДоговоров.ПечатныеФормы.Данные?ref=b5df0025900ab87711e233d403d247a3&index=0′»

    помогает только если переписать с получения ссылки на помещение в хранилище, причем если не использовать метод Получить() (спасибо (37)), то полученный адрес тоже будет нерабочим. Отчего такая беда, непонятно (((

    Reply
  46. GROOVY

    (45) Smallrat, ТекущаяСтрока элементов формы <> Индекс или номер строки данных. Нужно ссылаться именно на данные записанные в БД.

    Reply
  47. Smallrat

    (46) Там в третьем параметре надо указать индекс строки. «Элементы.ПечатныеФормы.ТекущаяСтрока» у меня даёт 0 — вполне себе индекс. я и просто число указывал, всё равно не работает. Причём при включенном режиме совместимости ошибок нет.

    Reply
  48. GROOVY

    (47) Smallrat, еще раз, ТекущаяСтрока это НЕ индекс. И есть ли данные на которые ссылается текущая строка в базе?

    Reply
  49. aseiduldayev

    У меня такая же трабла. Кто может помоч ? При строке платформа проваливается

    Объект.АдресКартинки=ПолучитьНавигационнуюСсылку(Объект.Ссылка,»ТЧПрикрепленныеФайлы.ПрикрепленныйФайл»,0);

    Reply
  50. aseiduldayev

    Тут так и не разобрались. Т

    Reply
  51. GROOVY

    (49) aseiduldayev, Какая «такая же»?

    Куда проваливается платформа?

    Reply
  52. Smallrat

    (48) Хорошо, действительно параметр ТекущаяСтрока некорректно использовать (хоть в моем случае это 0)

    переписал так:

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

    Показать

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

    Reply
  53. 3762515

    У меня не получается, ошибка:

    {Справочник.Лис_ТипыКонтейнеров.Форма.ФормаЭлемента.Форма(15)}: Ошибка при вызове конструктора (ОписаниеОповещения)

    Оповещение = Новый ОписаниеОповещения(«ОбработатьВыборФайла», Объект);

    по причине:

    Не найден экспортируемый метод: ОбработатьВыборФайла

    Reply
  54. 3762515

    А ещё в процедуре «ВыбратьФайлКартинки» ругается на «ЭтотОбъект»

    Reply
  55. GROOVY

    (53) 3762515, Надо, просто на 8.3 кодить.

    Reply
  56. vitaliy1911

    пишу

    &НаКлиенте
    Процедура КомандаОткрытьФайл(Команда)
    Адрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка, «ДанныеФайла»);
    ПолучитьФайл(Адрес);
    КонецПроцедуры

    ругается

    {Справочник.sd_Файлы.Форма.ФормаЭлемента.Форма(37)}: Ошибка при вызове метода контекста (ПолучитьФайл)

    ПолучитьФайл(Адрес, Объект.Наименование);

    по причине:

    Неправильный путь к файлу ‘e1c://filev/C/bases/desktopSD/e1cib/data/Справочник.sd_Файлы.ДанныеФайла?ref=bdda4487fca76d4611e4cd932712cf62’

    ДанныеФайла — хранилище значений с данными файла

    что я делаю не так? (8.3.5.1460)

    П.С. Разобрался. Пытался поместить данные через реквизитформывзначение, запись в реквизит, затем значениевреквизитформы. так не правильно, потому что после обратного перехода в реквизит формы данные теряются. не повторяйте моих ошибок

    Reply
  57. lamdth

    (44) 911service,

    Фильтр по расширению:

    ДиалогОткрытияФайла       = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогОткрытияФайла.Фильтр     = «Формат JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg|»;
    ДиалогОткрытияФайла.МножественныйВыбор  = Ложь;
    ДиалогОткрытияФайла.ПредварительныйПросмотр = Истина;
    ДиалогОткрытияФайла.Заголовок    = Нстр(«ru=’Выберите файл с фотографией'»);
    
    ОповещениеОбработатьВыборФайла = Новый ОписаниеОповещения(«ОбработатьВыборФайла», ЭтотОбъект);
    НачатьПомещениеФайлов(ОповещениеОбработатьВыборФайла, , ДиалогОткрытияФайла, Истина, УникальныйИдентификатор);
    
    

    Показать

    Reply
  58. androgin

    И получать картинки нужно в ПриЧтенииНаСервере

    Reply
  59. DrSMERTb

    А как теперь можно ещё сделать функцию сохранения на диск картинки из базы?

    Reply
  60. Гость

    Здравствуйте!

    Сделала так, как у вас написано. Картинка добавляется, но при последующем открытии элемента пропадает. Подскажите, пожалуйста, в чем может быть проблема?

    Reply
  61. deutsch2008

    не получилось! вообще не чего. одни ошибки (((((

    Reply
  62. deutsch2008

    {Справочник.Товары.Форма.ФормаЭлемента.Форма(5,64)}: Переменная не определена (ЭтотОбъект)

    Оповещание = Новый ОписаниеОповещения(«ОбработатьВыборФайла», <<?>>ЭтотОбъект); (Проверка: Толстый клиент (обычное приложение))

    Reply
  63. Mars2006

    Всё работает без ошибок. только картинка не отображается.

    Можете подсказать. всё написано как в посте, ничего своего.

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

    Показать

    Reply
  64. ZloyProger

    Доброго времени суток,Коллеги.

    Извиняюсь за некропостинг, но думаю новую тему не стоит ради такого пустяка заводить) Поясните ЧЯДНТ — есть самописка, с запрещенными модальными вызовами пишу а-ля:

    &НаКлиенте
    Процедура МояКоманда(СписокФайлов)
    МассивФайлов = Новый Массив;
    Для Каждого Файл Из СписокФайлов Цикл
    МассивФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(Файл.Значение.ПолноеИмя, Файл));
    КонецЦикла;
    НачатьПомещениеФайлов(Новый ОписаниеОповещения(«ПослеПомещенияФайлов», ЭтаФорма), МассивФайлов, Ложь, УникальныйИдентификатор);
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ПослеПомещенияФайлов(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт
    ПрочитатьФайлыНаСервере(ПомещенныеФайлы);
    КонецПроцедуры
    
    &НаСервере
    Процедура ПрочитатьФайлыНаСервере(ПомещенныеФайлы)
    //некоторые действия с файлами, выполняются на сервере, потому что необходим доступ к структуре метаданных конфигурации
    Конец
    

    Показать

    СписокФайлов — соответственно список значений, где значения — файлы, представление — текстовой описание файла. Код отрабатывает, всё выполняется, но… выдает предупреждение, что использование синхронных методов запрещено… Кто и где синхронный-то?

    Reply
  65. vitaliy1911

    (64) вы уверены, что предупреждение именно на этот фрагмент кода? попробуйте выделить весь текст модуля и через контекстное меню «рефакторинг» выполнить замену всех синхронных методов, посмотрите что получится

    Reply
  66. ZloyProger
    Reply
  67. mentozavr

    Спасибо за мануал. помог. Пытаюсь отобразить загруженный пдф док на форме в web-клиенте.

    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    АдресМ = ПолучитьНавигационнуюСсылку(Объект.Ссылка,»ДанныеРезюме»);
    //сообщить (АдресМ);
    #Если ВебКлиент Тогда
    Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
    УстановитьРасширениеРаботыСФайлами();
    ПодключитьРасширениеРаботыСФайлами();
    КонецЕсли;
    #КонецЕсли
    Реквизит1 = «<html><EMBED id=’PDF’ width=100% height=100% type=»»application/pdf»» src=»»»+АдресМ+»»»></EMBED></html>»;
    //Реквизит1 = АдресМ;
    КонецПроцедуры
    

    Показать

    Поле появляется и пишет, что невозможно отобразить pdf документ. на толстом клиенте все работает изумительно

    Reply

Leave a Comment

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