Как правильно настроить доступ к сетевым файлам в клиент-серверном варианте 1С?

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

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

Проанализируем архитектурную разницу: почему пропадает доступ к файлам

В файловом варианте работы вся логика 1С выполняется на компьютере пользователя. Следовательно, когда программа обращается к файлу \\srv\share\file.txt, она делает это от имени текущего пользователя ОС (например, domain\v.pupkin). Если у пользователя есть права на эту сетевую папку, файл успешно открывается.

В клиент-серверной архитектуре ситуация принципиально иная. Существует четкое разделение контекстов выполнения кода:

  1. Контекст &НаКлиенте работает на компьютере пользователя от имени его учетной записи Windows.
  2. Контекст &НаСервере выполняется на сервере 1С. И самое важное: он запускается от имени учетной записи операционной системы, под которой работает служба "Агент сервера 1С:Предприятия". По умолчанию это локальный пользователь USR1CV8.

Если разработчик написал чтение файла в серверной процедуре (чтобы оптимизировать код и не гонять данные между клиентом и сервером), сервер 1С попытается открыть этот файл от имени USR1CV8. Естественно, эта локальная учетная запись сервера не имеет никаких прав на сетевые шары в домене Active Directory, и доступ блокируется.

Посмотрим на частые ошибки администраторов

Самый быстрый, но в корне неверный способ "решить" проблему — это создание "костыля". Администраторы иногда создают в домене пользователя с именем USR1CV8 и тем же паролем, либо дают максимальные права серверной учетной записи на все сетевые папки.

Рассмотрим, к чему это приводит: теперь 1С, запущенная от любого пользователя, получает доступ ко всему, к чему имеет доступ серверная учетка. Групповые политики безопасности предприятия становятся бесполезными. Любой сотрудник может попросить программиста написать простую обработку по чтению файлов на сервере и получить доступ к конфиденциальным документам руководства. Это серьезная дыра в безопасности.

Рассмотрим правильный подход: передача файлов с клиента на сервер

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

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


&НаКлиенте
Асинх Процедура ЗагрузитьФайлСКлиента()
    // 1. Инициализируем диалог выбора файла
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберите файл для загрузки на сервер";
    
    // 2. Асинхронно ждем выбора пользователя
    ВыбранныеФайлы = Ждать Диалог.ВыбратьАсинх();
    Если ВыбранныеФайлы = Неопределено Тогда
        Возврат; // Пользователь отменил выбор
    КонецЕсли;
    
    ПутьКФайлу = ВыбранныеФайлы[0];
    ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПутьКФайлу);
    
    МассивФайлов = Новый Массив;
    МассивФайлов.Добавить(ОписаниеФайла);
    
    // 3. Асинхронно помещаем файл во временное хранилище
    ПомещенныеФайлы = Ждать ПоместитьФайлыВоВременноеХранилищеАсинх(МассивФайлов);
    
    // 4. Передаем адрес хранилища на сервер
    Если ПомещенныеФайлы.Количество() > 0 Тогда
        АдресВХранилище = ПомещенныеФайлы[0].Хранилище;
        ОбработатьФайлНаСервере(АдресВХранилище);
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ОбработатьФайлНаСервере(АдресВХранилище)
    // 5. Сервер получает двоичные данные файла из временного хранилища
    ДанныеФайла = ПолучитьИзВременногоХранилища(АдресВХранилище);
    
    // Здесь происходит парсинг текста, загрузка в справочники или регистры
    // Сервер не обращается к сетевым папкам напрямую!
КонецПроцедуры

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

Проанализируем настройку профилей безопасности кластера 1С

Иногда бизнес-логика диктует необходимость самостоятельного чтения файлов сервером. Например, есть регламентное фоновое задание (которое работает без клиентского сеанса вообще), и оно должно регулярно забирать выписки из определенной папки банка.

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

С помощью профилей безопасности администратор 1С может настроить жесткие рамки для сервера:

  1. Явно указать каталоги виртуальной файловой системы и сетевые адреса, к которым разрешен доступ из конкретной информационной базы.
  2. Заблокировать запуск внешних отчетов и обработок, чтобы пользователи не могли выполнять непроверенный код &НаСервере.
  3. Ограничить использование COM-объектов и внешних приложений ОС.

Если кто-то попытается написать код для чтения файла, путь к которому не разрешен в профиле безопасности, платформа 1С прервет выполнение с ошибкой, даже если у службы ОС хватает прав на чтение.

Настроим сервисную учетную запись Active Directory правильно

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

  1. Создадим отдельную доменную сервисную учетную запись специально для службы 1С (например, DOMAIN\srv_1c).
  2. Назначим эту учетную запись для запуска службы "Агент сервера 1С:Предприятия" в оснастке служб Windows (Services.msc).
  3. Выдадим пользователю DOMAIN\srv_1c доступ только к тем целевым каталогам обмена, с которыми серверу 1С действительно нужно работать напрямую.
  4. Убедимся, что у этой учетной записи нет доступа к личным папкам сотрудников или важным системным директориям.

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

← На главную