Присоединение файлов в расширении.

1. Intercititude 05.06.19 21:26 Сейчас в теме
Всем доброе время суток! Предупрежу, что я новичок,поэтому не обессудьте.

Пытаюсь реализовать присоединение файлов в ЗУП(проф) в расширении. Но столкнулся с проблемой следующего характера(см. рисунок 1)

Получилось её решить добавлением в общий модуль этого:

&После("ПриОпределенииСправочниковХраненияФайлов")
Процедура расш_ПриОпределенииСправочниковХраненияФайлов(ТипВладелецФайла, ИменаСправочников)
	
	  Если ТипВладелецФайла = Тип("СправочникСсылка.расш_Кандидаты") Тогда 
        ИменаСправочников.Вставить("Файлы", Истина);
	КонецЕсли;
	     
КонецПроцедуры
Показать


Но! Теперь после выбора какого либо файла сталкиваюсь с проблемой( рисунок 2) !
Подскажите что где дописать, чтобы обойти эту ошибку ? Облазил отладчиком уже все модули и не могу сообразить.

Заранее спасибо!
Прикрепленные файлы:
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Teut_Vlad 187 05.06.19 22:49 Сейчас в теме
а справочник расш_Кандидаты имеет подчиненный справочник для хранения файлов?
6. Intercititude 06.06.19 20:19 Сейчас в теме
(2)Имеете ввиду сделать справочник и назначить его владельцем ?
9. Intercititude 06.06.19 23:24 Сейчас в теме
(6)Всё равно ошибка та же...
3. MikeI 73 06.06.19 00:50 Сейчас в теме
Проблема в том, что определяемый тип 'владелец файлов' не содержит Ваш справочник. И в расширении его тоже изменить не получается. Покрайней мере на платформе 8.3.13.1809. Может на платформе выше получиться
Nefrit88; makcon4ick; user1080864; acanta; +4 Ответить
7. Intercititude 06.06.19 20:20 Сейчас в теме
(3)Стоит последняя платформа вроде ( 8.3.14.1630 ) и использовать Определяемые типы к сожалению там нельзя, как и изменять существующие!
4. MikeI 73 06.06.19 00:51 Сейчас в теме +0.25 $m
Как вариант, сделать справочник 'расш_КандидатПрикрепленныеФайлы.'
Intercititude; Teut_Vlad; +2 Ответить
8. Intercititude 06.06.19 20:21 Сейчас в теме
(4)Пытался так сделать , ошибка та же.
10. MikeI 73 06.06.19 23:50 Сейчас в теме
(8)Дык свое изменение уберите. Что бы справочник Канидаты пытался обратиться к вашему вновь созданному
11. Intercititude 07.06.19 00:15 Сейчас в теме
(10) Разумеется я убрал. Ошибка с рисунка 1 вылазит. Я так полагаю когда доходит до этого общ.модуль РаботаСФайламиСлужебный - функция ИменаСправочниковХраненияФайлов:

	
	Если Метаданные.Справочники.Найти(ИмяСтандартногоОсновногоСправочника) <> Неопределено Тогда
		ИменаСправочников.Вставить(ИмяСтандартногоОсновногоСправочника, Истина);
ИначеЕсли Метаданные.ОпределяемыеТипы.ВладелецФайлов.Тип.СодержитТип(ТипВладельцаФайлов) Тогда
		ИменаСправочников.Вставить("Файлы", Истина);
	КонецЕсли;


Вот из-за этого и есть эта ошибка. Он почему то ненаходит в метаданных "КандидатыПрисоединённыеФайлы" и просто пропускает этот блок.Как это обойти ?

В итоге почему то ИменаСправочников.Количество() = 0 и вылазит это исключение.
12. MikeI 73 07.06.19 00:18 Сейчас в теме
(11)а проверьте, какое имя справочника ожидается
13. Intercititude 07.06.19 00:20 Сейчас в теме
(12) Можно поподробнее, где посмотреть ?
14. Intercititude 07.06.19 00:57 Сейчас в теме
(4)Всё получилось!
Оказывается дело было в названии справочника ,какой то буквы не хватало в "расш_КандидатПрисоединённыеФайлы"

