При работе с большим количеством медиафайлов, например, при наполнении карточек товаров или создании объявлений, стандартные средства выбора файлов в 1С могут стать узким местом. Пользователи часто сталкиваются с тем, что при наличии папки с тысячами фотографий системный диалог «забывает» последнее местоположение или заставляет тратить время на повторный поиск нужного кадра. В этой статье мы подробно разберем, как кардинально улучшить пользовательский опыт, внедрив механизм Drag-and-Drop и оптимизировав программное взаимодействие с файловой системой.
Рассмотрим типичную ситуацию: у пользователя есть папка, в которой хранятся 2000 фотографий. Ему необходимо последовательно прикреплять по 3-4 фото к разным объектам в 1С. Проблема заключается в том, что при каждом нажатии кнопки «Добавить» системный диалог может открываться либо в папке «Мои документы», либо в начале текущего списка файлов. Пользователю приходится заново прокручивать огромный список, что ведет к быстрой утомляемости и ошибкам. Проанализируем, как мы можем решить эту задачу с помощью встроенных инструментов платформы 1С.
Самым удобным способом для пользователя является простое перетаскивание файлов из окна проводника Windows непосредственно в форму 1С. По умолчанию 1С просто открывает перетаскиваемый файл для просмотра, что нам не подходит. Чтобы перехватить это действие, нам необходимо поработать с событиями элементов формы.
Важно понимать, что у самой УправляемаяФорма нет событий перетаскивания. Эти события есть у определенных элементов, таких как ТабличнаяЧасть, Список или ПолеHTMLДокумента. Разберем реализацию через табличную часть, где отображается список уже прикрепленных фото.
Выясним причину, по которой перетаскивание не работает сразу: необходимо настроить два события элемента формы — ПроверкаПеретаскивания и Перетаскивание.
В обработчике ПроверкаПеретаскивания мы должны сообщить системе, что наш элемент готов принять данные:
&НаКлиенте
Процедура СписокФотографийПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ИмяПараметра)
СтандартнаяОбработка = Ложь;
// Разрешаем копирование при перетаскивании
ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Копирование;
КонецПроцедуры
Далее, в обработчике Перетаскивание, мы реализуем логику получения путей к файлам. Когда пользователь отпускает кнопку мыши над элементом 1С, в параметре ПараметрыПеретаскивания.Значение передается массив строк с полными путями к файлам.
&НаКлиенте
Процедура СписокФотографийПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ИмяПараметра)
СтандартнаяОбработка = Ложь;
// Проверяем, что нам передали именно файлы (массив строк)
Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда
Для Каждого ПутьКФайлу Из ПараметрыПеретаскивания.Значение Цикл
// Здесь вызываем процедуру загрузки файла в систему
ДобавитьФайлВОбъект(ПутьКФайлу);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Использование этого метода позволяет пользователю держать открытым окно проводника рядом с окном 1С и просто «перебрасывать» нужные изображения, не теряя фокус и позицию в папке.
Если по каким-то причинам Drag-and-Drop использовать невозможно, мы можем программно заставить ДиалогВыбораФайла работать эффективнее. Основная задача — запоминать каталог, в котором пользователь закончил работу в прошлый раз.
Рассмотрим, как реализовать сохранение пути в настройках пользователя. Для этого можно использовать ХранилищеНастроекДанныхФорм или реквизиты объекта.
&НаКлиенте
Процедура ВыбратьФайлы(Команда)
// Инициализируем диалог
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.МножественныйВыбор = Истина;
Диалог.Фильтр = "Изображения (*.jpg;*.png)|*.jpg;*.png";
// Пытаемся получить последний использованный путь из настроек
ПоследнийПуть = ПолучитьПоследнийПутьЗагрузки();
Если НЕ ПустаяСтрока(ПоследнийПуть) Тогда
Диалог.Каталог = ПоследнийПуть;
КонецЕсли;
Если Диалог.Выбрать() Тогда
// Сохраняем новый путь для следующего раза
Файл = Новый Файл(Диалог.ВыбранныеФайлы[0]);
СохранитьПоследнийПутьЗагрузки(Файл.Путь);
ОбработатьВыбранныеФайлы(Диалог.ВыбранныеФайлы);
КонецЕсли;
КонецПроцедуры
Полезный совет: Чтобы пользователю было еще проще, можно реализовать автоматическое переименование или перемещение файлов в подпапку «Обработанные» сразу после их загрузки в 1С. Тогда в основной рабочей папке список файлов будет постоянно сокращаться, и пользователю не придется искать «границу» обработанных данных.
Для максимально комфортной работы мы можем создать собственную форму выбора. Рассмотрим вариант использования Динамического списка, настроенного на чтение файловой системы. Это сложнее в реализации, но дает полный контроль над интерфейсом.
Посмотрим на алгоритм создания такого решения:
ФайловаяСистема или методы работы с файлами для получения списка имен и дат.Картинка и отображается в поле формы.Проанализируем преимущества такого подхода: вы можете помечать файлы цветом (например, серым те, что уже есть в базе), фильтровать их по дате создания прямо в 1С и предоставлять предпросмотр без открытия сторонних приложений.
Еще один современный метод — вставка на форму ПолеHTMLДокумента. Рассмотрим, почему это удобно. С помощью HTML и CSS можно создать визуально привлекательную область с надписью «Перетащите фото сюда». JavaScript внутри этого поля может обрабатывать событие drop и передавать данные обратно в 1С через механизм прием по событию.
Этот метод особенно актуален для веб-клиента, где стандартное взаимодействие с файловой системой Windows ограничено настройками безопасности браузера. В веб-клиенте для работы с файлами рекомендуется использовать расширение работы с файлами, которое гарантирует стабильный доступ к локальным путям.
Если ваши фотографии имеют системные имена (например, IMG_0001.jpg, IMG_0002.jpg), мы можем предложить пользователю кнопку «Загрузить следующие». Программа проанализирует номер последнего загруженного файла, найдет в папке файлы с последующими номерами и предложит их к загрузке автоматически.
Разберем пример логики поиска:
// Логика поиска следующего файла
Функция НайтиСледующиеФайлы(ПоследнийНомер, Каталог)
МассивНовых = Новый Массив;
Для Сч = 1 По 4 Цикл
ТекущийНомер = ПоследнийНомер + Сч;
ИмяФайла = "IMG_" + Формат(ТекущийНомер, "ЧГ=0; ЧВН=") + ".jpg";
ПолныйПуть = Каталог + "\" + ИмяФайла;
ФайлПроверки = Новый Файл(ПолныйПуть);
Если ФайлПроверки.Существует() Тогда
МассивНовых.Добавить(ПолныйПуть);
КонецЕсли;
КонецЦикла;
Возврат МассивНовых;
КонецФункции
Такой подход практически полностью исключает ручной выбор, если процесс фотографирования и загрузки систематизирован.
Мы рассмотрели несколько вариантов оптимизации процесса выбора изображений. Подведем итог: наиболее эффективным техническим решением является комбинация Drag-and-Drop для гибкости и программного запоминания путей для стандартных диалогов. Реализация данных функций требует понимания событий элементов управления и умения работать с объектами Файл и ДиалогВыбораФайла. Внедрение даже одного из этих методов существенно повысит скорость работы пользователя и снизит количество рутинных операций.