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