Но!!! Теперь вылазит следующая ошибка: "Ошибка при добавлении присоединенного файла " black.png":
Запись не верна! Значение поля "Файл" не может быть пустым!: ДвоичныеДанныеФайлов: (Регистр сведений: Двоичные данные файлов)"


В чём дело ?
15. Intercititude 07.06.19 03:08 Сейчас в теме +0.25 $m
(14) Разобрался в чём дело.
В рег.сведении "ДвоичныеДанные" у измерения Файл стоит тип "Определяемый тип - "Присоединённые файлы".

Но так как в расширении опр.типы ещё не реализовали. То пришло в голову только создать аналогичный регистр и заменить процедуру :

&Вместо("ЗаписатьФайлВИнформационнуюБазу")
Процедура расш_ЗаписатьФайлВИнформационнуюБазу(Знач ПрисоединенныйФайл, Знач ДвоичныеДанные)
	
	УстановитьПривилегированныйРежим(Истина);
	
	МенеджерЗаписи                     = РегистрыСведений.ДвоичныеДанныеФайловОбходОпределяемогоТипа.СоздатьМенеджерЗаписи();
	МенеджерЗаписи.Файл                = ПрисоединенныйФайл;
	МенеджерЗаписи.ДвоичныеДанныеФайла = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
	МенеджерЗаписи.Записать(Истина);

КонецПроцедуры
Показать


Файлы присоединяются теперь, но думаю это повлечёт кучу ошибок. Подскажите насколько это корректно и как сделать можно лучше ?!
Yahin; limonas; user1080864; +3 Ответить
16. MikeI 73 07.06.19 22:52 Сейчас в теме
(15) я бы так же сделал.
Intercititude; +1 Ответить
17. Intercititude 08.06.19 19:39 Сейчас в теме
(16)А если пользователь вдруг захочет присоединить файл в другом справочнике,документе и т.д. Не вызовет ли это ошибку, если я использую "Вместо" ?
18. MikeI 73 08.06.19 23:56 Сейчас в теме
(17)есть метод, который продолжает вызов штатной процедуры
Intercititude; +1 Ответить
19. limonas 11 31.08.21 13:19 Сейчас в теме
(15)
ЗаписатьФайлВИнформационнуюБазу

