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

22.07.13

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

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

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

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

 

 

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

 

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

 

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

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

 

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

 

 

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

 

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

 

 

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

 

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

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

 

 

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

 

 

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

 

 

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

 

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


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

 

 

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

 

Вуаля!

 

 

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

 

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

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

 

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

См. также

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

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

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

2400 руб.

29.06.2020    17102    23    4    

37

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

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

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

27.12.2023    11570    771    elcoan    46    

107

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

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

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

2 стартмани

10.04.2023    10127    156    acces969    31    

119

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

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

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

1 стартмани

05.07.2022    4133    kalyaka    4    

31

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

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

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

6000 руб.

18.01.2022    9070    1    2    

6

Программный интерфейс для доработки форм

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

Реализовал простой способ программного создания новых элементов, команд и реквизитов на форме.

25.11.2021    9902    AtamanovYS    19    

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

Как метод можно сделать поле ПолеHTML(Поле HTML документа) и
ПолеHTML = "<!DOCTYPE html><html><head></head><body><img src='"+СсылкаНаКартинку+"'/></body></html>";
10. GROOVY 2507 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 2507 06.03.15 23:36 Сейчас в теме
(53) 3762515, Надо, просто на 8.3 кодить.
11. Evil Beaver 8137 24.07.13 14:58 Сейчас в теме
Не только картинки, а вообще любые ХранилищаЗначения, которые нужно наполнять из управляемой формы требуют такого подхода. Суть проблемы - ХранилищеЗначения недоступно в данных формы. Если установить ему значение на сервере, то оно умрет при возврате на клиента. Нужно всегда использовать ВременноеХранилище, как промежуточный буфер, а в ПередЗаписьюНаСервере уже наполнять ТекущийОбъект нужными данными из временного хранилища.
neo-ti; msergeev79; NN2P; CratosX; AllexSoft; Elvisnya; teflon; +7 Ответить
21. sikuda 676 01.08.13 09:11 Сейчас в теме
(11) Я думаю они это сделали специально. Они не предоставили API для работы с большим объемом данных, поэтому сделали это асинхронно, как загрузка картинок на html страницу. Это не проблема, это фича.

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

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

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

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

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

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

И в код после НачатьПомещениеФайла вставим бесконечный цикл. В Тонком клиенте сначала выбор файла. Потом цикл.
А в web-клиенте наоборот сначала зависаем (браузер просит остановить цикл), потом выбор файла.
То есть в web-клиенте Оповещение работает как чистый callback javascript.
Именно это я пытаюсь вложить в фразу "код по сути своей асинхронный". И именно такое поведение стандартное для javascript на web страницах.
29. Evil Beaver 8137 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 8137 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 124 30.07.13 13:17 Сейчас в теме
а в обычной уф разве не так? причем тут такси?
19. GROOVY 2507 30.07.13 13:26 Сейчас в теме
(18) vano-ekt,
1. Такси это и есть УФ.
2. В Такси отказались от модальных окон.
20. Evg-Lylyk 4658 31.07.13 08:58 Сейчас в теме
(0) Спасибо за публикацию, актуальная тема
Желательно выложить базу пример.
Нужна функция очистить картинку
25. GROOVY 2507 04.08.13 00:13 Сейчас в теме
(20) Evg-Lylyk, Зачем базу, тут 20 строк кода? Правда нужно?
26. Evg-Lylyk 4658 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 676 13.08.13 09:56 Сейчас в теме
Удалил про html5 (Не будем смущать неокрепшие умы 1С-ников)
32. sikuda 676 23.12.13 16:58 Сейчас в теме
(0) ...(Убрал по просьбе автора)
33. GROOVY 2507 23.12.13 17:12 Сейчас в теме
(32) sikuda, на мой взгляд к моей статье это вообще только словом "картинка" привязать можно :)
34. Bukaska 140 23.12.13 17:26 Сейчас в теме
(33)
Как будем отображать картинку в форме? Нет, не декорацией с типом "картинка". А в виде реквизита формы с типом "строка". Да, да! Это очевидно, и странно, что мало кто об этом догадывается сам. ;)

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

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

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

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


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

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

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

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


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




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

В чем может быть проблема?
45. NikeeNik 78 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 2507 15.01.15 20:38 Сейчас в теме
(45) Smallrat, ТекущаяСтрока элементов формы <> Индекс или номер строки данных. Нужно ссылаться именно на данные записанные в БД.
47. NikeeNik 78 16.01.15 10:20 Сейчас в теме
(46) Там в третьем параметре надо указать индекс строки. "Элементы.ПечатныеФормы.ТекущаяСтрока" у меня даёт 0 - вполне себе индекс. я и просто число указывал, всё равно не работает. Причём при включенном режиме совместимости ошибок нет.
48. GROOVY 2507 16.01.15 17:53 Сейчас в теме
(47) Smallrat, еще раз, ТекущаяСтрока это НЕ индекс. И есть ли данные на которые ссылается текущая строка в базе?
52. NikeeNik 78 21.01.15 10:56 Сейчас в теме
(48) Хорошо, действительно параметр ТекущаяСтрока некорректно использовать (хоть в моем случае это 0)
переписал так:

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

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

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

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