При разработке интерфейсов на управляемых формах в 1С часто возникает типовая задача: предоставить пользователю возможность выбрать файл на диске и отобразить путь к нему в строковом поле ввода. Однако иногда разработчики сталкиваются с ситуацией, когда диалог отрабатывает без ошибок, переменная или реквизит формы успешно заполняются значением, но само поле ввода на форме визуально остается совершенно пустым. Разберем причины такого поведения платформы и посмотрим, как правильно настроить элементы формы и программный код.
Рассмотрим исходную ситуацию. На управляемую форму добавлен реквизит ПутьКФайлу с типом Строка неограниченной длины. В обработчике события (например, НачалоВыбора) написан следующий код:
СтандартнаяОбработка = Ложь;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Фильтр = "(*.xlsx;*.xls)|*.xlsx;*.xls|";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.ПроверятьСуществованиеФайла = Истина;
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = "Выберите загружаемый файл MS Excel";
Если ДиалогОткрытияФайла.Выбрать() Тогда
ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла;
КонецЕсли;
При отладке видно, что условие выполняется, свойство ДиалогОткрытияФайла.ПолноеИмяФайла возвращает корректную строку пути, и реквизит формы ПутьКФайлу принимает это значение. Тем не менее в интерфейсе пользователя строка ввода остается пустой.
Выясним причину этой проблемы. Главным виновником такого поведения является включенное свойство элемента формы Режим выбора из списка (РежимВыбораИзСписка / ListChoiceMode).
Если для поля ввода включено свойство РежимВыбораИзСписка, платформа 1С считает, что отображаться в поле могут исключительно те значения, которые содержатся в коллекции СписокВыбора (ChoiceList) данного элемента формы. Если присвоенное значение строкового реквизита отсутствует в списке выбора, платформа просто не может сопоставить его ни с одним из элементов списка и отображает поле пустым, даже если данные в реквизите присутствуют.
Если поле предназначено для свободного ввода или исключительно для записи пути к файлу через диалог, выпадающий список значений для него не требуется. Разберем по шагам, как исправить настройку:
ПутьКФайлу.Также это свойство можно отключить программно при инициализации формы или перед выбором значения:
Элементы.ПутьКФайлу.РежимВыбораИзСписка = Ложь;
После снятия этого флага поле начнет отображать любое текстовое значение, записанное в реквизит формы напрямую.
Иногда режим выбора из списка оставляют намеренно — например, если разработчик хочет сохранять историю последних выбранных файлов в виде выпадающего списка. В этом случае отключать режим не нужно, но перед присвоением значения реквизиту необходимо добавить полученный путь в коллекцию СписокВыбора элемента формы.
Посмотрим на пример правильной реализации:
Если ДиалогОткрытияФайла.Выбрать() Тогда
ВыбранныйПуть = ДиалогОткрытияФайла.ПолноеИмяФайла;
// Проверяем, есть ли уже такой путь в списке, чтобы не дублировать
ЭлементСписка = Элементы.ПутьКФайлу.СписокВыбора.НайтиПоЗначению(ВыбранныйПуть);
Если ЭлементСписка = Неопределено Тогда
Элементы.ПутьКФайлу.СписокВыбора.Добавить(ВыбранныйПуть);
КонецЕсли;
// Теперь значение отобразится корректно
ПутьКФайлу = ВыбранныйПуть;
КонецЕсли;
Если свойство РежимВыбораИзСписка выключено, но поле все равно не заполняется, проанализируем область видимости данных. Распространенная ошибка начинающих разработчиков — случайное перекрытие реквизита формы локальной переменной.
Разберем по шагам, как проверить привязку:
ПутьКФайлу.Перем ПутьКФайлу;. Если в процедуре объявлена одноименная локальная переменная, присвоение запишет данные в нее, а не в реквизит формы.ПутьКФайлу и нажмем комбинацию клавиш Ctrl + Пробел. Если значок элемента зеленый — это реквизит формы. Если значок красный — это локальная переменная процедуры.ЭтотОбъект.ПутьКФайлу.Рассмотрим дополнительные ограничения платформы, которые следует учитывать при использовании диалогов выбора файлов:
ДиалогВыбораФайла.Выбрать() является синхронным (модальным). В конфигурациях с установленным параметром «Режим использования модальности = Не использовать» вызов этого метода вызовет исключение. В современных решениях следует использовать асинхронный метод ДиалогВыбораФайла.Показать() с передачей ОписаниеОповещения или метод ДиалогВыбораФайла.ВыбратьАсинх().ПолноеИмяФайла вернет только имя файла или путь-заглушку. Кроме того, сервер 1С не имеет доступа к диску клиентского компьютера. Поэтому для передачи файла на сервер правильнее использовать интерактивную загрузку во временное хранилище через метод ПоместитьФайлНаСерверАсинх() или НачатьПомещениеФайлаНаСервер().