При разработке функционала на управляемых формах 1С часто возникает задача предоставить пользователю возможность выбрать каталог на диске и сохранить путь к нему в реквизит строки табличной части. Начинающие разработчики нередко сталкиваются с ситуацией, когда диалог выбора папки открывается успешно, но попытка записать выбранное значение напрямую в свойства визуального элемента (например, через Элемент.ВыделенныйТекст) не приводит к сохранению данных.
В этой статье мы подробно разберем, почему возникает такая ошибка, как устроена работа с данными табличных частей на управляемых формах и как правильно организовать выбор папки с учетом современных стандартов платформы 1С:Предприятие.
Проанализируем типичную ошибку. В коде обработчика события НачалоВыбора разработчик пытается присвоить значение напрямую переданному в процедуру параметру Элемент:
&НаКлиенте
Процедура ОборудованиеПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Если Диалог.Выбрать() Тогда
Элемент.ВыделенныйТекст = Диалог.Каталог; // Ошибка: элемент формы не хранит данные
КонецЕсли;
КонецПроцедуры
В управляемом интерфейсе 1С действует строгое разделение между визуальными элементами формы и источниками данных (реквизитами формы или объекта). Элемент управления — это лишь способ отображения данных на экране. Попытка записать путь в свойства элемента не изменяет сам реквизит в базе данных или в памяти объекта.
Чтобы данные сохранились, их необходимо записывать напрямую в реквизит текущей выбранной строки табличной части через свойство ТекущиеДанные.
Рассмотрим, как правильно получить доступ к текущей строке таблицы. У элемента формы, представляющего таблицу (например, Оборудование), есть коллекция ТекущиеДанные. Через нее можно напрямую обратиться к любому реквизиту строки текущей позиции курсора.
Кроме того, в обработчике события НачалоВыбора крайне важно установить СтандартнаяОбработка = Ложь;, чтобы отключить платформенный механизм выбора значения по умолчанию.
Разберем готовый пример кода:
&НаКлиенте
Процедура ОборудованиеПутьККаталогуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Отключаем стандартный список выбора платформы
СтандартнаяОбработка = Ложь;
// Получаем текущую строку табличной части формы
СтрокаТаблицы = Элементы.Оборудование.ТекущиеДанные;
Если СтрокаТаблицы = Неопределено Тогда
Возврат;
КонецЕсли;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Диалог.Заголовок = "Выберите каталог с файлами";
Если Диалог.Выбрать() Тогда
// Записываем путь непосредственно в реквизит строки ТЧ
СтрокаТаблицы.ПутьККаталогу = Диалог.Каталог;
КонецЕсли;
КонецПроцедуры
Посмотрим на важную особенность: синхронный метод Диалог.Выбрать() вызывает ошибку в конфигурациях, где в свойствах установлен режим запрета модальных окон или синхронных вызовов расширений платформы. Для обеспечения полной совместимости рекомендуется использовать асинхронный вызов.
Вариант 1: Использование асинхронных функций с оператором Ждать
Если версия платформы поддерживает ключевое слово Ждать, код выглядит максимально лаконично и понятно:
&НаКлиенте
Асинх Процедура ОборудованиеПутьККаталогуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СтрокаТаблицы = Элементы.Оборудование.ТекущиеДанные;
Если СтрокаТаблицы = Неопределено Тогда
Возврат;
КонецЕсли;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Диалог.Заголовок = "Выберите каталог с файлами";
МассивПутей = Ждать Диалог.ВыбратьАсинх();
Если МассивПутей <> Неопределено И МассивПутей.Количество() > 0 Тогда
СтрокаТаблицы.ПутьККаталогу = МассивПутей[0];
КонецЕсли;
КонецПроцедуры
Вариант 2: Использование метода Показать и ОписанияОповещения
Для более ранних версий платформы без оператора Асинх/Ждать разберем реализацию через отдельную процедуру обратного вызова:
&НаКлиенте
Процедура ОборудованиеПутьККаталогуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СтрокаТаблицы = Элементы.Оборудование.ТекущиеДанные;
Если СтрокаТаблицы = Неопределено Тогда
Возврат;
КонецЕсли;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Диалог.Заголовок = "Выберите каталог с файлами";
Оповещение = Новый ОписаниеОповещения("ПослеВыбораКаталога", ЭтотОбъект, СтрокаТаблицы);
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораКаталога(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() > 0 Тогда
СтрокаТаблицы = ДополнительныеПараметры;
СтрокаТаблицы.ПутьККаталогу = ВыбранныеФайлы[0];
КонецЕсли;
КонецПроцедуры
Разберем практические нюансы, которые следует учитывать при проектировании хранения путей к файлам:
C:\Папка будет доступен только автору записи. Для многопользовательской работы необходимо выбирать сетевые папки в формате UNC (например, \\server\share\folder).Гиперссылка = Истина и добавьте обработчик события Нажатие:
&НаКлиенте
Процедура ОборудованиеПутьККаталогуНажатие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СтрокаТаблицы = Элементы.Оборудование.ТекущиеДанные;
Если СтрокаТаблицы <> Неопределено И Не ПустаяСтрока(СтрокаТаблицы.ПутьККаталогу) Тогда
ЗапуститьПриложение(СтрокаТаблицы.ПутьККаталогу);
КонецЕсли;
КонецПроцедуры
ФайловаяСистемаКлиент.ОткрытьПроводник(ПутьККаталогу).