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