Спасибо, за наводку, все думал, как обойти ограничение платформы с типами и использовать типовые возможности по максимуму. Добавил копированием регистр "ДвоичныеДанныеФайловДоп" в расширение, и, еще, по строчке дописки сделал в процедурах (в расширении конечно) общего модуля "РаботаСФайлами", чтобы только мое дополнение использовало новый регистр:
ДанныеФайла, ДвоичныеДанныеФайла и ХранилищеФайлаИзИнформационнойБазы.
Применительно к моему новому справочнику "СертификатыНоменклатуры", код в УНФ такой:
Функция РасшСерт_ДанныеФайла(Знач ПрисоединенныйФайл, Знач ДополнительныеПараметры, Знач УдалитьПолучатьСсылкуНаДвоичныеДанные, Знач УдалитьДляРедактирования)
	
	Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда
		
		ДляРедактирования = ?(ДополнительныеПараметры.Свойство("ДляРедактирования"), ДополнительныеПараметры.ДляРедактирования, Ложь);
		ИдентификаторФормы = ?(ДополнительныеПараметры.Свойство("ИдентификаторФормы"), ДополнительныеПараметры.ИдентификаторФормы, Неопределено);
		ВызыватьИсключение = ?(ДополнительныеПараметры.Свойство("ВызыватьИсключение"), ДополнительныеПараметры.ВызыватьИсключение, Истина);
		ПолучатьСсылкуНаДвоичныеДанные = ?(ДополнительныеПараметры.Свойство("ПолучатьСсылкуНаДвоичныеДанные"), 
			ДополнительныеПараметры.ПолучатьСсылкуНаДвоичныеДанные, Истина);
		
	Иначе
		ДляРедактирования = УдалитьДляРедактирования;
		ИдентификаторФормы = ДополнительныеПараметры;
		ВызыватьИсключение = Истина;
		ПолучатьСсылкуНаДвоичныеДанные = УдалитьПолучатьСсылкуНаДвоичныеДанные;
	КонецЕсли;
	
	// Федоров А.В. 31.08.21 ++
	Если ТипЗнч(ПрисоединенныйФайл) = Тип("СправочникСсылка.СертификатыНоменклатурыПрисоединенныеФайлы") Тогда
		ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("РаботаСФайлами.ДанныеФайла", "ПрисоединенныйФайл",
		ПрисоединенныйФайл, Метаданные.РегистрыСведений.ДвоичныеДанныеФайловДоп.Измерения.Файл.Тип);	
	Иначе // как было
		
		ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(ПрисоединенныйФайл);
		
		ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("РаботаСФайлами.ДанныеФайла", "ПрисоединенныйФайл",
		ПрисоединенныйФайл, Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип);
	КонецЕсли;
	// Федоров А.В. 31.08.21 --
		
	ФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект();
	Если ВызыватьИсключение Тогда
		ОбщегоНазначенияКлиентСервер.Проверить(ФайлОбъект <> Неопределено, 
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не найден присоединенный файл ""%1"" (%2)'"),
			Строка(ПрисоединенныйФайл), ПрисоединенныйФайл.Метаданные()));
	ИначеЕсли ФайлОбъект = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Если ДляРедактирования И Не ЗначениеЗаполнено(ФайлОбъект.Редактирует) Тогда
		ФайлОбъект.Заблокировать();
		РаботаСФайламиСлужебный.ЗанятьФайлДляРедактированияСервер(ФайлОбъект);
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
	
	СсылкаНаДвоичныеДанныеФайла = Неопределено;
	
	ПоддерживаетсяХранениеВерсий = (ТипЗнч(ПрисоединенныйФайл) = Тип("СправочникСсылка.Файлы"));
	ИспользуетсяВерсионированиеФайлов = ПоддерживаетсяХранениеВерсий
								И ПрисоединенныйФайл.ХранитьВерсии
								И ЗначениеЗаполнено(ПрисоединенныйФайл.ТекущаяВерсия);
	
	Если ПолучатьСсылкуНаДвоичныеДанные Тогда
		Если ИспользуетсяВерсионированиеФайлов Тогда
			ДвоичныеДанные = ДвоичныеДанныеФайла(ПрисоединенныйФайл.ТекущаяВерсия, ВызыватьИсключение);
		Иначе
			ДвоичныеДанные = ДвоичныеДанныеФайла(ПрисоединенныйФайл, ВызыватьИсключение);
		КонецЕсли;
		Если ТипЗнч(ИдентификаторФормы) = Тип("УникальныйИдентификатор") Тогда
			СсылкаНаДвоичныеДанныеФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ИдентификаторФормы);
		Иначе
			СсылкаНаДвоичныеДанныеФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
		КонецЕсли;
		
	КонецЕсли;
	
	Результат = Новый Структура;
	Результат.Вставить("Ссылка",                       ПрисоединенныйФайл);
	Результат.Вставить("СсылкаНаДвоичныеДанныеФайла",  СсылкаНаДвоичныеДанныеФайла);
	Результат.Вставить("ОтносительныйПуть",            ПолучитьИдентификаторОбъекта(ФайлОбъект.ВладелецФайла) + "\");
	Результат.Вставить("ДатаМодификацииУниверсальная", ФайлОбъект.ДатаМодификацииУниверсальная);
	Результат.Вставить("ИмяФайла",                     ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ФайлОбъект.Наименование, ФайлОбъект.Расширение));
	Результат.Вставить("Наименование",                 ФайлОбъект.Наименование);
	Результат.Вставить("Расширение",                   ФайлОбъект.Расширение);
	Результат.Вставить("Размер",                       ФайлОбъект.Размер);
	Результат.Вставить("Редактирует",                  ФайлОбъект.Редактирует);
	Результат.Вставить("ПодписанЭП",                   ФайлОбъект.ПодписанЭП);
	Результат.Вставить("Зашифрован",                   ФайлОбъект.Зашифрован);
	Результат.Вставить("ХранитьВерсии",                ФайлОбъект.ХранитьВерсии);
	Результат.Вставить("ПометкаУдаления",              ФайлОбъект.ПометкаУдаления);
	Результат.Вставить("ДатаЗаема",                    ФайлОбъект.ДатаЗаема);
	Результат.Вставить("Владелец",                     ФайлОбъект.ВладелецФайла);
	Результат.Вставить("АвторТекущейВерсии",           ФайлОбъект.Изменил);
	Результат.Вставить("НавигационнаяСсылка", ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл));
	
	МетаданныеОбъектаФайла = Метаданные.НайтиПоТипу(ТипЗнч(ПрисоединенныйФайл));
	ЕстьВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеОбъектаФайла);
	
	Если ЕстьВозможностьХранитьВерсии И ЗначениеЗаполнено(ПрисоединенныйФайл.ТекущаяВерсия) Тогда
		РаботаСФайламиСлужебный.ЗаполнитьДополнительныеДанныеФайла(Результат, ПрисоединенныйФайл, ПрисоединенныйФайл.ТекущаяВерсия);
	Иначе
		РаботаСФайламиСлужебный.ЗаполнитьДополнительныеДанныеФайла(Результат, ПрисоединенныйФайл, Неопределено);
	КонецЕсли;
	
	Результат.Вставить("ФайлРедактируется",            ЗначениеЗаполнено(ФайлОбъект.Редактирует));
	Результат.Вставить("ФайлРедактируетТекущийПользователь",
		?(Результат.ФайлРедактируется, ФайлОбъект.Редактирует = Пользователи.АвторизованныйПользователь(), Ложь) );
		
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
		МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись");
		Если ФайлОбъект.Зашифрован Тогда
			Результат.Вставить("МассивСертификатовШифрования", МодульЭлектроннаяПодпись.СертификатыШифрования(ПрисоединенныйФайл));
		КонецЕсли;
	КонецЕсли;
	
	Файл = ?(ИспользуетсяВерсионированиеФайлов, ПрисоединенныйФайл.ТекущаяВерсия, ПрисоединенныйФайл);
	Результат.Вставить("Кодировка", РегистрыСведений.КодировкиФайлов.ОпределитьКодировкуФайла(Файл, ФайлОбъект.Расширение));
	
	Результат.Вставить("Служебный", Ложь);
	Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ФайлОбъект, "Служебный") Тогда
		Результат.Служебный = ФайлОбъект.Служебный;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

