При работе с внешними компонентами и подключаемыми модулями (например, модулем 1С:Диадок) пользователи часто сталкиваются с ошибкой «Файл не обнаружен». Ситуация выглядит парадоксально: файл физически существует на диске, у пользователя в системе 1С назначены «Полные права», а в операционной системе он является администратором. Однако программа настойчиво выдает ошибку при попытке обращения к внешнему объекту. Давайте подробно разберем, почему это происходит, как устроена работа с файлами в клиент-серверной архитектуре и какими способами можно решить эту задачу.
Первым делом проанализируем ситуацию, описанную в логах ошибки. Если мы видим путь вида C:\Users\ИмяПользователя\Documents\... и при этом база работает в клиент-серверном режиме, это главный индикатор проблемы. В 1С код может выполняться либо на стороне клиента (на компьютере пользователя), либо на стороне сервера (на мощном компьютере, где установлен сервер приложений 1С).
Разберем по шагам, что происходит в момент вызова внешнего модуля:
Файл не обнаружен.Важно понимать: для сервера 1С ваши локальные диски и рабочие столы невидимы. Даже если вы дадите пользователю 1С права Интерактивное открытие внешних отчетов и обработок, это позволит ему выбирать файлы через диалоговое окно, но не даст серверу магической способности «видеть» файлы на другом конце сети.
Если мы все же решили хранить файл на диске сервера или в сетевой папке, нам необходимо разобраться с правами доступа на уровне операционной системы. Проанализируем, под чьим именем работает сервер 1С. Обычно это специальная техническая учетная запись, создаваемая при установке платформы, — USR1CV8.
Рассмотрим алгоритм настройки прав для этой учетной записи:
1C:Enterprise 8.3 Server Agent. В колонке «Вход от имени» будет указан пользователь.USR1CV8 (или того, которого мы нашли на шаге 1) и предоставим ему права «Чтение» и «Выполнение».Внимание: если файл лежит в профиле пользователя (папка Users), операционная система может блокировать доступ к нему даже при наличии прямых разрешений из соображений безопасности. Рекомендуем выносить такие файлы в корень диска или специализированные директории, например C:\1C_Modules\.
Часто программисты пытаются использовать сетевые диски, например Z:\Modules\Module.epf. Проанализируем, почему это плохая практика для сервера. Сетевые диски — это «виртуальные» сущности, которые существуют только внутри сессии конкретного пользователя. Когда служба сервера 1С (работающая в своей изолированной сессии) пытается обратиться к диску Z:, она его просто не находит.
Для решения этой проблемы мы должны использовать только полные UNC-пути. Рассмотрим пример трансформации пути:
Вместо: Z:\Diadoc\PM_Diadoc.epf
Используем: \\FileServer\Public\Diadoc\PM_Diadoc.epf
При этом учетная запись, под которой запущен сервер 1С, должна иметь права доступа к этой сетевой «шаре» и на уровне файловой системы удаленного сервера.
Начиная с версии платформы 8.3.9, в 1С реализован механизм «Защита от опасных действий». Даже если все права на уровне ОС настроены верно, 1С может блокировать подключение внешнего модуля .epf, считая его потенциально опасным. Выясним, как это обойти.
Для конкретного пользователя в базе 1С можно отключить это подтверждение. Рассмотрим действия в конфигураторе:
Защита от опасных действий.Если модулей много и пользователей тоже, проанализируем возможность массового отключения через файл conf.cfg, добавив параметр DisableUnsafeActionProtection. Однако помните, что это снижает общую безопасность системы.
Чтобы не зависеть от настроек прав на сервере и путей к дискам, профессиональное решение заключается в передаче файла с клиента на сервер через Временное хранилище. Посмотрим, как это выглядит в программном коде.
Сначала на клиенте мы выбираем файл и помещаем его в хранилище:
&НаКлиенте
Процедура ПодключитьМодуль()
ПараметрыВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ПараметрыВыбора.Фильтр = "Внешняя обработка (*.epf)|*.epf";
Если ПараметрыВыбора.Выбрать() Тогда
ПутьКФайлу = ПараметрыВыбора.ПолноеИмяФайла;
// Помещаем файл во временное хранилище
АдресФайла = "";
ПоместитьФайл(АдресФайла, ПутьКФайлу, , Ложь, УникальныйИдентификатор);
// Передаем адрес на сервер для подключения
ПодключитьМодульНаСервере(АдресФайла);
КонецЕсли;
КонецПроцедуры
Затем на сервере мы можем использовать полученные двоичные данные. Проанализируем серверную часть:
&НаСервере
Процедура ПодключитьМодульНаСервере(АдресФайла)
ДанныеФайла = ПолучитьИзВременногоХранилища(АдресФайла);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("epf");
// Записываем данные в каталог, к которому у сервера точно есть доступ
ДанныеФайла.Записать(ИмяВременногоФайла);
// Теперь подключаем как внешнюю обработку
ВнешнийМодуль = ВнешниеОбработки.Подключить(ИмяВременногоФайла, , Ложь);
// Дальнейшая логика работы...
КонецПроцедуры
Самый стабильный и рекомендуемый способ для конфигураций на базе БСП (например, УТ 11.4, ERP, КА) — это добавление внешнего модуля в справочник Дополнительные отчеты и обработки. Рассмотрим преимущества этого метода:
Если модуль 1С:Диадок предполагает использование ПМ (подключаемого модуля) как внешнего файла, попробуйте загрузить его именно в этот справочник. Это исключит 99% проблем, связанных с правами доступа к внешним ссылкам и путям.
Мы выяснили, что ошибка доступа к внешним ссылкам в 90% случаев связана с тем, что сервер 1С пытается найти файл там, где его нет (на своем локальном диске вместо клиентского). Для исправления ситуации мы можем либо настроить права для учетной записи USR1CV8 на сетевой ресурс с использованием UNC-путей, либо использовать механизм временного хранилища для передачи файла с клиента на сервер. Однако наиболее надежным способом остается интеграция модуля непосредственно в состав конфигурации или в справочник дополнительных обработок.