В процессе разработки внутренних инструментов в 1С часто возникает задача автоматизации работы с внешними файлами. Типичный сценарий: пользователю необходимо просканировать определенный каталог, увидеть список найденных документов (например, PDF-сканов) непосредственно на форме и иметь возможность открыть любой из них одним кликом. Рассмотрим подробно, как реализовать этот функционал, начиная от поиска файлов и заканчивая настройкой интерфейса для удобной работы.
Для начала разберем механизм получения списка файлов из операционной системы. В платформе 1С для этих целей предусмотрен объект Файлы и метод НайтиФайлы. Проанализируем базовый код, который выполняет поиск по маске.
// Определяем путь к папке и маску поиска (например, все файлы PDF)
ПутьКПапке = "C:\scan";
МаскаПоиска = "*.pdf";
// Получаем массив объектов типа Файл
МассивНайденных = НайтиФайлы(ПутьКПапке, МаскаПоиска);
Для Каждого Файл Из МассивНайденных Цикл
// Здесь Файл.ПолноеИмя содержит абсолютный путь,
// а Файл.Имя — только название файла с расширением
Сообщить("Найден файл: " + Файл.Имя);
КонецЦикла;
Важно помнить, что если ваша база работает в клиент-серверном варианте, поиск файлов на клиенте и на сервере будет происходить в разных контекстах. Если файлы лежат на локальном компьютере пользователя, код должен выполняться на стороне клиента.
Чтобы вывести найденные данные пользователю, нам понадобится элемент интерфейса. Рассмотрим вариант с использованием Таблицы Значений (ТЗ), так как она позволяет хранить не только визуальное имя файла, но и скрытые данные, например, полный путь для открытия.
Выполним следующие шаги в конфигураторе:
ТаблицаЗначений и назовем его СписокФайлов.ИмяФайла (тип Строка) — для отображения пользователю.ПутьКФайлу (тип Строка) — для хранения полного пути (эту колонку можно сделать невидимой).СписокФайлов на форму, чтобы создать элемент управления Таблица.Совет: Чтобы колонка ИмяФайла выглядела как ссылка, в свойствах элемента формы (путь: Элементы -> СписокФайловИмяФайла) установим флажок Гиперссылка.
Теперь объединим поиск и вывод в таблицу. Перед заполнением таблицы крайне важно её очищать, чтобы при повторном нажатии кнопки данные не дублировались. Разберем обновленный алгоритм:
&НаКлиенте
Процедура НайтиИЗаполнитьСписок(Команда)
// Очищаем старые данные из таблицы на форме
Объект.СписокФайлов.Очистить();
МассивНайденных = НайтиФайлы("C:\scan", "*.pdf");
Для Каждого Файл Из МассивНайденных Цикл
НоваяСтрока = Объект.СписокФайлов.Добавить();
НоваяСтрока.ИмяФайла = Файл.Имя;
НоваяСтрока.ПутьКФайлу = Файл.ПолноеИмя;
КонецЦикла;
КонецПроцедуры
В этом примере мы используем Объект.СписокФайлов (если ТЗ является реквизитом объекта) или просто СписокФайлов (если это реквизит формы). Обратите внимание, что обращение к колонкам НоваяСтрока.ИмяФайла должно в точности соответствовать именам, заданным в метаданных формы.
Самый ответственный момент — сделать список интерактивным. Для этого нам нужно перехватить событие Выбор у таблицы на форме. Это событие срабатывает при двойном клике по строке или нажатии клавиши Enter.
Проанализируем процедуру обработки выбора:
&НаКлиенте
Процедура СписокФайловВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Отменяем стандартное поведение платформы (например, открытие карточки)
СтандартнаяОбработка = Ложь;
// Получаем данные текущей строки, на которой стоит курсор
ТекущиеДанные = Элементы.СписокФайлов.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
Путь = ТекущиеДанные.ПутьКФайлу;
// Используем метод для запуска приложения в ОС
Попытка
ЗапуститьПриложение(Путь);
Исключение
Сообщить("Не удалось открыть файл. Возможно, путь некорректен или нет прав: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Выясним причину использования СтандартнаяОбработка = Ложь: это необходимо, чтобы система не пыталась выполнить свои внутренние действия по двойному клику, а передала управление вашему коду.
В актуальных версиях платформы 1С (8.3.18+) и при работе в веб-клиенте рекомендуется использовать асинхронные методы. Это позволяет избежать "замирания" интерфейса и корректно работает в браузерах. Вместо ЗапуститьПриложение рассмотрим использование ЗапуститьПриложениеАсинх.
Пример современного вызова:
// Асинхронный запуск не блокирует работу пользователя
ЗапуститьПриложениеАсинх(Путь);
Также стоит предусмотреть проверку существования файла перед его открытием. Пользователь мог удалить файл в папке "C:\scan" уже после того, как список был сформирован на форме. Для этого используем объект Файл:
ПроверкаФайла = Новый Файл(Путь);
Если ПроверкаФайла.Существует() Тогда
ЗапуститьПриложение(Путь);
Иначе
ПоказатьПредупреждение(, "Файл больше не существует по указанному пути!");
КонецЕсли;
Мы рассмотрели полный цикл создания интерактивного реестра файлов. Подведем итоги:
НайтиФайлы, которая возвращает массив объектов с метаданными файлов.Гиперссылка у колонки таблицы делает список визуально понятным для пользователя.Выбор элемента формы "Таблица".ЗапуститьПриложение в блок Попытка...Исключение, так как права доступа к сетевым папкам или отсутствие нужной программы в Windows могут вызвать ошибку.Используя данный подход, вы сможете создавать удобные "пульты управления" документами, интегрируя внешние хранилища файлов непосредственно в интерфейс 1С.