&Вместо("ДвоичныеДанныеФайла")
Функция РасшСерт_ДвоичныеДанныеФайла(Знач ПрисоединенныйФайл, Знач ВызыватьИсключение)
	
	// Федоров А.В. 31.08.21 ++
	Если ТипЗнч(ПрисоединенныйФайл) = Тип("СправочникСсылка.СертификатыНоменклатурыПрисоединенныеФайлы") Тогда
		ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("РаботаСФайлами.ДвоичныеДанныеФайла", "ПрисоединенныйФайл",
		ПрисоединенныйФайл, Метаданные.РегистрыСведений.ДвоичныеДанныеФайловДоп.Измерения.Файл.Тип);	
	Иначе // как было
		ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("РаботаСФайлами.ДвоичныеДанныеФайла", "ПрисоединенныйФайл",
		ПрисоединенныйФайл, Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип);
	КонецЕсли;
	// Федоров А.В. 31.08.21 --
	
	ФайлОбъект = РаботаСФайламиСлужебный.ФайлОбъект(ПрисоединенныйФайл);
	Если ФайлОбъект = Неопределено
		И Не ВызыватьИсключение Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	УстановитьОтключениеБезопасногоРежима(Истина);
	УстановитьПривилегированныйРежим(Истина);
	
	Если ФайлОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда
		
		Результат = ХранилищеФайлаИзИнформационнойБазы(ФайлОбъект.Ссылка);
		Если Результат <> Неопределено Тогда
			Возврат Результат.Получить();
		КонецЕсли;
		
		// Запись в журнал регистрации.
		СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Двоичные данные файла отсутствуют в регистре ДвоичныеДанныеФайлов.
			           |Файл: ""%1"".'"),
			ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл));
		
		ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Открытие файла'", ОбщегоНазначения.КодОсновногоЯзыка()),
			УровеньЖурналаРегистрации.Ошибка,
			Метаданные.Справочники[ПрисоединенныйФайл.Метаданные().Имя],
			ПрисоединенныйФайл,
			СообщениеОбОшибке);
			
		Если Не ВызыватьИсключение Тогда
			Возврат Неопределено;
		КонецЕсли;
		
		ПредставлениеВладельцаФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Присоединен к %1 : %2'"),
				Строка(ТипЗнч(ФайлОбъект.ВладелецФайла)),
				ФайлОбъект.ВладелецФайла);
		
		ВызватьИсключение РаботаСФайламиСлужебный.ОшибкаФайлНеНайденВХранилищеФайлов(
			ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ФайлОбъект.Наименование, ФайлОбъект.Расширение), Ложь,
			ПредставлениеВладельцаФайла);
	Иначе
		Возврат РаботаСФайламиВТомахСлужебный.ДанныеФайла(ПрисоединенныйФайл, ВызыватьИсключение);
	КонецЕсли;
	
