Рассмотрим ситуацию, с которой часто сталкиваются администраторы и разработчики: имеется хранилище файлов (например, фотографий) в отдельной папке Windows на терминальном сервере. В целях безопасности (чтобы пользователи случайно не удалили весь архив, как это бывает на практике), права на эту директорию урезаются. Мы оставляем пользователям только право на чтение. Однако файлы в эту папку должна добавлять программа 1С. Проблема заключается в том, что в контексте файловой базы данных и терминального режима код 1С выполняется под правами текущего пользователя Windows, у которого нет прав на запись. Стандартный метод КопироватьФайл не имеет параметров для передачи логина и пароля администратора или служебного пользователя.
Проанализируем доступные варианты обхода этого ограничения. Мы разберем как методы, предложенные специалистами, так и надежные административные инструменты.
Если мы не можем писать напрямую в целевую папку, разберем подход с использованием промежуточного буфера. Создаем временную директорию, на которую у пользователей есть права записи, и настраиваем перенос файлов из неё в защищенное хранилище.
Этот подход надежен, так как пользователи физически не имеют доступа к финальному хранилищу, а логика копирования вынесена на уровень операционной системы.
Рассмотрим программный метод, который позволяет временно повысить привилегии для конкретного скрипта внутри 1С. Суть метода заключается в том, чтобы расшарить целевую папку (сделать её сетевой, даже скрытой) и подключать её в 1С как сетевой диск под служебной учетной записью.
Для реализации этого метода мы задействуем COM-объект Windows. Разберем примерный алгоритм действий в коде:
// Создаем COM-объект для работы с сетью
ОбъектСеть = Новый COMОбъект("WScript.Network");
Попытка
// Подключаем скрытую сетевую шару как диск W, передаем логин и пароль служебного пользователя
ОбъектСеть.MapNetworkDrive("W:", "\\localhost\Photos$", Ложь, "ИмяСлужебногоПользователя", "ПарольПользователя");
// Копируем файл стандартными средствами 1С
КопироватьФайл(ПутьИсточник, "W:\ИмяФайла.jpg");
// Отключаем диск после завершения операции
ОбъектСеть.RemoveNetworkDrive("W:", Истина, Истина);
Исключение
Сообщить("Ошибка при копировании файла: " + ОписаниеОшибки());
ОбъектСеть.RemoveNetworkDrive("W:", Истина, Истина);
КонецПопытки;
Важно: При таком подходе пароль учетной записи хранится в коде или базе данных. Обязательно используйте шифрование или безопасное хранилище констант для пароля служебного пользователя.
Посмотрим на современный архитектурный подход. Мы можем поднять на терминальном сервере небольшой локальный веб-сервис (например, через IIS, Node.js или компоненты самой 1С, если серверная лицензия появится позже).
HTTPСоединение.Этот способ полностью изолирует 1С от файловой системы Windows. Права пользователей Windows больше не пересекаются с правами на хранилище фотографий.
Выясним, как использовать встроенный в 1С протокол FTP для нашей задачи. Аналогично HTTP-сервису, мы можем запустить службу FTP-сервера прямо на сервере терминалов (встроенную службу IIS или FileZilla Server).
Целевая папка хранилища назначается домашней директорией FTP. В коде 1С мы используем объект FTPСоединение для подключения к локальному хосту под специальным логином и паролем, настроенным исключительно в FTP-сервере. Метод Записать перенесет файл. Плюс этого решения в том, что системные учетные записи пользователей остаются неизменными, а безопасность файлов гарантируется на 100%.
Если мы не хотим настраивать службы, рассмотрим использование консольных утилит. Стандартная команда runas требует интерактивного ввода пароля, поэтому напрямую из 1С её вызвать сложно. Но мы можем использовать утилиту PsExec из пакета Sysinternals или аналоги вроде RunAsSpc.
Мы формируем строку команды через КомандаСистемы или ЗапуститьПриложение, передавая параметры логина и пароля утилите PsExec, которая, в свою очередь, выполнит копирование файла cmd /c copy от лица наделенного правами пользователя.
Каждый из рассмотренных способов решает проблему невозможности прямой передачи авторизации в 1С. Выбор конкретного инструмента зависит от текущей инфраструктуры: для быстрой настройки подойдет подключение сетевого диска через COM, а для максимальной безопасности и задела на будущее — локальный веб-сервис или FTP.