Всем доброе время суток! Предупрежу, что я новичок,поэтому не обессудьте.
Пытаюсь реализовать присоединение файлов в ЗУП(проф) в расширении. Но столкнулся с проблемой следующего характера(см. рисунок 1)
Получилось её решить добавлением в общий модуль этого:
Но! Теперь после выбора какого либо файла сталкиваюсь с проблемой( рисунок 2) !
Подскажите что где дописать, чтобы обойти эту ошибку ? Облазил отладчиком уже все модули и не могу сообразить.
Заранее спасибо!
Пытаюсь реализовать присоединение файлов в ЗУП(проф) в расширении. Но столкнулся с проблемой следующего характера(см. рисунок 1)
Получилось её решить добавлением в общий модуль этого:
&После("ПриОпределенииСправочниковХраненияФайлов")
Процедура расш_ПриОпределенииСправочниковХраненияФайлов(ТипВладелецФайла, ИменаСправочников)
Если ТипВладелецФайла = Тип("СправочникСсылка.расш_Кандидаты") Тогда
ИменаСправочников.Вставить("Файлы", Истина);
КонецЕсли;
КонецПроцедуры
ПоказатьНо! Теперь после выбора какого либо файла сталкиваюсь с проблемой( рисунок 2) !
Подскажите что где дописать, чтобы обойти эту ошибку ? Облазил отладчиком уже все модули и не могу сообразить.
Заранее спасибо!
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Проблема в том, что определяемый тип 'владелец файлов' не содержит Ваш справочник. И в расширении его тоже изменить не получается. Покрайней мере на платформе 8.3.13.1809. Может на платформе выше получиться
(10) Разумеется я убрал. Ошибка с рисунка 1 вылазит. Я так полагаю когда доходит до этого общ.модуль РаботаСФайламиСлужебный - функция ИменаСправочниковХраненияФайлов:
Вот из-за этого и есть эта ошибка. Он почему то ненаходит в метаданных "КандидатыПрисоединённыеФайлы" и просто пропускает этот блок.Как это обойти ?
В итоге почему то ИменаСправочников.Количество() = 0 и вылазит это исключение.
Если Метаданные.Справочники.Найти(ИмяСтандартногоОсновногоСправочника) <> Неопределено Тогда
ИменаСправочников.Вставить(ИмяСтандартногоОсновногоСправочника, Истина);
ИначеЕсли Метаданные.ОпределяемыеТипы.ВладелецФайлов.Тип.СодержитТип(ТипВладельцаФайлов) Тогда
ИменаСправочников.Вставить("Файлы", Истина);
КонецЕсли;
Вот из-за этого и есть эта ошибка. Он почему то ненаходит в метаданных "КандидатыПрисоединённыеФайлы" и просто пропускает этот блок.Как это обойти ?
В итоге почему то ИменаСправочников.Количество() = 0 и вылазит это исключение.
(4)Всё получилось!
Оказывается дело было в названии справочника ,какой то буквы не хватало в "расш_КандидатПрисоединённыеФайлы"
Но!!! Теперь вылазит следующая ошибка: "Ошибка при добавлении присоединенного файла " black.png":
Запись не верна! Значение поля "Файл" не может быть пустым!: ДвоичныеДанныеФайлов: (Регистр сведений: Двоичные данные файлов)"
В чём дело ?
Оказывается дело было в названии справочника ,какой то буквы не хватало в "расш_КандидатПрисоединённыеФайлы"
Но!!! Теперь вылазит следующая ошибка: "Ошибка при добавлении присоединенного файла " black.png":
Запись не верна! Значение поля "Файл" не может быть пустым!: ДвоичныеДанныеФайлов: (Регистр сведений: Двоичные данные файлов)"
В чём дело ?
(14) Разобрался в чём дело.
В рег.сведении "ДвоичныеДанные" у измерения Файл стоит тип "Определяемый тип - "Присоединённые файлы".
Но так как в расширении опр.типы ещё не реализовали. То пришло в голову только создать аналогичный регистр и заменить процедуру :
Файлы присоединяются теперь, но думаю это повлечёт кучу ошибок. Подскажите насколько это корректно и как сделать можно лучше ?!
В рег.сведении "ДвоичныеДанные" у измерения Файл стоит тип "Определяемый тип - "Присоединённые файлы".
Но так как в расширении опр.типы ещё не реализовали. То пришло в голову только создать аналогичный регистр и заменить процедуру :
&Вместо("ЗаписатьФайлВИнформационнуюБазу")
Процедура расш_ЗаписатьФайлВИнформационнуюБазу(Знач ПрисоединенныйФайл, Знач ДвоичныеДанные)
УстановитьПривилегированныйРежим(Истина);
МенеджерЗаписи = РегистрыСведений.ДвоичныеДанныеФайловОбходОпределяемогоТипа.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Файл = ПрисоединенныйФайл;
МенеджерЗаписи.ДвоичныеДанныеФайла = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
МенеджерЗаписи.Записать(Истина);
КонецПроцедуры
ПоказатьФайлы присоединяются теперь, но думаю это повлечёт кучу ошибок. Подскажите насколько это корректно и как сделать можно лучше ?!
(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 --
Запрос.УстановитьПараметр("ФайлСсылка", ФайлСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Возврат ?(Выборка.Следующий(), Выборка.ДвоичныеДанныеФайла, Неопределено);
КонецФункции
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот