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

Программист IT и автоматизация бизнеса
← На главную

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

Проанализируем доступные варианты обхода этого ограничения. Мы разберем как методы, предложенные специалистами, так и надежные административные инструменты.

Способ 1: Использование временной папки и Планировщика задач (или скриптов)

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

  1. В коде 1С мы сохраняем файл во временную транзитную папку.
  2. Настраиваем в Windows стороннюю программу, службу или Планировщик задач, который будет работать от имени служебного пользователя (с правами на запись в основную папку хранилища).
  3. Служба периодически проверяет временную папку или срабатывает по триггеру (например, WMI-подписка на появление нового файла), забирает файл и перемещает его в защищенную директорию.

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

Способ 2: Динамическое подключение сетевого диска (COM-объект WScript.Network)

Рассмотрим программный метод, который позволяет временно повысить привилегии для конкретного скрипта внутри 1С. Суть метода заключается в том, чтобы расшарить целевую папку (сделать её сетевой, даже скрытой) и подключать её в 1С как сетевой диск под служебной учетной записью.

Для реализации этого метода мы задействуем COM-объект Windows. Разберем примерный алгоритм действий в коде:


// Создаем COM-объект для работы с сетью
ОбъектСеть = Новый COMОбъект("WScript.Network");

Попытка
    // Подключаем скрытую сетевую шару как диск W, передаем логин и пароль служебного пользователя
    ОбъектСеть.MapNetworkDrive("W:", "\\localhost\Photos$", Ложь, "ИмяСлужебногоПользователя", "ПарольПользователя");
    
    // Копируем файл стандартными средствами 1С
    КопироватьФайл(ПутьИсточник, "W:\ИмяФайла.jpg");
    
    // Отключаем диск после завершения операции
    ОбъектСеть.RemoveNetworkDrive("W:", Истина, Истина);
Исключение
    Сообщить("Ошибка при копировании файла: " + ОписаниеОшибки());
    ОбъектСеть.RemoveNetworkDrive("W:", Истина, Истина);
КонецПопытки;

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

Способ 3: Использование локального веб-сервиса (HTTP-сервис)

Посмотрим на современный архитектурный подход. Мы можем поднять на терминальном сервере небольшой локальный веб-сервис (например, через IIS, Node.js или компоненты самой 1С, если серверная лицензия появится позже).

  1. Служба веб-сервера работает от имени системной учетной записи, обладающей полными правами на целевую папку.
  2. В конфигурации 1С мы формируем POST-запрос с использованием объекта HTTPСоединение.
  3. 1С отправляет файл в виде двоичных данных на локальный адрес (например, http://localhost:8080/upload).
  4. Веб-сервис принимает данные и сохраняет их в нужную директорию.

Этот способ полностью изолирует 1С от файловой системы Windows. Права пользователей Windows больше не пересекаются с правами на хранилище фотографий.

Способ 4: FTP-сервер на локальной машине

Выясним, как использовать встроенный в 1С протокол FTP для нашей задачи. Аналогично HTTP-сервису, мы можем запустить службу FTP-сервера прямо на сервере терминалов (встроенную службу IIS или FileZilla Server).

Целевая папка хранилища назначается домашней директорией FTP. В коде 1С мы используем объект FTPСоединение для подключения к локальному хосту под специальным логином и паролем, настроенным исключительно в FTP-сервере. Метод Записать перенесет файл. Плюс этого решения в том, что системные учетные записи пользователей остаются неизменными, а безопасность файлов гарантируется на 100%.

Способ 5: Запуск утилит копирования от другого имени

Если мы не хотим настраивать службы, рассмотрим использование консольных утилит. Стандартная команда runas требует интерактивного ввода пароля, поэтому напрямую из 1С её вызвать сложно. Но мы можем использовать утилиту PsExec из пакета Sysinternals или аналоги вроде RunAsSpc.

Мы формируем строку команды через КомандаСистемы или ЗапуститьПриложение, передавая параметры логина и пароля утилите PsExec, которая, в свою очередь, выполнит копирование файла cmd /c copy от лица наделенного правами пользователя.

Каждый из рассмотренных способов решает проблему невозможности прямой передачи авторизации в 1С. Выбор конкретного инструмента зависит от текущей инфраструктуры: для быстрой настройки подойдет подключение сетевого диска через COM, а для максимальной безопасности и задела на будущее — локальный веб-сервис или FTP.

← На главную