Создание справочника для добавления нескольких файлов и просмотр этих файлов

15.12.23

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

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

1. Создание справочника

- создайте справочник и дайте ему наименование (в данном примере наименование "Изделие")

- перейдите во вкладку данные и создайте табличную часть (Документация)

- в табличной части добавьте 3 реквизита:

  • Файл (Тип - хранилище значений)
  • ИмяФайла (Тип - строка, поставьте галочку неограиченая длина)
  • Расширение (Тип - строка, длинна - 5)

 

 

2. Создание формы справочника   

- перейдите на вкладку формы справочника

- нажмите на плюсик и создайте Форму элемента

- нажмите на кнопку ОК и перейдите на вашу форму

 

3. Создание реквизитов формы 

- создайте дополнительные реквизиты (они нам пригодятся в последующем хранении данных)

- создаем 3 реквизита, чтобы различать их в коде, назовём их немного по-другому:

  • ИмяФайлаДиалог (Тип - строка (по умолчанию))
  • ПутьКФайлу (Тип - строка (по умолчанию))   
  • РасширениеФайлаДиалог (Тип - строка (по умолчанию))        

                                              

 

4. Создание команд формы справочника

- создадим две команды (для этого перейдём на вкладку "команды", в правой части формы): ЗагрузитьФайл и ОткрытьФайл

 

 

- нажмём на команду ЗагрузитьФайл и перейдём на вкладку Свойства, там выбираем Кнопку "Действие" и выбираем "Создать на клиенте и на сервере"

- нам откроется модуль нашего справочника, в полученные процедуры вписываем этот код:

 

&НаСервере

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

                ДокументОбъект=РеквизитФормыВЗначение("Объект");

                ДанныеФайла=Новый ДвоичныеДанные(ПутьКФайлу);

                КоличСтрок=ДокументОбъект.Документация.Количество();

                ДокументОбъект.Документация.Добавить();

                ДокументОбъект.Документация[КоличСтрок].Файл=Новый ХранилищеЗначения(ДанныеФайла, Новый СжатиеДанных(9));  

                ДокументОбъект.Документация[КоличСтрок].ИмяФайла=ИмяФайлаДиалог;

                ДокументОбъект.Документация[КоличСтрок].Расширение=РасширениеФайлаДиалог;

                ДокументОбъект.Записать();

                ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");

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



&НаКлиенте

Процедура ЗагрузитьФайл(Команда)

                Диалог=Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);          

                Диалог.МножественныйВыбор=Ложь;

                Если Диалог.Выбрать() Тогда

                ПутьКФайлу=Диалог.ПолноеИмяФайла;    

                ПозицияПоследнейТочки=СтрНайти(ПутьКФайлу,".",НаправлениеПоиска.СКонца,,1);

                ПозицияПоследнегоСлеша=СтрНайти(ПутьКФайлу,"\",НаправлениеПоиска.СКонца,,1);

                РасширениеФайлаДиалог=Прав(ПутьКФайлу, СтрДлина(ПутьКФайлу)-ПозицияПоследнейТочки);

                ИмяФайлаДиалог=Сред(ПутьКФайлу,ПозицияПоследнегоСлеша+1,ПозицияПоследнейТочки-ПозицияПоследнегоСлеша-1);

                КонецЕсли; 



 Если НЕ ПутьКФайлу="" Тогда

   ЗагрузитьФайлНаСервере();

   Элементы.ДокументацияОткрытьФайл.Доступность=Истина;

  Иначе

      Сообщить("Файл не выбран!!!");

  КонецЕсли;

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

- перейдем на саму форму нажмём на команду ОткрытьФайл перейдём на вкладку Свойства, там выбираем Кнопку "Действие" и выбираем "Создать на клиенте и на сервере" 

- нам откроется модуль нашего справочника, в полученные процедуры вписываем этот код:

&НаСервере

Процедура ОткрытьФайлНаСервере(НомерСтроки)

                ДокументОбъект=РеквизитФормыВЗначение("Объект");

                Путь=ПолучитьИмяВременногоФайла(ДокументОбъект.Документация[НомерСтроки-1].Расширение);

                Данные=ДокументОбъект.Документация[НомерСтроки-1].Файл.Получить();

                Данные.Записать(Путь);

                ЗапуститьПриложение(Путь);

                ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");

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



&НаКлиенте

Процедура ОткрытьФайл(Команда)

                НомерТекущейСтроки=Элементы.Документация.ТекущиеДанные.НомерСтроки;

                ОткрытьФайлНаСервере(НомерТекущейСтроки);

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

 

- после создания наших кнопок, переходим на вкладку "форма", нажимаем по ней и выбираем действие ПриОткрытии "Создать на клиенте"

- нас снова переносит в модуль формы, заполняем данный код (Он нужен для блокировки Кнопки "ОткрытьФайл", если сам файл ранее не был добавлен, иначе она доступна) 

 

&НаКлиенте

Процедура ПриОткрытии(Отказ)

                Если Объект.Документация.Количество()>0 Тогда

   Элементы.ДокументацияОткрытьФайл.Доступность=Истина;                        

                  Иначе

                      Элементы.ДокументацияОткрытьФайл.Доступность=Ложь;             

                КонецЕсли;

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

 

- в заключении данной формы перенесём наши команды в командную панель нашей табличной части

 

 

В заключении, чтобы наш код функционировал и не выдавал ошибок, зайдите на вкладку Конфигурация


 

 

- нажмём на неё правой кнопкой мыши и перейдём в Свойства

- дальше пролистайте в самый низ свойств и найдите Совместимость

- Режим использования модальности и Режим использования синхронных вызовов расширений платформы и внешних компонент (по умолчанию стоит "Не использовать", исправляем и ставим "Использовать")

 

 

Давайте дополним этот справочник показом картинки.

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

 

 

Для этого нужно создать ФормуЭлемента с этими данными

 

 

На форме не показано, но нужно также создать Реквизит (он будет не виден пользователю, мы будем на него ссылаться):

 

 

Также создаем Реквизит Фото и переносим в левую часть формы

 

 

Создаем команду ДобавитьКартинку, нажимаем на лупу и переходим в модуль справочника

Прописываем данный код

&НаКлиенте
Процедура ДобавитьКартинку(Команда)
    ИмяФайла = "";
    ПутьФайла = "";
    Если ПоместитьФайл(ПутьФайла, , ИмяФайла, Истина) = Истина Тогда
        Фото = ПутьФайла;
        УстановитьКартинку();
    КонецЕсли;
КонецПроцедуры

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

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

 

См. также

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

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

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

2400 руб.

29.06.2020    17189    23    4    

37

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

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

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

27.12.2023    11674    776    elcoan    47    

108

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

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

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

2 стартмани

10.04.2023    10207    157    acces969    31    

120

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

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

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

1 стартмани

05.07.2022    4207    kalyaka    4    

31

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

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

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

6000 руб.

18.01.2022    9109    1    2    

6

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

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

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

25.11.2021    10011    AtamanovYS    19    

141
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Xershi 1493 16.12.23 02:03 Сейчас в теме
Серьезно на уф модальность и синхронность?
Это для стажёров статью писали? Которые не умеют и не понимают что и как пишется?
Вредные советы, хранить тяжёлые данные в базе, чтобы потом бекап хранил эту ветошь?
Работа с файлами посмотрите как нужно писать код.
Или статью перепишите, на то чтобы понимали какая целевая аудитория и почему так делать как у вас не стоит.
PowerBoy; asg.aleks; +2 Ответить
4. bayselonarrend 1416 17.12.23 01:24 Сейчас в теме
(1)
Это для стажёров статью писали?


Да ладно, по-моему тут довольно быстро становится понятно, что это и как так вышло)))

