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