Как организовать удобный выбор и загрузку изображений в 1С:Предприятие

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

При работе с большим количеством медиафайлов, например, при наполнении карточек товаров или создании объявлений, стандартные средства выбора файлов в 1С могут стать узким местом. Пользователи часто сталкиваются с тем, что при наличии папки с тысячами фотографий системный диалог «забывает» последнее местоположение или заставляет тратить время на повторный поиск нужного кадра. В этой статье мы подробно разберем, как кардинально улучшить пользовательский опыт, внедрив механизм Drag-and-Drop и оптимизировав программное взаимодействие с файловой системой.

Проблема стандартного выбора файлов

Рассмотрим типичную ситуацию: у пользователя есть папка, в которой хранятся 2000 фотографий. Ему необходимо последовательно прикреплять по 3-4 фото к разным объектам в 1С. Проблема заключается в том, что при каждом нажатии кнопки «Добавить» системный диалог может открываться либо в папке «Мои документы», либо в начале текущего списка файлов. Пользователю приходится заново прокручивать огромный список, что ведет к быстрой утомляемости и ошибкам. Проанализируем, как мы можем решить эту задачу с помощью встроенных инструментов платформы 1С.

Реализация механизма Drag-and-Drop в управляемых формах

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

Важно понимать, что у самой УправляемаяФорма нет событий перетаскивания. Эти события есть у определенных элементов, таких как ТабличнаяЧасть, Список или ПолеHTMLДокумента. Разберем реализацию через табличную часть, где отображается список уже прикрепленных фото.

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

В обработчике ПроверкаПеретаскивания мы должны сообщить системе, что наш элемент готов принять данные:


&НаКлиенте
Процедура СписокФотографийПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, ИмяПараметра)
    СтандартнаяОбработка = Ложь;
    // Разрешаем копирование при перетаскивании
    ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Копирование;
КонецПроцедуры

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


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

Использование этого метода позволяет пользователю держать открытым окно проводника рядом с окном 1С и просто «перебрасывать» нужные изображения, не теряя фокус и позицию в папке.

Оптимизация стандартного диалога выбора файлов

Если по каким-то причинам Drag-and-Drop использовать невозможно, мы можем программно заставить ДиалогВыбораФайла работать эффективнее. Основная задача — запоминать каталог, в котором пользователь закончил работу в прошлый раз.

Рассмотрим, как реализовать сохранение пути в настройках пользователя. Для этого можно использовать ХранилищеНастроекДанныхФорм или реквизиты объекта.


&НаКлиенте
Процедура ВыбратьФайлы(Команда)
    // Инициализируем диалог
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.МножественныйВыбор = Истина;
    Диалог.Фильтр = "Изображения (*.jpg;*.png)|*.jpg;*.png";
    
    // Пытаемся получить последний использованный путь из настроек
    ПоследнийПуть = ПолучитьПоследнийПутьЗагрузки(); 
    Если НЕ ПустаяСтрока(ПоследнийПуть) Тогда
        Диалог.Каталог = ПоследнийПуть;
    КонецЕсли;
    
    Если Диалог.Выбрать() Тогда
        // Сохраняем новый путь для следующего раза
        Файл = Новый Файл(Диалог.ВыбранныеФайлы[0]);
        СохранитьПоследнийПутьЗагрузки(Файл.Путь);
        
        ОбработатьВыбранныеФайлы(Диалог.ВыбранныеФайлы);
    КонецЕсли;
КонецПроцедуры

Полезный совет: Чтобы пользователю было еще проще, можно реализовать автоматическое переименование или перемещение файлов в подпапку «Обработанные» сразу после их загрузки в 1С. Тогда в основной рабочей папке список файлов будет постоянно сокращаться, и пользователю не придется искать «границу» обработанных данных.

Создание внутреннего «Проводника» на форме 1С

Для максимально комфортной работы мы можем создать собственную форму выбора. Рассмотрим вариант использования Динамического списка, настроенного на чтение файловой системы. Это сложнее в реализации, но дает полный контроль над интерфейсом.

Посмотрим на алгоритм создания такого решения:

  1. Создаем на форме таблицу, данные которой заполняются программно списком файлов из целевого каталога.
  2. Используем объект ФайловаяСистема или методы работы с файлами для получения списка имен и дат.
  3. В колонке таблицы можно выводить миниатюру изображения. Для этого при выборе файла в списке картинка временно загружается в объект Картинка и отображается в поле формы.
  4. Добавляем флажки (чекбоксы) для массового выбора файлов прямо в списке.

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

Использование Поля HTML-документа как продвинутой зоны загрузки

Еще один современный метод — вставка на форму ПолеHTMLДокумента. Рассмотрим, почему это удобно. С помощью HTML и CSS можно создать визуально привлекательную область с надписью «Перетащите фото сюда». JavaScript внутри этого поля может обрабатывать событие drop и передавать данные обратно в 1С через механизм прием по событию.

Этот метод особенно актуален для веб-клиента, где стандартное взаимодействие с файловой системой Windows ограничено настройками безопасности браузера. В веб-клиенте для работы с файлами рекомендуется использовать расширение работы с файлами, которое гарантирует стабильный доступ к локальным путям.

Автоматизация загрузки по шаблону

Если ваши фотографии имеют системные имена (например, IMG_0001.jpg, IMG_0002.jpg), мы можем предложить пользователю кнопку «Загрузить следующие». Программа проанализирует номер последнего загруженного файла, найдет в папке файлы с последующими номерами и предложит их к загрузке автоматически.

Разберем пример логики поиска:


// Логика поиска следующего файла
Функция НайтиСледующиеФайлы(ПоследнийНомер, Каталог)
    МассивНовых = Новый Массив;
    Для Сч = 1 По 4 Цикл
        ТекущийНомер = ПоследнийНомер + Сч;
        ИмяФайла = "IMG_" + Формат(ТекущийНомер, "ЧГ=0; ЧВН=") + ".jpg";
        ПолныйПуть = Каталог + "\" + ИмяФайла;
        
        ФайлПроверки = Новый Файл(ПолныйПуть);
        Если ФайлПроверки.Существует() Тогда
            МассивНовых.Добавить(ПолныйПуть);
        КонецЕсли;
    КонецЦикла;
    Возврат МассивНовых;
КонецФункции

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

Заключение

Мы рассмотрели несколько вариантов оптимизации процесса выбора изображений. Подведем итог: наиболее эффективным техническим решением является комбинация Drag-and-Drop для гибкости и программного запоминания путей для стандартных диалогов. Реализация данных функций требует понимания событий элементов управления и умения работать с объектами Файл и ДиалогВыбораФайла. Внедрение даже одного из этих методов существенно повысит скорость работы пользователя и снизит количество рутинных операций.

← На главную