При переходе от файловой базы данных к клиент-серверной многие разработчики и системные администраторы сталкиваются с неожиданной проблемой: внешние обработки или встроенный код перестают видеть файлы, расположенные в сетевых папках (шарах). Пользователь, имеющий полные права на чтение файла в операционной системе Windows, получает ошибку доступа в 1С. Разберем эту ситуацию по шагам и выясним причину такого поведения платформы.
В файловом варианте работы вся логика 1С выполняется на компьютере пользователя. Следовательно, когда программа обращается к файлу \\srv\share\file.txt, она делает это от имени текущего пользователя ОС (например, domain\v.pupkin). Если у пользователя есть права на эту сетевую папку, файл успешно открывается.
В клиент-серверной архитектуре ситуация принципиально иная. Существует четкое разделение контекстов выполнения кода:
&НаКлиенте работает на компьютере пользователя от имени его учетной записи Windows.&НаСервере выполняется на сервере 1С. И самое важное: он запускается от имени учетной записи операционной системы, под которой работает служба "Агент сервера 1С:Предприятия". По умолчанию это локальный пользователь USR1CV8.Если разработчик написал чтение файла в серверной процедуре (чтобы оптимизировать код и не гонять данные между клиентом и сервером), сервер 1С попытается открыть этот файл от имени USR1CV8. Естественно, эта локальная учетная запись сервера не имеет никаких прав на сетевые шары в домене Active Directory, и доступ блокируется.
Самый быстрый, но в корне неверный способ "решить" проблему — это создание "костыля". Администраторы иногда создают в домене пользователя с именем USR1CV8 и тем же паролем, либо дают максимальные права серверной учетной записи на все сетевые папки.
Рассмотрим, к чему это приводит: теперь 1С, запущенная от любого пользователя, получает доступ ко всему, к чему имеет доступ серверная учетка. Групповые политики безопасности предприятия становятся бесполезными. Любой сотрудник может попросить программиста написать простую обработку по чтению файлов на сервере и получить доступ к конфиденциальным документам руководства. Это серьезная дыра в безопасности.
Чтобы сохранить логику "кто открыл 1С, от того права и используются", файл необходимо читать на стороне клиента. Клиентская часть 1С, пользуясь правами пользователя домена, считывает данные и передает их на сервер для дальнейшей обработки.
В современных конфигурациях запрещены синхронные методы работы с файлами. Разберем по шагам правильную асинхронную передачу файлов, используя новые возможности платформы 1С (операторы Асинх и Ждать).
&НаКлиенте
Асинх Процедура ЗагрузитьФайлСКлиента()
// 1. Инициализируем диалог выбора файла
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл для загрузки на сервер";
// 2. Асинхронно ждем выбора пользователя
ВыбранныеФайлы = Ждать Диалог.ВыбратьАсинх();
Если ВыбранныеФайлы = Неопределено Тогда
Возврат; // Пользователь отменил выбор
КонецЕсли;
ПутьКФайлу = ВыбранныеФайлы[0];
ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПутьКФайлу);
МассивФайлов = Новый Массив;
МассивФайлов.Добавить(ОписаниеФайла);
// 3. Асинхронно помещаем файл во временное хранилище
ПомещенныеФайлы = Ждать ПоместитьФайлыВоВременноеХранилищеАсинх(МассивФайлов);
// 4. Передаем адрес хранилища на сервер
Если ПомещенныеФайлы.Количество() > 0 Тогда
АдресВХранилище = ПомещенныеФайлы[0].Хранилище;
ОбработатьФайлНаСервере(АдресВХранилище);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбработатьФайлНаСервере(АдресВХранилище)
// 5. Сервер получает двоичные данные файла из временного хранилища
ДанныеФайла = ПолучитьИзВременногоХранилища(АдресВХранилище);
// Здесь происходит парсинг текста, загрузка в справочники или регистры
// Сервер не обращается к сетевым папкам напрямую!
КонецПроцедуры
Проанализируем этот код: мы полностью решили проблему безопасности. Если у пользователя нет прав на файл в ОС Windows, он даже не сможет его выбрать в диалоге на первом этапе. Сервер же получает только байты данных из временного хранилища, не пытаясь авторизоваться в сети.
Иногда бизнес-логика диктует необходимость самостоятельного чтения файлов сервером. Например, есть регламентное фоновое задание (которое работает без клиентского сеанса вообще), и оно должно регулярно забирать выписки из определенной папки банка.
В этом случае избежать выдачи сетевых прав учетной записи сервера невозможно. Однако, чтобы предотвратить неконтролируемый доступ к другим папкам через произвольный код, рассмотрим мощный механизм платформы — Профили безопасности кластера серверов.
С помощью профилей безопасности администратор 1С может настроить жесткие рамки для сервера:
&НаСервере.Если кто-то попытается написать код для чтения файла, путь к которому не разрешен в профиле безопасности, платформа 1С прервет выполнение с ошибкой, даже если у службы ОС хватает прав на чтение.
Для фоновых заданий, требующих сетевого доступа, настроим инфраструктуру по стандартам безопасности. Откажемся от модификации локального USR1CV8 и выполним следующие действия:
DOMAIN\srv_1c).DOMAIN\srv_1c доступ только к тем целевым каталогам обмена, с которыми серверу 1С действительно нужно работать напрямую.Применяя описанные подходы: переписывание обработок на корректную архитектуру клиент-сервер, использование профилей безопасности 1С и настройку выделенной доменной учетки, мы получим стабильную и абсолютно безопасную систему, защищенную от несанкционированного доступа к файлам.