Как правильно создать DBF-файл по сети или сохранить его на клиенте в 1С

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

При выгрузке данных в формат DBF разработчики часто сталкиваются с ситуацией: при попытке создать файл напрямую в общей сетевой папке (UNC-путь вида \\server\share\file.dbf) платформа 1С возвращает ошибку, сообщающую, что имя файла превышает допустимую длину в 8 символов. При этом само имя файла может строго соответствовать стандарту DOS 8.3 (например, foms.dbf). Разберем причины такого поведения платформы и рассмотрим рабочие способы решения этой задачи.

Почему возникает ложная ошибка о длине имени файла

Объект платформы XBase использует устаревший встроенный механизм работы с таблицами dBase, который имеет ряд жестких ограничений и особенностей диагностики ошибок:

  1. Контекст учетной записи службы 1С: если код выполняется на сервере (в процедуре с директивой &НаСервере), обращение к ресурсу \\mycomp\share\ происходит не от имени текущего пользователя Windows, а от имени системной службы usr1cv8 (или SYSTEM). По умолчанию локальный пользователь сервера не имеет прав доступа к расшаренным папкам на других машинах в сети. При отказе в доступе файловая подсистема и движок XBase не всегда распознают ошибку авторизации и выбрасывают стандартное исключение о некорректном имени файла или превышении длины пути.
  2. Особенности парсера путей в XBase: сетевой путь с двумя обратными слэшами или длинными именами промежуточных каталогов может некорректно парситься движком, в результате чего весь путь ошибочно трактуется как имя файла.
  3. Ограничения сервера под управлением Linux: если сервер «1С:Предприятия» функционирует на базе Linux, прямая адресация через Windows UNC-нотацию не поддерживается на уровне файловой системы операционной системы.

Способ 1. Настройка сетевых прав доступа для службы 1С

Если требуется сохранить логику прямой записи файла по UNC-пути с сервера, проанализируем настройки безопасности сетевого каталога:

  1. Выясним, под какой учетной записью запущена служба сервера 1С на хосте приложений (в диспетчере служб Windows).
  2. На целевом компьютере, где открыта общая папка, предоставим полные права на уровне сетевого ресурса (вкладка «Доступ») и на уровне файловой системы (вкладка «Безопасность»).
  3. Если сервер 1С работает под локальной учетной записью usr1cv8, предоставим доступ группе «Все» либо настроим запуск службы сервера от имени доменного пользователя с правами на целевой ресурс.

После предоставления полных прав (включая права на создание и изменение файлов) ложное сообщение о превышении 8 символов перестает появляться, и файл успешно формируется в сетевой папке.

Способ 2. Формирование на сервере и передача на клиент через временное хранилище

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

Посмотрим на пример серверной функции, формирующей 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) и не вызывает проблем с маршрутизацией прав.

Способ 3. Монтирование сетевого диска

Если архитектура решения требует прямой записи файла в определенное сетевое хранилище без интерактивного участия пользователя (например, в регламентном задании), можно подключить сетевой ресурс как логический диск операционной системы (например, Z:\).

Для платформы путь вида Z:\folder\file.dbf является локальным, что исключает сбои внутреннего парсера UNC-путей в XBase. Важно помнить, что сетевой диск должен быть смонтирован в той же пользовательской сессии ОС, в которой запущена служба сервера 1С.

Ограничения объекта XBase, о которых важно помнить

При проектировании выгрузок в DBF учитываем ключевые правила работы с этим форматом в 1С:

  1. Формат имени 8.3: имя файла без расширения не может быть длиннее 8 символов, а расширение должно состоять ровно из 3 символов. Кириллические буквы и спецсимволы в именах файлов вызывают ошибки.
  2. Несовместимость с методом ПолучитьИмяВременногоФайла(): данный метод генерирует имя на основе GUID длиной свыше 30 символов. Передача результата этого метода напрямую в СоздатьФайл() гарантированно вызовет исключение.
  3. Ограничения полей: имена колонок таблицы не могут превышать 10 символов, максимальная длина строкового поля составляет 254 символа, а предельный размер итогового файла ограничен 2 ГБ.
← На главную