КонецФункции

&Вместо("ХранилищеФайлаИзИнформационнойБазы")
Функция РасшСерт_ХранилищеФайлаИзИнформационнойБазы(ФайлСсылка)
	
	УстановитьПривилегированныйРежим(Истина);
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ДвоичныеДанныеФайлов.Файл,
	|	ДвоичныеДанныеФайлов.ДвоичныеДанныеФайла
	|ИЗ
	|	РегистрСведений.ДвоичныеДанныеФайлов КАК ДвоичныеДанныеФайлов
	|ГДЕ
	|	ДвоичныеДанныеФайлов.Файл = &ФайлСсылка";
	
	// Федоров А.В. 31.08.21 ++
	Если ТипЗнч(ФайлСсылка) = Тип("СправочникСсылка.СертификатыНоменклатурыПрисоединенныеФайлы") Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "РегистрСведений.ДвоичныеДанныеФайлов", "РегистрСведений.ДвоичныеДанныеФайловДоп");
	КонецЕсли;
	// Федоров А.В. 31.08.21 --
	
	Запрос.УстановитьПараметр("ФайлСсылка", ФайлСсылка);
	Выборка = Запрос.Выполнить().Выбрать();
	
	Возврат ?(Выборка.Следующий(), Выборка.ДвоичныеДанныеФайла, Неопределено);

КонецФункции
Показать
5. Kovekh 06.06.19 07:55 Сейчас в теме
В ЗУПе же есть справочник Файлы или как-то так, общий для всех. Может, поработать с ним в расширении, добавить во владельцы ещё твой справочник из расширения. И попробовать заливать туда
20. user1529358 02.09.21 20:51 Сейчас в теме
(19) А какой Тип ты указал у измерения Файл у регистра сведений ДвоичныеДанныеФайловДоп в расширении?
21. limonas 11 03.09.21 03:36 Сейчас в теме
(20) Как водится у БСП, создал еще справочник для присоединенных файлов и указал только его: "СправочникСсылка.СертификатыНоменклатурыПрисоединенныеФайлы".
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот