В процессе автоматизации документооборота или ведения библиотек разработок часто возникает необходимость массовой загрузки файлов в информационную базу. Типичный сценарий: у вас есть реестр в Excel, где указаны названия, описания и полные пути к файлам на диске (например, внешним обработкам .epf). Стандартные методы, такие как ПоместитьФайл, часто инициируют открытие диалогового окна выбора файла, что делает невозможной автоматическую загрузку сотен позиций без участия пользователя.
В этой статье мы подробно разберем, как реализовать программную загрузку файлов по прямому пути, проанализируем типичные ошибки при импорте строк из Excel и выясним, как правильно организовать работу в контексте "Клиент-Сервер".
Основным инструментом для решения нашей задачи является объект ДвоичныеДанные. В отличие от интерактивных методов, он позволяет прочитать файл с диска напрямую, если у системы достаточно прав доступа. Рассмотрим алгоритм действий: мы получаем путь из Excel, считываем файл в память и сохраняем его в реквизит справочника с типом ХранилищеЗначения.
Проанализируем пример кода, который выполняет эту операцию:
// Предположим, переменная ПутьКФайлу получена из ячейки Excel
Попытка
ДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
// Создаем или находим элемент справочника, где будет храниться файл
НовыйОбъект = Справочники.ВнешниеОбработки.СоздатьЭлемент();
НовыйОбъект.Наименование = "Загруженная обработка";
// Помещаем данные в хранилище значений
НовыйОбъект.ХранилищеФайла = Новый ХранилищеЗначения(ДанныеФайла, Новый СжатиеДанных(9));
НовыйОбъект.Записать();
Исключение
Сообщить("Не удалось прочитать файл по пути: " + ПутьКФайлу + ". Ошибка: " + ОписаниеОшибки());
КонецПопытки;
Использование метода Новый ДвоичныеДанные(Путь) — это самый быстрый способ "поднять" файл в систему без лишних вопросов к пользователю. Однако здесь кроется важный нюанс: где именно выполняется этот код — на клиенте или на сервере?
Разберем ситуацию, которая часто ставит разработчиков в тупик. Если процедура выполняется под директивой &НаСервере, то сервер 1С пытается найти файл на своих локальных дисках. Если путь в Excel указан как C:\MyFiles\Report.epf, а код запущен на сервере, 1С будет искать папку MyFiles на жестком диске сервера, а не на компьютере пользователя. Это неминуемо приведет к ошибке "Файл не найден".
Выясним, как правильно организовать доступ:
\\ServerName\SharedFolder\file.epf. При этом у учетной записи, под которой запущен "Агент сервера 1С:Предприятие", должны быть права на чтение этой сетевой папки.ПоместитьФайлНаСервер() на стороне клиента, чтобы передать данные во временное хранилище, а затем уже на сервере извлечь их оттуда. Но так как наша задача — полная автоматизация без диалогов, сетевые пути являются приоритетным решением.Рассмотрим ситуацию, когда путь к файлу кажется абсолютно верным, файл существует, но 1С упорно выдает ошибку. Часто это связано с тем, как Excel хранит текстовые данные. При чтении ячейки в строку могут попасть скрытые символы форматирования.
Проанализируем основные причины возникновения ошибок в путях:
Символы.ПС (перевод строки) или Символы.ВК (возврат каретки).Для решения этой проблемы мы рекомендуем всегда "очищать" путь перед использованием. Посмотрим на функцию очистки:
Функция ОчиститьПутьКФайлу(Знач ИсходныйПуть)
// Удаляем крайние пробелы
Результат = СокрЛП(ИсходныйПуть);
// Заменяем неразрывные пробелы (код 160) на обычные
Результат = СтрЗаменить(Результат, Символ(160), " ");
// Удаляем символы переноса строк
Результат = СтрЗаменить(Результат, Символы.ПС, "");
Результат = СтрЗаменить(Результат, Символы.ВК, "");
Возврат Результат;
КонецФункции
Именно из-за этих символов возникает эффект, когда "через копирование в Word и обратно всё работает" — Word часто автоматически нормализует текст, удаляя специфичное форматирование Excel.
Если ваша конфигурация использует БСП, задача значительно упрощается. В подсистеме "Работа с файлами" уже реализованы механизмы хранения версий, привязки к владельцам и работы с томами на диске. Вместо ручного создания элементов справочника, мы можем использовать программный интерфейс БСП.
Разберем пример добавления файла через БСП:
// Путь к файлу уже должен быть доступен серверу
ПараметрыФайла = РаботаСФайлами.ПараметрыДобавленияФайла();
ПараметрыФайла.Автор = Пользователи.ТекущийПользователь();
ПараметрыФайла.Наименование = "ВнешняяОбработка_Версия1";
// Добавляем файл к объекту-владельцу (например, справочник Обработки)
Результат = РаботаСФайлами.ДобавитьФайл(ВладелецФайла, ПутьКФайлу, , ПараметрыФайла);
Метод РаботаСФайлами.ДобавитьФайл самостоятельно создаст запись в справочнике Файлы, создаст новую версию и, если настроено хранение в томах, перенесет файл в соответствующую папку на сервере. Это избавляет разработчика от необходимости прописывать логику хранения двоичных данных вручную.
Поскольку автор исходного вопроса загружает именно файлы обработок, стоит упомянуть о проверке целостности данных. Перед тем как записывать ДвоичныеДанные в базу, полезно убедиться, что файл действительно является внешней обработкой 1С.
Для этого можно использовать метод ВнешниеОбработки.ПолучитьСтруктуруРегистрации(). Если метод возвращает структуру, значит файл валиден. Проанализируем пример проверки:
Попытка
СтруктураРегистрации = ВнешниеОбработки.ПолучитьСтруктуруРегистрации(ПутьКФайлу);
// Если код прошел дальше, файл корректен
Исключение
Сообщить("Файл по адресу " + ПутьКФайлу + " не является корректной обработкой 1С!");
КонецПопытки;
Это позволит отсеять поврежденные файлы или ошибочно указанные пути к документам другого формата еще на этапе импорта из Excel.
Подведем итог нашему исследованию. Программная загрузка файлов по пути — задача вполне выполнимая и надежная, если соблюдать несколько правил. Во-первых, всегда используйте ДвоичныеДанные для чтения без диалогов. Во-вторых, тщательно очищайте строки, полученные из Excel, от спецсимволов. В-третьих, четко контролируйте права доступа сервера 1С к файловым ресурсам. Сочетание этих подходов позволит вам создать надежный механизм автоматизации, который сэкономит массу времени пользователям системы.