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

22.07.13

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

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

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

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

 

 

Однако, если разрешить модальные окна, то мы столкнемся с проблемами при работе в web-клиенте.

 

Во-вторых, о работе с картинками в управляемых формах часто спрашивают.

 

Итак, задача: в справочнике "Товары" необходимо сохранять и отображать в форме фотографию товара.

Исходная конфигурация не содержит ничего, кроме самого справочника с товарами, выкладывать ее не буду, просто создайте пустую конфигурацию в 8.3.

 

Для хранения самого графического файла, в справочнике создадим реквизит "ДанныеКартинки", с типом "Хранилище значений".

 

 

Если планируете выгружать картинку (файл) из информационной базы обратно в файловую систему, то добавьте еще реквизит, который будет хранить исходное имя файла и его тип.

 

Далее, займемся формой. Как видно на картинке, реквизит с типом хранилище значений в форме недоступен.

 

 

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

 

Все дело в том, что если на форму вынести реквизит с типом "строка", который будет содержать навигационную ссылку на графические данные или адрес временного хранилища которое содержит такие данные, то форма сможет отобразить сами графические данные.

Добавим реквизит формы с именем "СсылкаНаКартинку", тип "строка", длина не ограничена. И поместим его в реквизиты формы.

 

 

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

 

 

Интерфейсная часть готова. Займемся кодингом. Создадим команду формы "ВыбратьФайлКартинки", в виде кнопки расположим ее на форме.

 

 

В модуле опишем обработчик события "Действие" для созданной команды формы:
 

 

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


Опишем процедуру "ОбработатьВыборФайла":

 

 

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

 

Вуаля!

 

 

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

 

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

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

 

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

См. также

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

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

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

6000 руб.

16.01.2015    61797    43    59    

80

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

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

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

5000 руб.

14.01.2016    54403    16    21    

42

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

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

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

2400 руб.

29.06.2020    16697    21    4    

35

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    10737    750    elcoan    45    

106

Конструктор HTML, CSS и javascript

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

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

2 стартмани

10.04.2023    9614    151    acces969    31    

118

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

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

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

1 стартмани

05.07.2022    3665    kalyaka    2    

27

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

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

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

3600 руб.

29.04.2022    12080    1    5    

10
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. maxis33 45 22.07.13 10:09 Сейчас в теме
Просто и доступно, спасибо!
2. Ёпрст 1063 22.07.13 10:13 Сейчас в теме
что такое "модельных окон" ?
3. GROOVY 2505 22.07.13 13:30 Сейчас в теме
4. Ёпрст 1063 22.07.13 13:35 Сейчас в теме
(3) тогда исправляй везде, а не только в заголовке темы.
:)
5. WalterMort 241 24.07.13 09:01 Сейчас в теме
Вроде как диалоги открытия/закрытия файлов из браузера не требуют отключения блокировки всплывающих окон. Нафиг с ними то так заморочились?
6. пользователь 24.07.13 09:01
Принцип остался тот же, что и для управляемых форм.
Так получается?
7. Algiz 24.07.13 09:06 Сейчас в теме
8. GROOVY 2505 24.07.13 12:02 Сейчас в теме
Так это и есть управляемые формы.
9. sikuda 673 24.07.13 14:23 Сейчас в теме
- Как будем отображать картинку в форме? Нет, не декорацией с типом "картинка". А в виде реквизита формы с типом "строка"...
Суть этого реквизита - ссылка на ресурс внутри 1С. Если близко рассмотреть текст страницы это то что попадает в поле src тега <img>.

Как метод можно сделать поле ПолеHTML(Поле HTML документа) и
ПолеHTML = "<!DOCTYPE html><html><head></head><body><img src='"+СсылкаНаКартинку+"'/></body></html>";
10. GROOVY 2505 24.07.13 14:31 Сейчас в теме
(9) [Суть этого реквизита - ссылка на ресурс внутри 1С.] sikuda, так я вроде как и написал...
15. Den_D 54 29.07.13 10:54 Сейчас в теме
(10) Увидел публикацию, не посмотрел на автора и подумал, что кто-то с Вашего мастер-класса, оказался шустрее автора)))
53. 3762515 26.02.15 16:00 Сейчас в теме
У меня не получается, ошибка:
{Справочник.Лис_ТипыКонтейнеров.Форма.ФормаЭлемента.Форма(15)}: Ошибка при вызове конструктора (ОписаниеОповещения)
Оповещение = Новый ОписаниеОповещения("ОбработатьВыборФайла", Объект);
по причине:
Не найден экспортируемый метод: ОбработатьВыборФайла
55. GROOVY 2505 06.03.15 23:36 Сейчас в теме
(53) 3762515, Надо, просто на 8.3 кодить.
11. Evil Beaver 8107 24.07.13 14:58 Сейчас в теме
Не только картинки, а вообще любые ХранилищаЗначения, которые нужно наполнять из управляемой формы требуют такого подхода. Суть проблемы - ХранилищеЗначения недоступно в данных формы. Если установить ему значение на сервере, то оно умрет при возврате на клиента. Нужно всегда использовать ВременноеХранилище, как промежуточный буфер, а в ПередЗаписьюНаСервере уже наполнять ТекущийОбъект нужными данными из временного хранилища.
neo-ti; msergeev79; NN2P; CratosX; AllexSoft; Elvisnya; teflon; +7 Ответить
21. sikuda 673 01.08.13 09:11 Сейчас в теме
(11) Я думаю они это сделали специально. Они не предоставили API для работы с большим объемом данных, поэтому сделали это асинхронно, как загрузка картинок на html страницу. Это не проблема, это фича.

