При выгрузке данных в формат DBF разработчики часто сталкиваются с ситуацией: при попытке создать файл напрямую в общей сетевой папке (UNC-путь вида \\server\share\file.dbf) платформа 1С возвращает ошибку, сообщающую, что имя файла превышает допустимую длину в 8 символов. При этом само имя файла может строго соответствовать стандарту DOS 8.3 (например, foms.dbf). Разберем причины такого поведения платформы и рассмотрим рабочие способы решения этой задачи.
Объект платформы XBase использует устаревший встроенный механизм работы с таблицами dBase, который имеет ряд жестких ограничений и особенностей диагностики ошибок:
&НаСервере), обращение к ресурсу \\mycomp\share\ происходит не от имени текущего пользователя Windows, а от имени системной службы usr1cv8 (или SYSTEM). По умолчанию локальный пользователь сервера не имеет прав доступа к расшаренным папкам на других машинах в сети. При отказе в доступе файловая подсистема и движок XBase не всегда распознают ошибку авторизации и выбрасывают стандартное исключение о некорректном имени файла или превышении длины пути.Если требуется сохранить логику прямой записи файла по UNC-пути с сервера, проанализируем настройки безопасности сетевого каталога:
usr1cv8, предоставим доступ группе «Все» либо настроим запуск службы сервера от имени доменного пользователя с правами на целевой ресурс.После предоставления полных прав (включая права на создание и изменение файлов) ложное сообщение о превышении 8 символов перестает появляться, и файл успешно формируется в сетевой папке.
В архитектуре клиент-серверных управляемых форм наиболее надежным и рекомендуемым подходом считается отказ от прямой записи сервера в сетевые папки рабочих станций. Разберем правильный алгоритм: файл создается во временном каталоге сервера, помещается во временное хранилище, а затем скачивается на клиентскую машину с помощью платформенных методов.
Посмотрим на пример серверной функции, формирующей DBF-файл:
&НаСервере
Функция СформироватьDBFНаСервере()
// Движок XBase требует строгого формата 8.3
// ПолучитьИмяВременногоФайла() возвращает длинный GUID, поэтому формируем имя вручную
КаталогВременныхФайловСервера = КаталогВременныхФайлов();
КороткоеИмя = Лев(СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", ""), 8) + ".dbf";
ПолныйПутьКФайлу = КаталогВременныхФайловСервера + КороткоеИмя;
ДБФ = Новый XBase;
ДБФ.Поля.Добавить("CODE", "S", 10);
ДБФ.Поля.Добавить("NAME", "S", 50);
ДБФ.СоздатьФайл(ПолныйПутьКФайлу);
// Заполняем файл данными
ДБФ.Добавить();
ДБФ.CODE = "00001";
ДБФ.NAME = "Тестовая запись";
ДБФ.Записать();
ДБФ.ЗакрытьФайл();
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПолныйПутьКФайлу);
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла, УникальныйИдентификатор);
// Удаляем временный файл на сервере
УдалитьФайлы(ПолныйПутьКФайлу);
Возврат АдресХранилища;
КонецФункции
Теперь рассмотрим клиентский код, который забирает сформированные данные и предлагает пользователю сохранить их на локальный диск или в сетевую папку:
&НаКлиенте
Процедура СохранитьDBFНаКлиенте(Команда)
АдресФайлаВХранилище = СформироватьDBFНаСервере();
ПараметрыПолучения = Новый ПараметрыПолученияФайлов(Истина);
ОписаниеФайла = Новый ОписаниеПередаваемогоФайла("foms_sot.dbf", АдресФайлаВХранилище);
МассивФайлов = Новый Массив;
МассивФайлов.Добавить(ОписаниеФайла);
НачатьПолучениеФайлов(Неопределено, МассивФайлов, ПараметрыПолучения, Истина);
КонецПроцедуры
Такой подход полностью изолирует сервер 1С от сетевого окружения пользователей, работает на любых операционных системах (включая Linux) и не вызывает проблем с маршрутизацией прав.
Если архитектура решения требует прямой записи файла в определенное сетевое хранилище без интерактивного участия пользователя (например, в регламентном задании), можно подключить сетевой ресурс как логический диск операционной системы (например, Z:\).
Для платформы путь вида Z:\folder\file.dbf является локальным, что исключает сбои внутреннего парсера UNC-путей в XBase. Важно помнить, что сетевой диск должен быть смонтирован в той же пользовательской сессии ОС, в которой запущена служба сервера 1С.
При проектировании выгрузок в DBF учитываем ключевые правила работы с этим форматом в 1С:
ПолучитьИмяВременногоФайла(): данный метод генерирует имя на основе GUID длиной свыше 30 символов. Передача результата этого метода напрямую в СоздатьФайл() гарантированно вызовет исключение.