Как записать путь к каталогу в строку табличной части на управляемой форме в 1С?

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

При разработке функционала на управляемых формах 1С часто возникает задача предоставить пользователю возможность выбрать каталог на диске и сохранить путь к нему в реквизит строки табличной части. Начинающие разработчики нередко сталкиваются с ситуацией, когда диалог выбора папки открывается успешно, но попытка записать выбранное значение напрямую в свойства визуального элемента (например, через Элемент.ВыделенныйТекст) не приводит к сохранению данных.

В этой статье мы подробно разберем, почему возникает такая ошибка, как устроена работа с данными табличных частей на управляемых формах и как правильно организовать выбор папки с учетом современных стандартов платформы 1С:Предприятие.

Причина проблемы: разделение элементов формы и данных

Проанализируем типичную ошибку. В коде обработчика события НачалоВыбора разработчик пытается присвоить значение напрямую переданному в процедуру параметру Элемент:


&НаКлиенте
Процедура ОборудованиеПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
    Если Диалог.Выбрать() Тогда
        Элемент.ВыделенныйТекст = Диалог.Каталог; // Ошибка: элемент формы не хранит данные
    КонецЕсли;
КонецПроцедуры

В управляемом интерфейсе 1С действует строгое разделение между визуальными элементами формы и источниками данных (реквизитами формы или объекта). Элемент управления — это лишь способ отображения данных на экране. Попытка записать путь в свойства элемента не изменяет сам реквизит в базе данных или в памяти объекта.

Чтобы данные сохранились, их необходимо записывать напрямую в реквизит текущей выбранной строки табличной части через свойство ТекущиеДанные.

Базовое решение: использование свойства ТекущиеДанные

Рассмотрим, как правильно получить доступ к текущей строке таблицы. У элемента формы, представляющего таблицу (например, Оборудование), есть коллекция ТекущиеДанные. Через нее можно напрямую обратиться к любому реквизиту строки текущей позиции курсора.

Кроме того, в обработчике события НачалоВыбора крайне важно установить СтандартнаяОбработка = Ложь;, чтобы отключить платформенный механизм выбора значения по умолчанию.

Разберем готовый пример кода:


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

Современный асинхронный подход (для конфигураций без модальности)

Посмотрим на важную особенность: синхронный метод Диалог.Выбрать() вызывает ошибку в конфигурациях, где в свойствах установлен режим запрета модальных окон или синхронных вызовов расширений платформы. Для обеспечения полной совместимости рекомендуется использовать асинхронный вызов.

Вариант 1: Использование асинхронных функций с оператором Ждать

Если версия платформы поддерживает ключевое слово Ждать, код выглядит максимально лаконично и понятно:


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

Вариант 2: Использование метода Показать и ОписанияОповещения

Для более ранних версий платформы без оператора Асинх/Ждать разберем реализацию через отдельную процедуру обратного вызова:


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

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

Полезные рекомендации при работе с сетевыми каталогами

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

  1. Сетевая доступность путей: если пользователи работают в клиент-серверной базе с разных рабочих мест, локальный путь вида C:\Папка будет доступен только автору записи. Для многопользовательской работы необходимо выбирать сетевые папки в формате UNC (например, \\server\share\folder).
  2. Открытие папки по клику: чтобы пользователь мог открыть сохраненную папку прямо из формы, установите для поля свойство Гиперссылка = Истина и добавьте обработчик события Нажатие:
    
    &НаКлиенте
    Процедура ОборудованиеПутьККаталогуНажатие(Элемент, СтандартнаяОбработка)
        СтандартнаяОбработка = Ложь;
        СтрокаТаблицы = Элементы.Оборудование.ТекущиеДанные;
        Если СтрокаТаблицы <> Неопределено И Не ПустаяСтрока(СтрокаТаблицы.ПутьККаталогу) Тогда
            ЗапуститьПриложение(СтрокаТаблицы.ПутьККаталогу);
        КонецЕсли;
    КонецПроцедуры
    
  3. Использование функций БСП: если в вашей конфигурации используется Библиотека стандартных подсистем (например, в УТ или CRM), для открытия каталогов в проводнике операционной системы лучше использовать типовой вызов ФайловаяСистемаКлиент.ОткрытьПроводник(ПутьККаталогу).
← На главную