И есть повод понять что 1С внутри уже другое - Это же асинхронный код!!!
Оповещение = Новый ОписаниеОповещения("ОбработатьВыборФАйла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
22. Evil Beaver 8107 01.08.13 09:19 Сейчас в теме
(21) sikuda, Нету там асинхронного кода. А не сделали они это да, специально. Я не говорю, что это косяк. Просто нужно понимать упр. форму и знать такую особенность с хранилищем значения.

А про асинхронку - ОбработкаОповещения - это не совсем то. Она не асинхронна в прямом смысле. Параллельно ничего не выполняется. Callback оповещения стоит в очереди и вызывается, когда это будет можно, но синхронно с остальным кодом.
Внутри 1С может быть и другое (я не видел), но нам, смертным, асинхронного исполнения не видать еще долго. Имхо.
23. sikuda 673 01.08.13 10:00 Сейчас в теме
(22) Согласен в текущем состоянии все загоняется в буфер и выпоняется последовательно. Какой то частью мы управляем, а какая-то(хранилище значений) делается без нас.

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

Говорить, что в 1С нет паралельной работы я бы не стал:
ЭтаФорма.СкомпоноватьРезультат(РежимКомпоновкиРезультата.Фоновый);
24. Evil Beaver 8107 01.08.13 10:53 Сейчас в теме
(23) sikuda,
РежимКомпоновкиРезультата.Фоновый

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

Пока транзакция записи объекта не завершится, ваш код не может ничего сделать, где тут асинхрон? асинхрон по отношению к чему?
28. sikuda 673 07.08.13 09:29 Сейчас в теме
(24) Вернемся к асинхронному коду (11) Очень внимательно читаем справку:
"В тонком и толстом клиентах, в отличие от веб-клиента, метод блокирует исполнение кода языка. Тем не менее, по завершению помещения файла указанный обработчик оповещения также будет вызван, но до исполнения кода, размещенного после вызова метода."

И в код после НачатьПомещениеФайла вставим бесконечный цикл. В Тонком клиенте сначала выбор файла. Потом цикл.
А в web-клиенте наоборот сначала зависаем (браузер просит остановить цикл), потом выбор файла.
То есть в web-клиенте Оповещение работает как чистый callback javascript.
Именно это я пытаюсь вложить в фразу "код по сути своей асинхронный". И именно такое поведение стандартное для javascript на web страницах.
29. Evil Beaver 8107 07.08.13 10:47 Сейчас в теме
(28) sikuda, понял, мы говорим о совсем разных вещах, поэтому не понимаем друг-друга :)
12. OVladius 32 25.07.13 13:00 Сейчас в теме
Блин, я такой ложкой как на картинке в детстве борщи хлебал, ностальгия....
user5300; skel; aevdovin; hornet_X; CSiER; GATTUSO; talych; gorevg; alex.msk; AllexSoft; +10 Ответить
13. Evil Beaver 8107 25.07.13 17:05 Сейчас в теме
(12) OVladius, а я до сих пор! :)
14. AllexSoft 26.07.13 22:00 Сейчас в теме
(12) OVladius, я думал это намек на ложку дёгтя ... )
16. Den_D 54 29.07.13 10:55 Сейчас в теме
(12) OVladius, эта ложка которой 1С предлагает нам хлебануть г...на с "управляемыми" формами)))
Nuobu; bulpi; 3762515; +3 1 Ответить
17. ZLENKO 398 29.07.13 14:36 Сейчас в теме
Ложка весьма символично отражает тему статьи :-)
18. vano-ekt 123 30.07.13 13:17 Сейчас в теме
а в обычной уф разве не так? причем тут такси?
19. GROOVY 2505 30.07.13 13:26 Сейчас в теме
(18) vano-ekt,
1. Такси это и есть УФ.
2. В Такси отказались от модальных окон.
20. Evg-Lylyk 4559 31.07.13 08:58 Сейчас в теме
(0) Спасибо за публикацию, актуальная тема
Желательно выложить базу пример.
Нужна функция очистить картинку
25. GROOVY 2505 04.08.13 00:13 Сейчас в теме
(20) Evg-Lylyk, Зачем базу, тут 20 строк кода? Правда нужно?
26. Evg-Lylyk 4559 04.08.13 10:30 Сейчас в теме
(25) Думаю было бы полезно я вот хотел посмотреть как работает после Перечитать.
27. NickOmskiy2 48 04.08.13 12:35 Сейчас в теме
тоже в свое время брал пример из Профессиональной разработки" http://infostart.ru/public/185351/ с применением для БГУ, но можно и для прочего...
30. sa1m0nn 28 08.08.13 11:17 Сейчас в теме
Спасибо за статью.
Замечание: про размещение на форме строки с видом Картинка и навигационной ссылкой на данные картинки следовало бы описать в статье, что это методика изначально Управляемого приложения, т.е. с 8.2 так работает. А нового здесь - только немодальные "модальные" методы с описанием оповещения.
31. sikuda 673 13.08.13 09:56 Сейчас в теме
Удалил про html5 (Не будем смущать неокрепшие умы 1С-ников)
32. sikuda 673 23.12.13 16:58 Сейчас в теме
(0) ...(Убрал по просьбе автора)
33. GROOVY 2505 23.12.13 17:12 Сейчас в теме
(32) sikuda, на мой взгляд к моей статье это вообще только словом "картинка" привязать можно :)
34. Bukaska 140 23.12.13 17:26 Сейчас в теме
(33)
Как будем отображать картинку в форме? Нет, не декорацией с типом "картинка". А в виде реквизита формы с типом "строка". Да, да! Это очевидно, и странно, что мало кто об этом догадывается сам. ;)

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

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

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

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


