Как реализовать механизм присоединенных файлов для собственного справочника в 1С:ERP и исправить ошибку «Значение поля Файл не может быть пустым»?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием IT и автоматизация бизнеса
← На главную

При разработке собственных расширений или доработке типовых конфигураций на базе Библиотеки стандартных подсистем (БСП), таких как 1С:ERP Управление предприятием или 1С:Комплексная автоматизация, программисты часто сталкиваются с необходимостью добавить функционал присоединенных файлов к новому справочнику. Несмотря на то что структура справочников может быть полностью скопирована с типовых (например, со справочника Номенклатура), механизм может выдавать критическую ошибку при попытке записи файла: «Запись не верна! Значение поля "Файл" не может быть пустым! (Регистр сведений: Двоичные данные файлов)».

В этой статье мы подробно разберем, как правильно интегрировать подсистему работы с файлами в свой объект и какие настройки метаданных являются критически важными для того, чтобы система «увидела» ваш новый справочник.

Анализ проблемы: почему возникает ошибка в регистре «Двоичные данные файлов»?

Рассмотрим ситуацию: вы создали справочник-владелец (например, СметыЗаказчиков) и справочник для хранения метаданных файлов (СметыЗаказчиковПрисоединенныеФайлы). Вы даже скопировали программный код вызова диалога выбора файла из типовой формы номенклатуры. Однако при сохранении картинки или документа система выбрасывает исключение.

Проблема кроется в архитектуре БСП. Подсистема РаботаСФайлами использует жесткую типизацию через Определяемые типы. Когда вы вызываете метод ДобавитьФайл, система пытается определить, к какому типу относится владелец и сам файл. Если ваши новые справочники не включены в соответствующие списки типов, механизмы БСП не могут корректно инициализировать структуру записи в регистре ДвоичныеДанныеФайлов, что и приводит к появлению пустого значения в ключевом поле Файл.

Шаг 1: Настройка определяемых типов (Критически важный этап)

Для того чтобы подсистема работы с файлами начала обрабатывать ваш справочник, необходимо добавить его в несколько определяемых типов. Без этого шага программный интерфейс (API) БСП будет работать некорректно. Разберем, какие именно типы нужно отредактировать:

  1. ВладелецПрисоединенныхФайлов: В этот тип необходимо добавить ссылку на ваш основной справочник (например, СправочникСсылка.СметыЗаказчиков). Это позволит системе понимать, что данный объект может иметь «дочерние» файлы.
  2. ВладелецПрисоединенныхФайловОбъект: Сюда добавляем объектную ссылку — СправочникОбъект.СметыЗаказчиков. Это требуется для работы подписок на события (например, при удалении владельца).
  3. ПрисоединенныйФайл: В этот список нужно включить ссылку на ваш вспомогательный справочник — СправочникСсылка.СметыЗаказчиковПрисоединенныеФайлы.
  4. ПрисоединенныйФайлОбъект: Аналогично, добавляем СправочникОбъект.СметыЗаказчиковПрисоединенныеФайлы.

Важно: Если вы используете расширение, эти типы нужно заимствовать в расширение и добавлять свои объекты именно там.

Шаг 2: Настройка справочника присоединенных файлов

Ваш справочник СметыЗаказчиковПрисоединенныеФайлы должен иметь определенную структуру. Проанализируем обязательные реквизиты, которые должны быть в нем присутствовать (лучше всего копировать их из НоменклатураПрисоединенныеФайлы):

Проанализируем также стандартные реквизиты: Владелец должен иметь тип СправочникСсылка.СметыЗаказчиков.

Шаг 3: Подписки на события

Чтобы файлы вели себя «правильно» при манипуляциях с основным объектом, проверим наличие вашего справочника в следующих подписках на события:

1. УстановитьПометкуУдаленияПрисоединенныхФайлов: При установке пометки удаления на СметуЗаказчика, система должна автоматически пометить на удаление все связанные файлы. Проверьте, что ваш СправочникОбъект.СметыЗаказчиков включен в источник этой подписки.

2. ОчиститьСсылкуНаВладельцаПриКопированииПрисоединенногоФайла: Нужна для корректной работы механизма копирования объектов.

Шаг 4: Программная интеграция в форму

Рассмотрим пример кода, который должен быть размещен в форме элемента вашего справочника для загрузки файла (например, изображения). Выясним, как правильно вызвать штатные команды БСП.

В модуле формы в процедуре добавления файла (например, по нажатию кнопки) используем следующий подход:


&НаКлиенте
Процедура ДобавитьИзображение(Команда)
    
    ПараметрыЗагрузки = Новый Структура;
    ПараметрыЗагрузки.Вставить("ВладелецФайла", Объект.Ссылка);
    ПараметрыЗагрузки.Вставить("ИдентификаторФормы", ЭтаФорма.УникальныйИдентификатор);
    
    // Используем штатный метод БСП для добавления файлов
    // Фильтр можно задать самостоятельно или взять из общих модулей
    Фильтр = "Изображения (*.jpg;*.png)|*.jpg;*.png";
    
    ПрисоединенныеФайлыКлиент.ДобавитьФайлы(Объект.Ссылка, ЭтаФорма.УникальныйИдентификатор, Фильтр);
    
КонецПроцедуры

Обратите внимание на вызов ПрисоединенныеФайлыКлиент.ДобавитьФайлы. Этот метод берет на себя всю работу по открытию диалога выбора файла, передаче его на сервер и записи в соответствующие справочники и регистры. Но он сработает только при условии выполнения Шага 1.

Почему не работала точка останова?

В тексте обращения упоминалось, что точка останова в модуле РаботаСФайлами не срабатывает. Это часто происходит по двум причинам:

  1. Код выполняется в фоновом задании. БСП часто выносит операции записи файлов в фон для повышения отзывчивости интерфейса. Чтобы отладить такой код, необходимо включить «Отладку фоновых заданий» в настройках конфигуратора.
  2. Вызов происходит через СлужебныйВызовСервера, и точка останова стоит в клиентском контексте или наоборот. Проверьте, установлен ли флаг отладки на сервере приложений 1С.

Резюме по решению проблемы

Проанализируем итоговый алгоритм действий для исправления ошибки:

  1. Проверяем Определяемые типы. Ваш основной справочник должен быть в ВладелецПрисоединенныхФайлов, а справочник файлов — в ПрисоединенныйФайл.
  2. Убеждаемся, что в справочнике ...ПрисоединенныеФайлы реквизит Владелец имеет тип ссылки на ваш основной справочник.
  3. Проверяем, что в системе включены функциональные опции, отвечающие за работу с файлами (ИспользоватьПрисоединенныеФайлы).
  4. Если ошибка «Значение поля Файл не может быть пустым» сохраняется, проверьте права доступа. Пользователь должен иметь права не только на ваш справочник, но и на чтение/запись регистра сведений ДвоичныеДанныеФайлов.

Следуя этой методике, вы сможете бесшовно интегрировать свой справочник в экосистему 1С:ERP, обеспечив надежное хранение файлов как внутри информационной базы, так и во внешних томах хранения.

← На главную