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