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