Строка - это реквизит формы. Как Вы собрались реквизит формы с типом ХранилищеЗначения сделать?
36. clev 6 03.02.14 12:23 Сейчас в теме
Спасибо за прием работы с файлами!
Помогите разобраться с такой проблемой:

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

&НаСервере
Функция ПолучитьКартинку(ТекСтрока)
	Возврат ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Файлы.ДанныеКартинки", ТекСтрока-1);
КонецФункции

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


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




СсылкаНаКартинку в этот момент содержит текст:
"e1cib/data/БизнесПроцесс.СогласованиеДоговора.Файлы.ДанныеКартинки?ref=8711be1ed620b4fc11e38ca646b858c4&index=0"

В чем может быть проблема?
45. NikeeNik 74 15.01.15 16:19 Сейчас в теме
(36) clev,
Вот тоже с похожим случаем столкнулся при изменении режима совместимости конфы:
Есть два случая - получаю файл из реквизита ссылки:
	Адрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Данные");
	ПолучитьФайл(Адрес, Объект.ИмяФайла, Истина);

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

Меняю режим совместимости с 8.2.13 на "не использовать" (для плафтормы 8.3.5), и первый код так и остаётся рабочим, зато второй начинает падать:
"Неправильный путь к файлу 'e1c://server/SRV-1С:3541/TestGD/e1cib/data/Справочник.ВариантыДоговоров.ПечатныеФормы.Данные?ref=b5df0025900ab87711e233d403d247a3&index=0'"
помогает только если переписать с получения ссылки на помещение в хранилище, причем если не использовать метод Получить() (спасибо (37)), то полученный адрес тоже будет нерабочим. Отчего такая беда, непонятно (((
46. GROOVY 2505 15.01.15 20:38 Сейчас в теме
(45) Smallrat, ТекущаяСтрока элементов формы <> Индекс или номер строки данных. Нужно ссылаться именно на данные записанные в БД.
47. NikeeNik 74 16.01.15 10:20 Сейчас в теме
(46) Там в третьем параметре надо указать индекс строки. "Элементы.ПечатныеФормы.ТекущаяСтрока" у меня даёт 0 - вполне себе индекс. я и просто число указывал, всё равно не работает. Причём при включенном режиме совместимости ошибок нет.
48. GROOVY 2505 16.01.15 17:53 Сейчас в теме
(47) Smallrat, еще раз, ТекущаяСтрока это НЕ индекс. И есть ли данные на которые ссылается текущая строка в базе?
52. NikeeNik 74 21.01.15 10:56 Сейчас в теме
(48) Хорошо, действительно параметр ТекущаяСтрока некорректно использовать (хоть в моем случае это 0)
переписал так:

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

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

Всё равно валится с выключенным режимом совместимости, а с включенным 8.2 нет. Данные в базе есть - я могу их получить, поместить во временное хранилище и выгрузить на клиенте через адрес хранилища. Я покопал форумы - нигде решения нет, кроме как обходить.
37. clev 6 03.02.14 14:23 Сейчас в теме
Все, разобрался. Может, кому-то пригодится. Надо было сначала считать картинки объекта и поместить их во временное хранилище:

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	Для Каждого СтрФайлы Из Объект.Файлы Цикл
		Хранилище=ТекущийОбъект.Файлы[СтрФайлы.НомерСтроки-1].ДанныеКартинки.Получить();
		
		СтрФайлы.фСсылкаНаКартинку=ПоместитьВоВременноеХранилище(Хранилище, УникальныйИдентификатор);
	КонецЦикла	
КонецПроцедуры
Показать
NikeeNik; +1 Ответить
38. GROOVY 2505 03.02.14 16:30 Сейчас в теме
(37) clev, зачем картинку во временное хранилище пихать? Это же физическая запись на диск. Достаточно навигационную ссылку получить.
39. clev 6 05.02.14 03:30 Сейчас в теме
(38) не могу разобраться, почему код из (36) не работает. Не подскажете, что не так?
40. alexkon 94 05.02.14 16:35 Сейчас в теме
(39) clev, я процедуру ПриЧтенииНаСервере() заменил на ПриСозданииНаСервере(). На форме предварительно сделал реквизит типа "ТаблицаЗначений" с колонкой "АдресВременногоХранилища". В ПриСозданииНаСервере() получал данные картинок из ТЧ файлов и клал их во временное хранилище(только надо не забыть преобразовать реквизит формы в значение и после всего обратно в реквизит формы). Адреса временных хранилищ положил в созданный реквизит построчно. А в процедуре ПриАктивизацииСтроки() присваивал СсылкеНаКартинку адреса временных хранилищ(индексы совпадают), полученные из реквизита формы. А изначально платформу тоже вышибало.
41. clev 6 05.02.14 20:20 Сейчас в теме
(40) alexkon, Так в (37) я почти так и делаю.
Только не создаю новую ТЗ, а в табличной части формы добавил реквизит c типом "строка".
И при ПриЧтенииНаСервере() в этот реквизит записываю адрес во временном хранилище.
В этом варианте все работает. Но GROOVY в (38) говорит, что так не правильно.
56. vitaliy1911 38 20.03.15 19:53 Сейчас в теме
пишу
&НаКлиенте
Процедура КомандаОткрытьФайл(Команда)
	Адрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ДанныеФайла");
	ПолучитьФайл(Адрес);
КонецПроцедуры

ругается
{Справочник.sd_Файлы.Форма.ФормаЭлемента.Форма(37)}: Ошибка при вызове метода контекста (ПолучитьФайл)
ПолучитьФайл(Адрес, Объект.Наименование);
по причине:
Неправильный путь к файлу 'e1c://filev/C/bases/desktopSD/e1cib/data/Справочник.sd_Файлы.ДанныеФайла?ref=bdda4487fca76d4611e4cd932712cf62'

ДанныеФайла - хранилище значений с данными файла
что я делаю не так? (8.3.5.1460)

П.С. Разобрался. Пытался поместить данные через реквизитформывзначение, запись в реквизит, затем значениевреквизитформы. так не правильно, потому что после обратного перехода в реквизит формы данные теряются. не повторяйте моих ошибок
42. alf2006x 25 18.03.14 14:49 Сейчас в теме
С файлом вроде более-менее понятно, но я не могу найти способ немодального "таксишного" выбора каталога. Может кто подскажет как это сделать?
Мне надо чтобы пользователь выбрал каталог, а после выбора строку каталога записать в реквизит справочника.
43. alf2006x 25 19.03.14 11:50 Сейчас в теме
(42) alf2006x,
Процедура ПутьКДНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
	Если ДиалогВыбораФайла.Выбрать() Тогда      //обработка файла Диалог.Каталог;
		Объект.ПутьКД = ДиалогВыбораФайла.Каталог;
	КонецЕсли;
КонецПроцедуры

Вопрос снят.
44. 911service 121 24.10.14 10:45 Сейчас в теме
А как в данном способе применить фильтр на тип файла (Расширение)?
57. lamdth 11 02.09.15 16:26 Сейчас в теме
(44) 911service,
Фильтр по расширению:
	ДиалогОткрытияФайла							= Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогОткрытияФайла.Фильтр					= "Формат JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg|";
	ДиалогОткрытияФайла.МножественныйВыбор		= Ложь;
	ДиалогОткрытияФайла.ПредварительныйПросмотр	= Истина;
	ДиалогОткрытияФайла.Заголовок				= Нстр("ru='Выберите файл с фотографией'");
	
	ОповещениеОбработатьВыборФайла = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтотОбъект);
	НачатьПомещениеФайлов(ОповещениеОбработатьВыборФайла, , ДиалогОткрытияФайла, Истина, УникальныйИдентификатор);

Показать
LomayaZakat; +1 Ответить
49. aseiduldayev 18.01.15 11:26 Сейчас в теме
У меня такая же трабла. Кто может помоч ? При строке платформа проваливается

Объект.АдресКартинки=ПолучитьНавигационнуюСсылку(Объект.Ссылка,"ТЧПрикрепленныеФайлы.ПрикрепленныйФайл",0);
51. GROOVY 2505 18.01.15 14:05 Сейчас в теме
(49) aseiduldayev, Какая "такая же"?
Куда проваливается платформа?
50. aseiduldayev 18.01.15 11:27 Сейчас в теме
Тут так и не разобрались. Т
54. 3762515 26.02.15 16:04 Сейчас в теме
А ещё в процедуре "ВыбратьФайлКартинки" ругается на "ЭтотОбъект"
58. androgin 26.01.16 01:26 Сейчас в теме
И получать картинки нужно в ПриЧтенииНаСервере
59. DrSMERTb 06.07.16 10:50 Сейчас в теме
А как теперь можно ещё сделать функцию сохранения на диск картинки из базы?
60. Гость 09.08.16 14:09
Здравствуйте!
Сделала так, как у вас написано. Картинка добавляется, но при последующем открытии элемента пропадает. Подскажите, пожалуйста, в чем может быть проблема?
61. deutsch2008 02.10.17 12:01 Сейчас в теме
не получилось! вообще не чего. одни ошибки (((((
62. deutsch2008 04.10.17 13:55 Сейчас в теме
{Справочник.Товары.Форма.ФормаЭлемента.Форма(5,64)}: Переменная не определена (ЭтотОбъект)
Оповещание = Новый ОписаниеОповещения("ОбработатьВыборФайла", <<?>>ЭтотОбъект); (Проверка: Толстый клиент (обычное приложение))
63. Mars2006 17.07.18 14:17 Сейчас в теме
Всё работает без ошибок. только картинка не отображается.
Можете подсказать. всё написано как в посте, ничего своего.

&НаКлиенте
Процедура ВыбратьКартинку(Команда)
	Оповещение = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтотОбъект);
	
	НачатьПомещениеФайла (Оповещение, , , Истина, УникальныйИдентификатор);
		
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьВыборФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	
	Если НЕ Результат Тогда 
		Возврат ;
	КонецЕсли;
	
	СсылкаНаКартинку = Адрес;

КонецПроцедуры

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ,СтандартнаяОбработка)
	СсылкаНаКартинку=ПолучитьНавигационнуюСсылку(Объект.Ссылка,"ОсновноеИзображение");
КонецПроцедуры
Показать
69. user1363584 10.03.20 12:48 Сейчас в теме
(63)

Тоже такое было. Похоже баг в 1с. Т.к. чтобы заработало надо обработчики ПередЗаписьюНаСервере и ПриСозданииНаСервере создать с пом. лупы proс из интерфейса, а не просто скопипастить код модуля. Хотя после этих манипуляций код модуля будет одинаков.
70. pudovan 23.03.20 18:51 Сейчас в теме
(63) В последней процедуре:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ,СтандартнаяОбработка)
СсылкаНаКартинку=ПолучитьНавигационнуюСсылку(Объект.Ссылка,"ОсновноеИзображение");
КонецПроцедуры

Нужно указать наименование реквизита "ДанныеКартинки" вместо "ОсновноеИзображение". Тогда будет выводиться при открытии!
Вот правильный вариант:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ,СтандартнаяОбработка)
    СсылкаНаКартинку=ПолучитьНавигационнуюСсылку(Объект.Ссылка,"ДанныеКартинки");
КонецПроцедуры
64. ZloyProger 8 10.04.19 12:40 Сейчас в теме
Доброго времени суток,Коллеги.
Извиняюсь за некропостинг, но думаю новую тему не стоит ради такого пустяка заводить) Поясните ЧЯДНТ - есть самописка, с запрещенными модальными вызовами пишу а-ля:
&НаКлиенте
Процедура МояКоманда(СписокФайлов)
	МассивФайлов = Новый Массив;
	Для Каждого Файл Из СписокФайлов Цикл
		МассивФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(Файл.Значение.ПолноеИмя, Файл));
	КонецЦикла;
	НачатьПомещениеФайлов(Новый ОписаниеОповещения("ПослеПомещенияФайлов", ЭтаФорма), МассивФайлов, Ложь, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПослеПомещенияФайлов(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт
	ПрочитатьФайлыНаСервере(ПомещенныеФайлы);
КонецПроцедуры

&НаСервере
Процедура ПрочитатьФайлыНаСервере(ПомещенныеФайлы)
	//некоторые действия с файлами, выполняются на сервере, потому что необходим доступ к структуре метаданных конфигурации
Конец
Показать

СписокФайлов - соответственно список значений, где значения - файлы, представление - текстовой описание файла. Код отрабатывает, всё выполняется, но... выдает предупреждение, что использование синхронных методов запрещено... Кто и где синхронный-то?
65. vitaliy1911 38 10.04.19 14:21 Сейчас в теме
(64) вы уверены, что предупреждение именно на этот фрагмент кода? попробуйте выделить весь текст модуля и через контекстное меню "рефакторинг" выполнить замену всех синхронных методов, посмотрите что получится
66. ZloyProger 8 11.04.19 17:26 Сейчас в теме
(65) Спасибо коллега, действительно использовал НайтиФайлы, вместо НачатьПоискФайлов... Вот всё-таки неплохо бы в оповещение для таких "невнимательных" добавить что за метод))
И неистовые лучи добра разработчикам за асинхронную модель вызовов из-за которой 2 строчки простого, понятного, логичного вызова метода НайтиФайлы:
		МассивНайденныхФайлов = НайтиФайлы(ВыбКаталог, "Configuration.xml", Ложь);
		Для Каждого СтрокаРоли Из Объект.ТаблицаРолей.НайтиСтроки(Новый Структура("Отметка", Истина)) Цикл
			ИмяРоли					  = СтрокаРоли.Роль;
			МассивНайденныхФайловРоли = ?(МассивНайденныхФайлов.Количество() = 0, НайтиФайлы(ВыбКаталог, "Роль." + ИмяРоли + ".Права.xml", Ложь), НайтиФайлы(ВыбКаталог + "\Roles\" + ИмяРоли, "Rights.xml", Истина));
			Если МассивНайденныхФайловРоли.Количество() > 0 Тогда
				СписокФайлов.Добавить(МассивНайденныхФайловРоли[0], ИмяРоли);
				СписокПредставлений.Добавить(ИмяРоли, МассивНайденныхФайловРоли[0].ПолноеИмя);
			Иначе
				Сообщить("Не найдено описание роли " + ИмяРоли + ?(МассивНайденныхФайлов.Количество() = 0, "", " или подкаталог " + "\Roles\" + ИмяРоли));
			КонецЕсли;
		КонецЦикла;
		МассивФайлов = Новый Массив;
		Для Каждого Файл Из СписокФайлов Цикл
			//МассивФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(Файл.Значение.ПолноеИмя, Файл));
			МассивФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(Файл.Значение.ПолноеИмя,));
		КонецЦикла;
		СтруктПараметры = Новый Структура("СписокПредставлений", СписокПредставлений);
		НачатьПомещениеФайлов(Новый ОписаниеОповещения("ПослеПомещенияФайлов", ЭтаФорма, СтруктПараметры), МассивФайлов, Ложь, УникальныйИдентификатор);

Показать

превращаются в непойми что.. Мб сталкивался кто и менее ректально решил следующую задачу: есть некое табличное поле с отметками, необходимо в цикле обойти все помеченные строки и по имени реквизита в строке поискать файлы в определённом каталоге, если файлы найдены - добавить их в список значений, для дальнейшей передачи.. Суть проблемы в том, что используя асинхронные методы я не могу прервать выполнение кода, т.е. кусок
&НаКлиенте
Перем СписокФайлов;

&НаКлиенте
Процедура ПослеПоискаФайлов(НайденныеФайлы, ДополнительныеПараметры) Экспорт
	ИмяРоли = ДополнительныеПараметры.Имя;
	Если НайденныеФайлы.Количество() = 0 Тогда
		Сообщить("Не найдено описание роли " + ИмяРоли);
	Иначе
		СписокФайлов.Добавить(НайденныеФайлы[0], ИмяФайла);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Поиск()
	Для Каждого СтрокаРоли Из Объект.ТаблицаРолей.НайтиСтроки(Новый Структура("Отметка", Истина)) Цикл
		ИмяРоли = СтрокаРоли.Роль;
		Структ     = Новый Структура("Имя", ИмяРоли);
		НачатьПоискФайлов(Новый ОписаниеОповещения("ПослеПоискаФайлов", ЭтаФорма
	КонецЦикла
КонецПроцедуры
Показать

почти отрабатывает, т.к. файлы ищет правильные, но вот со значением параметров просто беда, т.к. начинается поиск только после выхода из процедуры и в структуре остается только последняя строка из выбранных (т.е. например в табличном поле 2 отмеченных строки с именами например "Администратор" и "ПолныеПрава" идешь в отладку и оба вызова ПослеПоискаФайлов показывают что ДополнительныеПараметры.Имя = "ПолныеПрава").. В результате приходится из имени файла выдергивать, а это примерно то же самое что дергать зубы, через задний проход... Не помогает ни рекурсия с Знач, чтобы не менялся фактический параметр, ни подключение обработчика ожидания.. Буду весьма благодарен за идею как в текущих реалиях подойти к данной задаче :-)
ЗЫ. Возможно про лучи добра и погорячился, просто эмоции ... переполняют после дня ломания мозга в попытках понять, как эту траблу обойти :-) Всем бобра))
67. mentozavr 68 30.04.19 10:47 Сейчас в теме
Спасибо за мануал. помог. Пытаюсь отобразить загруженный пдф док на форме в web-клиенте.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	АдресМ = ПолучитьНавигационнуюСсылку(Объект.Ссылка,"ДанныеРезюме");
	//сообщить (АдресМ);
	#Если ВебКлиент Тогда
       Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
        УстановитьРасширениеРаботыСФайлами();
        ПодключитьРасширениеРаботыСФайлами();
       КонецЕсли;
    #КонецЕсли
	Реквизит1 = "<html><EMBED id='PDF' width=100% height=100% type=""application/pdf"" src="""+АдресМ+"""></EMBED></html>";
	//Реквизит1 = АдресМ;
КонецПроцедуры
Показать

Поле появляется и пишет, что невозможно отобразить pdf документ. на толстом клиенте все работает изумительно
68. xander76 02.03.20 11:56 Сейчас в теме
А как тоже самое сделать что бы загружался любой файл, а при открытии вызывалось приложение которое его обслуживает?
71. pudovan 23.03.20 19:45 Сейчас в теме
Оказывается НачатьПомещениеФайла (BeginPutFile), Не рекомендуется использовать, начиная с версии 8.3.15.
Рекомендуется использовать: НачатьПомещениеФайлаНаСервер (BeginPutFileToServer)
Поэтому код меняем слеюющим образом:
 &НаКлиенте
Процедура ВыбратьФайлКартинки(Команда)
	//Создаем оповещение,   именно  процедура  "ОбработатьВыборФайла"  будет вызвана при закрытии окна выбора файла
	 Оповещение  =  Новый ОписаниеОповещения("ОбработатьВыборФайла",   ЭтотОбъект);
	//Открываем интерактивно  окно для выбора файла на платформе не ниже 8.3.15!
	НачатьПомещениеФайлаНаСервер(Оповещение,  ,  ,  ,  ,УникальныйИдентификатор);
КонецПроцедуры   

&НаКлиенте
Процедура ОбработатьВыборФайла(Результат, Адрес) Экспорт
	Если Результат=Неопределено Тогда
		Возврат; 
	КонецЕсли;
	СсылкаНаКартинку = Результат.Адрес;
КонецПроцедуры   

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ДанныеКартинки"); 
КонецПроцедуры
Показать
72. user630241_inf 03.06.22 20:02 Сейчас в теме
Добрый вечер! Все сделала как написано в последнем варианте. Все-равно не отображает картинку при повторном открытии записи справочника. Версия 8.3.20.
73. user875116 25.11.22 15:28 Сейчас в теме
А как просто открыть картинку с диска в форму?
74. user1887458 17.01.23 07:54 Сейчас в теме
Загрузка картинки:
Реквизиты справочника:
Картинка (Хранилище значения)
КартинкаЕсть (Булево)

Код:

&НаКлиенте
Процедура ПутьКФотографииНачалоВыбораНаСервере()
ДД = новый ДвоичныеДанные(ПутьККартинке);
ЗанестиФотографииНаСервер(ДД);
ОбновитьФотографию();
КонецПроцедуры

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

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

Процедура ОбновитьФотографию()
Картинка = ПоместитьВоВременноеХранилище(Объект.Ссылка.Картинка.Получить(),УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
ОбновитьФотографию();
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
Если Не Объект.КартинкаЕсть Тогда
ПриЗакрытииНаСервере();
КонецЕсли;
КонецПроцедуры

Процедура ПриЗакрытииНаСервере()
Об = РеквизитФормыВЗначение("Объект");
Хранилище = новый ХранилищеЗначения(Неопределено);
Об.Картинка = Хранилище;
Об.Записать();
ЗначениеВРеквизитФормы(Об, "Объект");
КонецПроцедуры

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Если КартинкаЕсть Тогда
Объект.КартинкаЕсть = Истина;
КонецЕсли;
КонецПроцедуры

Загрузка Excel:

&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.МножественныйВыбор = Ложь;
Диалог.Заголовок = "Выберите файл для загрузки";
Диалог.Фильтр = "Табличный документ Excel 2003(*.xls)|*.xls|Табличный документ Excel(*.xlsx)|*.xlsx";
Если Диалог.Выбрать() Тогда
ПутьКФайлу = Диалог.ПолноеИмяФайла;
КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Загрузить(Команда)
Если Не ЗначениеЗаполнено(ПутьКФайлу) Тогда
Сообщить("Файл не выбран");
Иначе
ЗагрузитьНаСервере();
Элементы.Список.Обновить();
КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьНаСервере()

//подключаемся к эксел
Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open(ПутьКФайлу);
Исключение
Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;

Попытка
//Открываем необходимый лист
Excel.Sheets(1).Select(); // лист 1, по умолчанию
Исключение
//Закрываем Excel
Excel.ActiveWorkbook.Close();
Excel = 0;
Сообщить("Файл "+Строка(ПутьКФайлу)+" не соответствует необходимому формату! Первый лист не найден!");
Возврат;
КонецПопытки;

НомерСтроки = 2;
Создано = 0;
Пока СокрЛП(Excel.Cells(НомерСтроки,1).Text)<>"" Цикл
Код = Excel.Cells(НомерСтроки,1).Text;
Спр = Справочники.Персонал.НайтиПоКоду(Код);
//Проверка на существование элемента с таким кодом
Если Не ЗначениеЗаполнено(Спр) Тогда
НовыйСпр = Справочники.Персонал.СоздатьЭлемент();

НовыйСпр.Наименование = Excel.Cells(НомерСтроки,1).Text;
НовыйСпр.Паспорт = Excel.Cells(НомерСтроки,2).Text;
НовыйСпр.ДатаРождения = Excel.Cells(НомерСтроки,3).Value;
НовыйСпр.НомерТелефона = Excel.Cells(НомерСтроки,4).Text;
Если Excel.Cells(НомерСтроки,5).Text = "М" Тогда
НовыйСпр.Пол = Перечисления.Пол.М
ИначеЕсли Excel.Cells(НомерСтроки,5).Text = "Ж" Тогда
НовыйСпр.Пол = Перечисления.Пол.Ж
КонецЕсли;
Если Excel.Cells(НомерСтроки,6).Text = "Мастер" Тогда
НовыйСпр.Должность = Справочники.Должности.НайтиПоНаименованию("Мастер")
КонецЕсли;
Попытка
НовыйСпр.Записать();
Создано = Создано+1;
Исключение
Сообщить("Ошибка при записи
элемента с кодом "+код);
КонецПопытки;
Иначе
Сообщить("Элемент с кодом "+Код+" уже существует");
КонецЕсли;
НомерСтроки = НомерСтроки+1;
КонецЦикла;

Сообщить("Создано "+Создано+" эл.");
//Закрываем Excel
Excel.ActiveWorkBook.Close();

КонецПроцедуры
Прикрепленные файлы:
hZetGsy3K3A.jpg
76. user1889409 11.04.23 11:15 Сейчас в теме
Загрузка Excel:


&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	Режим = РежимДиалогаВыбораФайла.Открытие;
	ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
	ДиалогОткрытияФайла.ПолноеИмяФайла = "";
	Фильтр = НСтр("ru = 'Файл XLSX'; en = 'XLSX file'") + "(*.xlsx)|*.xlsx";
	ДиалогОткрытияФайла.Фильтр = Фильтр; 
	ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
	ДиалогОткрытияФайла.Заголовок = "Выберите файл";
	ДиалогОткрытияФайла.Показать(Новый ОписаниеОповещения("ПутьКФайлу", ЭтотОбъект, Новый Структура("ДиалогОткрытияФайла",ДиалогОткрытияФайла)));
КонецПроцедуры

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


&НаКлиенте
Процедура Загрузить(Команда)
	Если Объект.ПутьКФайлу = "" Тогда
		Сообщ = Новый СообщениеПользователю;
		Сообщ.Текст = "Выберите файл!";
		Сообщ.Сообщить();
	Иначе
		Эксель = Новый COMОбъект("Excel.Application");
		КнигаЭксель = Эксель.Workbooks.Open(Объект.ПутьКФайлу);
		Лист1 = Книгаэксель.WorkSheets(1);
		п = 2;
		Пока п < 13 Цикл
			СтруктураДанных = Новый Структура;
			СтруктураДанных.Вставить("Артикул", СокрЛП(Лист1.Cells(п,1).value));      
			СтруктураДанных.Вставить("Наименование",СокрЛП(Лист1.Cells(п,2).value));
            СтруктураДанных.Вставить("Количество",СокрЛП(Лист1.Cells(п,3).value)); 
			СтруктураДанных.Вставить("ЕдиницаИзмерения",СокрЛП(Лист1.Cells(п,4).value));
			СтруктураДанных.Вставить("Тип",СокрЛП(Лист1.Cells(п,5).value));
			СтруктураДанных.Вставить("Цена",СокрЛП(Лист1.Cells(п,6).value));
			СтруктураДанных.Вставить("ГОСТ",СокрЛП(Лист1.Cells(п,7).value)); 
			СтруктураДанных.Вставить("ДатаГОСТ",СокрЛП(Лист1.Cells(п,8).value));

			
            ЗагрузкаНаСервере(СтруктураДанных);
			п = п+1;
		КонецЦикла;
		Сообщ = Новый СообщениеПользователю;
		Сообщ.Текст = "Данные были успешно загружены!"; 
		Сообщ.Сообщить();
		Эксель.Application.Quit();
	КонецЕсли;	
КонецПроцедуры


&НаСервере
Процедура ЗагрузкаНаСервере(СтруктураДанных)

	Если Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(СтруктураДанных.ЕдиницаИзмерения) = Справочники.ЕдиницыИзмерения.ПустаяСсылка() Тогда
		ДобЕдиницы = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
		ДобЕдиницы.Наименование = СтруктураДанных.ЕдиницаИзмерения;   
		ДобЕдиницы.Записать();
	КонецЕсли;  
	
	Если Справочники.ТипыДеталей.НайтиПоНаименованию(СтруктураДанных.Тип) = Справочники.ТипыДеталей.ПустаяСсылка() Тогда
		ДобТипаД = Справочники.ТипыДеталей.СоздатьЭлемент();
		ДобТипаД.Наименование = СтруктураДанных.Тип;
		ДобТипаД.Записать();
	КонецЕсли;
	
	Если Справочники.ГОСТы.НайтиПоНаименованию(СтруктураДанных.ГОСТ) = Справочники.ГОСТы.ПустаяСсылка() Тогда
		ДобГост = Справочники.ГОСТы.СоздатьЭлемент();
		ДобГост.Наименование = СтруктураДанных.ГОСТ;  
		ДобГост.ДатаГОСТ = СтруктураДанных.ДатаГОСТ;
		ДобГост.Записать();
	КонецЕсли; 
	//
	//Если Справочники.ГОСТы.НайтиПоНаименованию(СтруктураДанных.ДатаГОСТ) = Справочники.ГОСТы.ПустаяСсылка() Тогда
	//	ДобДатыГ = Справочники.ГОСТы.СоздатьЭлемент();
	//	ДобДатыГ.ДатаГост = СтруктураДанных.ДатаГОСТ;
	//	ДобДатыГ.Записать();
	//КонецЕсли;
	
	
	Если Справочники.Детали.НайтиПоНаименованию(СтруктураДанных.Наименование) = Справочники.Детали.ПустаяСсылка() Тогда
		ДобДетали = Справочники.Детали.СоздатьЭлемент();  
		ДобДетали.Код = СтруктураДанных.Артикул;
		ДобДетали.Наименование = СтруктураДанных.Наименование; 
		ДобДетали.Количество = СтруктураДанных.Количество;
		ДобДетали.ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(СтруктураДанных.ЕдиницаИзмерения);
		ДобДетали.Тип = Справочники.ТипыДеталей.НайтиПоНаименованию(СтруктураДанных.Тип);
		ДобДетали.Цена = СтруктураДанных.Цена;
		ДобДетали.ГОСТ = Справочники.ГОСТы.НайтиПоНаименованию(СтруктураДанных.ГОСТ); 
		ДобДетали.ДатаГОСТ = Справочники.ГОСТы.НайтиПоНаименованию(СтруктураДанных.ДатаГОСТ); 	
		ДобДетали.Записать();
	КонецЕсли; 
КонецПроцедуры // ЗагрузкаНаСервере()
Показать
77. fedor_p 13.09.23 10:35 Сейчас в теме
Очень хороший пример. Неплохо бы было на основе него сделать пример вывода содержимого реквизита "ТаблицаЗначений" в печатную форму. Может понадобиться при печати штрих кодов и QRкодов.
78. пользователь 27.02.24 09:07
Сообщение было скрыто модератором.
...
79. пользователь 27.02.24 09:08
Сообщение было скрыто модератором.
...
Оставьте свое сообщение