Почему не срабатывает событие НачалоВыбора для поля типа Строка и как выбрать папку на диске?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке обработок в 1С часто возникает задача указать путь к каталогу на локальном диске или сетевом ресурсе. Разработчик создает строковый реквизит, добавляет поле ввода на форму и назначает процедуру-обработчик на событие НачалоВыбора. Однако при попытке нажать клавишу F4 или кликнуть по полю ничего не происходит — точка останова в отладчике даже не срабатывает. Разберем по шагам, почему возникает эта проблема и как правильно реализовать выбор каталога в 1С.

Выясним причину: почему не срабатывает НачалоВыбора для строки

Проанализируем логику работы платформы 1С:Предприятие с полями формы:

  1. Отсутствие кнопки выбора по умолчанию: Для ссылочных данных (справочники, документы) платформа автоматически активирует кнопку с тремя точками. Для примитивных типов данных (таких как Строка или Число) свойство поля КнопкаВыбора по умолчанию имеет значение Авто, что для строки равносильно выключенному состоянию. Если кнопка выбора отсутствует, событие НачалоВыбора платформой не генерируется, а клавиша F4 игнорируется.
  2. Контекст выполнения: Событие НачалоВыбора является чисто клиентским. Оно всегда отрабатывает на клиенте (с директивой &НаКлиенте). Если обработчик ошибочно объявлен на сервере или привязка события в палитре свойств сбилась, код выполняться не будет.
  3. Ограничения доступности: Если для элемента формы включено свойство ТолькоПросмотр или отключена Доступность, интерактивный выбор платформой блокируется.

Шаг 1. Настройка свойств поля ввода на форме

Для того чтобы поле типа Строка могло вызывать диалог выбора, включим необходимые свойства элемента формы:

  1. Откроем форму обработки и перейдем в свойства поля ввода пути к папке.
  2. Найдем свойство КнопкаВыбора и явно установим его в значение Да (в коде это соответствует Элементы.ИмяПоля.КнопкаВыбора = Истина).
  3. Убедимся, что свойство РедактированиеТекста включено (если требуется возможность ручного ввода пути).
  4. В строке события НачалоВыбора нажмем на кнопку с лупой и перейдем в процедуру-обработчик в модуле формы.

Шаг 2. Реализация выбора каталога через ДиалогВыбораФайлов

Для хранения пути к каталогу тип данных Строка выбран совершенно верно. Чтобы предоставить пользователю возможность интерактивно выбрать папку на компьютере, используем объект ДиалогВыбораФайлов с режимом РежимДиалогаВыбораФайлов.ВыборКаталога.

Рассмотрим подробнее реализацию обработчика. В начале процедуры критически важно установить параметр СтандартнаяОбработка = Ложь. Это предотвратит стандартную попытку платформы открыть окно выбора, которое для строки не определено.

Посмотрим на пример клиентского кода с использованием асинхронного оповещения:


&НаКлиенте
Процедура ПутьКПапкеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    Диалог = Новый ДиалогВыбораФайлов(РежимДиалогаВыбораФайлов.ВыборКаталога);
    Диалог.Заголовок = "Выберите каталог для обработки данных";
    
    Если Не ПустаяСтрока(Объект.ПутьКПапке) Тогда
        Диалог.Каталог = Объект.ПутьКПапке;
    КонецЕсли;
    
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораКаталога", ЭтотОбъект);
    Диалог.Показать(Оповещение);
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораКаталога(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
    
    Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() > 0 Тогда
        Объект.ПутьКПапке = ВыбранныеФайлы[0];
    КонецЕсли;
    
КонецПроцедуры

Если в конфигурации используется современная версия платформы с поддержкой асинхронных функций (конструкция Ждать), код можно записать еще более компактно и линейно:


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

Альтернативный вариант: отдельная кнопка или действие

Если не требуется переопределять стандартный интерфейс поля ввода, можно использовать альтернативные решения:

  1. Кнопка рядом с полем: Добавим на форму команду ВыбратьПапку, разместим ее рядом с полем ввода (в одну группу с горизонтальной группировкой) и перенесем вызов диалога в обработчик команды.
  2. Кнопка открытия каталога: Если путь уже заполнен и требуется открыть саму папку в проводнике операционной системы, используем команду ЗапуститьПриложение(Объект.ПутьКПапке) на клиенте.

Таким образом, для успешного срабатывания выбора достаточно явно включить КнопкуВыбора в свойствах поля и отключить СтандартнуюОбработку в коде клиентской процедуры.

← На главную