Как выгрузить данные в DBF из SQL базы 1С 8.3?

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

При работе в клиент-серверном варианте (SQL) разработчики часто сталкиваются с проблемой: привычный код выгрузки в DBF, который отлично работал в файловой базе, перестает функционировать. Основная причина заключается в том, что код, выполняющийся на сервере, не имеет прямого доступа к файловой системе клиентского компьютера. В этой статье мы подробно разберем, как правильно организовать выгрузку данных, используя объект XBase и механизм временного хранилища.

В чем главная сложность SQL-варианта?

В файловой базе 1С клиент и «сервер» — это один и тот же процесс, имеющий доступ к одним и тем же дискам. В клиент-серверном варианте база данных находится на SQL-сервере, а программный код выполняется на сервере приложений 1С. Когда вы указываете путь типа C:\MyFiles\export.dbf, сервер ищет этот путь на своем локальном диске, а не на диске пользователя. Чтобы передать файл пользователю, нам нужно сначала создать его на стороне сервера, а затем «перекачать» на клиент.

Алгоритм решения задачи

Для реализации корректной выгрузки мы будем использовать следующую последовательность действий:

  1. На сервере: Создаем временное имя файла в серверной временной папке.
  2. На сервере: Инициализируем объект XBase, создаем структуру колонок и наполняем файл данными.
  3. На сервере: Закрываем файл (обязательно!), чтобы снять блокировку операционной системы.
  4. На сервере: Читаем полученный файл в объект ДвоичныеДанные и помещаем их во ВременноеХранилище.
  5. На клиенте: Получаем адрес из хранилища и сохраняем данные на диск пользователя.

Шаг 1. Формирование данных на стороне сервера

Рассмотрим серверную функцию, которая выполняет основную работу. Мы будем использовать объект XBase для работы с форматом DBF. Обратите внимание на использование метода ПолучитьИмяВременногоФайла, который гарантирует уникальность имени файла на сервере.


&НаСервере
Функция СформироватьDBFНаСервере()
    
    // 1. Подготовка временного пути на сервере
    ИмяФайлаСервер = ПолучитьИмяВременногоФайла("dbf");
    
    // 2. Инициализация объекта XBase
    ФайлДБФ = Новый XBase;
    ФайлДБФ.Поля.Добавить("ID", "N", 10);
    ФайлДБФ.Поля.Добавить("NAME", "S", 100);
    ФайлДБФ.Поля.Добавить("PRICE", "N", 15, 2);
    
    // Устанавливаем кодировку (обычно OEM для старых систем или ANSI для Windows)
    ФайлДБФ.Кодировка = КодировкаXBase.ANSI;
    
    // Создаем файл по временному пути
    ФайлДБФ.СоздатьФайл(ИмяФайлаСервер);
    
    // 3. Наполнение данными (пример на основе запроса)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Номенклатура.Код КАК Код,
        |   Номенклатура.Наименование КАК Наименование,
        |   100 КАК Цена"; // Пример статической цены
        
    Результат = Запрос.Выполнить().Выбрать();
    
    Пока Результат.Следующий() Цикл
        ФайлДБФ.Добавить();
        ФайлДБФ.ID = Результат.Код;
        ФайлДБФ.NAME = Результат.Наименование;
        ФайлДБФ.PRICE = Результат.Цена;
        ФайлДБФ.Записать();
    КонецЦикла;
    
    // 4. Обязательно закрываем файл
    ФайлДБФ.ЗакрытьФайл();
    
    // 5. Помещаем файл во временное хранилище
    // Читаем файл с диска сервера в двоичные данные
    ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяФайлаСервер);
    АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла, ЭтаФорма.УникальныйИдентификатор);
    
    // Удаляем временный файл с диска сервера, так как он уже в памяти (хранилище)
    УдалитьФайлы(ИмяФайлаСервер);
    
    Возврат АдресХранилища;
    
КонецФункции

Шаг 2. Получение файла на клиенте

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


&НаКлиенте
Процедура ВыгрузитьДанные(Команда)
    
    // Вызываем серверный метод
    АдресФайла = СформироватьDBFНаСервере();
    
    // Параметры сохранения
    ИмяФайлаДляКлиента = "Выгрузка_Номенклатуры.dbf";
    
    // Используем стандартный диалог для сохранения файла
    // В управляемом приложении 8.3 рекомендуется ПолучитьФайл
    ПолучитьФайл(АдресФайла, ИмяФайлаДляКлиента, Истина);
    
КонецПроцедуры

Важные нюансы работы с форматом DBF

Проанализируем технические ограничения, которые могут привести к ошибкам при выгрузке из SQL-баз:

Использование асинхронности (для веб-клиента и Такси)

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


&НаКлиенте
Процедура ВыгрузитьАсинхронно(Команда)
    
    АдресФайла = СформироватьDBFНаСервере();
    
    ОписаниеЗавершения = Новый ОписаниеОповещения("ЗавершитьСохранениеФайла", ЭтотОбъект);
    
    ПараметрыПолучения = Новый ПараметрыПолученияФайлаССервера;
    ПараметрыПолучения.ЗаголовокДиалога = "Выберите путь для сохранения DBF";
    
    НачатьПолучениеФайлаССервера(ОписаниеЗавершения, АдресФайла, "export.dbf", ПараметрыПолучения);
    
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьСохранениеФайла(Результат, ДополнительныеПараметры) Экспорт
    Если Результат <> Неопределено Тогда
        ПоказатьОповещениеПользователя("Успех", , "Файл успешно сохранен!");
    КонецЕсли;
КонецПроцедуры

Заключение

Мы рассмотрели универсальный и безопасный способ выгрузки данных в DBF из SQL-базы 1С. Главное правило: всегда разделяйте логику формирования файла и логику его сохранения. Формирование должно происходить на сервере во временную папку, а сохранение — на клиенте через временное хранилище. Такой подход гарантирует стабильную работу обработки независимо от того, где физически находится сервер 1С и какие права доступа у пользователя к сетевым ресурсам.

← На главную