ДокументОбъект.Документация.Добавить();
ДокументОбъект.Документация[КоличСтрок].Файл=Новый ХранилищеЗначения(ДанныеФайла, Новый СжатиеДанных(9)); 
 
2. aleksey2 87 16.12.23 09:06 Сейчас в теме
вроде бы вместо Диалог.Выбрать() должно быть Диалог.Показать()
3. bayselonarrend 1416 17.12.23 01:17 Сейчас в теме
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
	
    Диалог                = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ОповещениеЗавершения  = Новый ОписаниеОповещения("ВыборФайлаЗавершение", ЭтотОбъект);
    Диалог.Показать(ОповещениеЗавершения);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыборФайлаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	
	Если ВыбранныеФайлы <> Неопределено Тогда
		
		ВыбранныйФайл         = ВыбранныеФайлы[0];
        ВыбранныйФайлДвоичные = Новый ДвоичныеДанные(ВыбранныйФайл);
		ДокументОбъект        = РеквизитФормыВЗначение("Объект");

        НоваяСтрока      = ДокументОбъект.Документация.Добавить();
        НоваяСтрока.Файл = Новый ХранилищеЗначения(ВыбранныйФайлДвоичные);

        ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
		
	КонецЕсли;
	
КонецПроцедуры

Показать


https://its.1c.ru/docs/v8nonmodal/
Прикрепленные файлы:
sermalp; Xershi; +2 Ответить
6. ixijixi 1812 18.12.23 10:48 Сейчас в теме
(3)
ЗначениеВРеквизитФормы

Доступность:
Сервер, мобильное приложение (сервер), мобильный автономный сервер.
0x00; bayselonarrend; +2 Ответить
7. bayselonarrend 1416 18.12.23 10:49 Сейчас в теме
(6)Да, ошибся, писал на память. Надо еще через серверную процедуру прокинуть полученное значение
5. SUSI 18.12.23 09:07 Сейчас в теме
Добрый день!
Можно ли добавить еще и команду (и как это сделать) для сохранения прикрепленного в ТЧ файла на диск ?
Файлы, например, типа обработки или печатные формы 1С.
8. пользователь 27.03.24 12:54
Сообщение было скрыто модератором.
...
9. пользователь 27.03.24 12:57
Сообщение было скрыто модератором.
...
10. пользователь 27.03.24 12:58
Сообщение было скрыто модератором.
...
11. user1773945 07.05.24 13:01 Сейчас в теме
В клиент-серверном варианте работы файл пытается открыться от имени пользователь USR1CV8 и ни чего не происходит, так как у пользователя нет прав. Как перенести процедуру открытия файла на клиент?
Оставьте свое сообщение