Реализация механизма присоединенных файлов в расширении — это одна из наиболее трудоемких задач при работе с Библиотекой стандартных подсистем (БСП). Часто разработчики сталкиваются с тем, что после копирования справочников и настройки базовых определяемых типов функционал всё равно не работает: кнопки не появляются, формы не открываются, а точки останова в коде игнорируются. Разберем по шагам, как правильно перенести этот функционал в расширение, проанализируем типичные ошибки и выясним, какие «невидимые» связи БСП нужно учесть — для этого пригодится анализ графа зависимостей объектов и расширений 1С.
Первым делом проанализируем структуру хранения. В типовых конфигурациях для каждого объекта-владельца (например, Контрагенты) существует парный справочник (КонтрагентыПрисоединенныеФайлы). Нам необходимо создать аналогичный объект в расширении. Рассмотрим два варианта:
КонтрагентыПрисоединенныеФайлы из основной конфигурации в наше расширение и переименовать его (например, в МойСправочникПрисоединенныеФайлы).Автор, ДатаСоздания, ТипХраненияФайла, ФайлХранилище и других. Любое несоответствие типов или имен приведет к ошибкам в общих модулях БСП.Особое внимание уделим реквизиту ВладелецФайла. В нашем новом справочнике он должен иметь тип ссылки на наш основной объект-владелец, который мы также добавили в расширение.
Это этап, на котором совершается большинство ошибок. Для работы подсистемы «Присоединенные файлы» недостаточно расширить только типы владельцев. Рассмотрим полный список определяемых типов, которые должны быть включены в расширение и дополнены нашими новыми объектами:
СправочникОбъект нашего владельца.МойСправочникПрисоединенныеФайлы.СправочникОбъект нашего справочника для хранения файлов.Важный нюанс: При добавлении объектов в определяемые типы в расширении следите за свойством «Использование типов». Если в основной конфигурации этот тип уже заполнен другими объектами, расширение должно корректно дополнять этот список, а не замещать его, чтобы не нарушить работу стандартных подсистем.
Даже если метаданные настроены верно, БСП «не знает», что ваш новый объект должен использовать механизм файлов. Проанализируем ситуацию: стандартные механизмы часто опираются на программный интерфейс переопределяемых модулей. Нам необходимо выполнить регистрацию нашего справочника-владельца.
Для этого в расширении найдем общий модуль РаботаСФайламиПереопределяемый и создадим в нем обработчик для процедуры ПриОпределенииОбъектовСПрисоединеннымиФайлами. Используем аннотацию &После:
&После("ПриОпределенииОбъектовСПрисоединеннымиФайлами")
Процедура Расш1_ПриОпределенииОбъектовСПрисоединеннымиФайлами(СписокОбъектов)
СписокОбъектов.Добавить(Метаданные.Справочники.МойСправочникВладелец);
КонецПроцедуры
После этого изменения необходимо обновить кэш метаданных БСП. Выясним причину, почему это важно: БСП хранит настройки подсистем в параметрах сеанса или в справочниках настроек. Чтобы изменения вступили в силу, иногда требуется запустить базу с параметром /С ЗапуститьОбновлениеИнформационнойБазы.
Чтобы пользователь увидел список файлов, на форму справочника-владельца нужно вывести соответствующую команду (похожий подход использует универсальный механизм добавления табличных частей с помощью расширения) — в этом поможет индикатор наличия присоединенных файлов в списках. В современных версиях БСП это делается через механизм «Подключаемые команды».
В модуле формы нашего владельца в процедуре ПриСозданииНаСервере добавим вызов инициализации команд:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Подключение команд подсистемы ПрисоединенныеФайлы
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами");
МодульРаботаСФайлами.ПриСозданииНаСервере(ЭтотОбъект);
КонецЕсли;
КонецПроцедуры
Этот код позволит динамически создать гиперссылку «Файлы» в командной панели формы (для более сложных манипуляций изучите программное изменение форм (для разработчиков)). Если же вам нужно кастомизировать форму списка файлов или изменить логику перехода, следует обратить внимание на модуль РаботаСФайламиКлиентСерверПереопределяемый.
Разберем ситуацию, когда при нажатии на файл открывается не та форма или возникает ошибка. БСП использует механизм ОбработкаПолученияФормы для подмены стандартных форм файлов на специализированные. Если вы создали подписку на это событие в расширении, убедитесь, что ваш обработчик вызывает стандартный метод БСП:
Процедура Расш1_ОбработкаПолученияФормыПрисоединенногоФайла(Источник, ВидФормы, Параметры, ВыбраннаяФорма, СтандартнаяОбработка)
РаботаСФайламиСлужебныйВызовСервера.ОпределитьФормуПрисоединенногоФайла(Источник, ВидФормы, Параметры, ВыбраннаяФорма, СтандартнаяОбработка);
КонецПроцедуры
Если точка останова в этом месте не срабатывает, проверьте, правильно ли указан объект в подписке (используйте статический анализатор кода проектов для контроля качества кода). Подписка должна быть назначена на справочник МойСправочникПрисоединенныеФайлы.
Проанализируем вопрос очистки данных. Чтобы при удалении основного объекта не оставалось «мусора» в справочнике файлов и в томах хранения, необходимо настроить подписку на событие ПередУдалением для объекта-владельца. В обработчике следует вызвать метод:
РаботаСФайлами.ОчиститьФайлыВладельца(Источник);
Это обеспечит корректное удаление всех связанных записей и физических файлов с диска или из информационной базы.
Подведем итог. Если функционал всё еще не работает, проверьте следующие моменты:
ОбновлениеВспомогательныхДанных).Следуя этой методике, мы обеспечим бесшовную интеграцию подсистемы «Присоединенные файлы» в наше расширение, сохраняя при этом типовую логику работы конфигурации.