При разработке и администрировании систем на платформе 1С:Предприятие 7.7 программисты часто сталкиваются с необходимостью выгрузить данные, полученные с помощью запроса и помещенные в таблицу значений (ТЗ), во внешний файл. Это может потребоваться для интеграции с другими информационными системами, импорта на веб-сайты, отправки контрагентам или для глубокого анализа данных в сторонних утилитах. В этой статье мы подробно разберем, как решить эту задачу различными способами, проанализируем преимущества и недостатки каждого подхода, а также разберем примеры готового кода.
Рассмотрим типичный пример получения данных из базы 1С 7.7 через объект Запрос, который был представлен автором темы:
Процедура Сформировать()
тзнДанные.УдалитьСтроки();
лЗапрос = СоздатьОбъект("Запрос");
лТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Обрабатывать все;
|Товар = Справочник.Единицы.Владелец;
|Штрихкод = Справочник.Единицы.ШтрихКод;
|Группировка Товар;
|"//}}ЗАПРОС ;
Если лЗапрос.Выполнить(лТекстЗапроса) = 0 Тогда
Сообщить("Не удалось выполнить запрос");
Иначе
лЗапрос.Выгрузить(тзнДанные, 1, 0);
КонецЕсли;
КонецПроцедуры
В данном коде результаты запроса выгружаются в таблицу значений тзнДанные. Важно сразу сделать замечание по поводу оптимизации кода. В исходном примере присутствовали строки добавления колонок:
тзнДанные.НоваяКолонка("Товар");
тзнДанные.НоваяКолонка("Штрихкод");
Эти строки являются избыточными. Метод Выгрузить объекта Запрос при передаче ему таблицы значений в качестве первого параметра автоматически пересоздает структуру колонок в соответствии со структурой группировок и переменных самого запроса. Поэтому предварительно объявлять колонки вручную нет необходимости.
Теперь выясним, какими способами можно сохранить полученную таблицу значений тзнДанные во внешний файл, в зависимости от того, как эти данные планируется использовать дальше.
Выделим 5 основных подходов для решения этой задачи:
ЗначениеВФайл (внутренний формат 1С).Таблица) с последующим сохранением в формат MXL или Excel (XLS).XBase.Рассмотрим каждый из этих методов подробно, разберем их сильные и слабые стороны, а также приведем готовые примеры кода.
---
Платформа 1С 7.7 предоставляет штатный быстрый способ сериализации сложных объектов данных (включая таблицы значений) в текстовый файл специального формата. Для этого используется функция ЗначениеВФайл.
Синтаксис функции:
ЗначениеВФайл(ИмяФайла, Значение, Флаг)
Где:
тзнДанные), который нужно сохранить;1 означает сохранение во внутреннем представлении (с сохранением внутренних идентификаторов объектов), а значение 0 — во внешнем.Посмотрим на пример реализации сохранения:
// Сохраняем таблицу значений в файл на диске C:
ПутьКФайлу = "C:\тзнДанные.txt";
Если ЗначениеВФайл(ПутьКФайлу, тзнДанные, 1) = 1 Тогда
Сообщить("Таблица значений успешно сохранена в файл!");
Иначе
Сообщить("Ошибка при сохранении файла!");
КонецЕсли;
Для восстановления данных из этого файла в другой базе 1С 7.7 (или в этой же базе при следующем сеансе) используется парная функция ЗначениеИзФайла:
ПутьКФайлу = "C:\тзнДанные.txt";
тзнВосстановленная = СоздатьОбъект("ТаблицаЗначений");
Если ЗначениеИзФайла(ПутьКФайлу, тзнВосстановленная, 1) = 1 Тогда
Сообщить("Данные успешно загружены из файла. Строк: " + тзнВосстановленная.КоличествоСтрок());
КонецЕсли;
Важное предупреждение: этот способ идеально подходит, если вам нужно перенести данные из одной базы 1С 7.7 в другую аналогичную базу 1С 7.7. Однако, если ваша цель — передать данные во внешнюю программу (например, на сайт или в Python-скрипт), этот формат абсолютно не подходит. Файл, созданный этой функцией, содержит внутреннюю разметку 1С с фигурными скобками и системными идентификаторами ссылочных объектов, которые внешняя программа прочесть не сможет.
---
Если данные необходимо представить в виде форматированного отчета или сохранить в формате, понятном для MS Excel, мы можем использовать встроенный объект платформы Таблица.
Для реализации этого способа в Конфигураторе 1С необходимо предварительно создать шаблон таблицы (например, с именем "Выгрузка") и настроить в нем секцию "СтрокаТЗ". В ячейках этой секции прописываются выражения для вывода данных:
тзнДанные.Товар.НаименованиетзнДанные.ШтрихкодОбратите внимание! Не следует выводить в таблицу сам объект Товар (ссылку на элемент справочника), так как при экспорте в другие форматы внешняя программа увидит только внутренний ID 1С. Всегда выгружайте строковое представление, например наименование (Наименование) или код (Код).
Код для вывода данных и записи файла выглядит следующим образом:
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Выгрузка"); // Подключаем созданный в конфигураторе шаблон
тзнДанные.ВыбратьСтроки();
Пока тзнДанные.ПолучитьСтроку() = 1 Цикл
// Выводим секцию шаблона для каждой строки ТЗ
Таб.ВывестиСекцию("СтрокаТЗ");
КонецЦикла;
// Сохраняем таблицу. Второй параметр определяет формат:
// 0 - формат MXL (внутренний формат таблиц 1С)
// 1 - формат XLS (Microsoft Excel)
Таб.Записать("C:\выгрузка.xls", 1);
Этот способ позволяет получить полноценный Excel-совместимый файл, который легко откроет любой пользователь или сторонняя система обработки табличных данных.
---
Формат CSV (Comma-Separated Values) является наиболее универсальным кроссплатформенным решением для обмена данными между самыми разными системами. Он представляет собой обычный текстовый файл, в котором каждая строка — это запись базы данных, а колонки разделены специальным символом (чаще всего точкой с запятой ;).
Для выгрузки данных в CSV в 1С 7.7 используется встроенный объект Текст. Разберем по шагам, как сформировать такой файл:
ТекстФайл = СоздатьОбъект("Текст");
тзнДанные.ВыбратьСтроки();
Пока тзнДанные.ПолучитьСтроку() = 1 Цикл
// Извлекаем текстовые значения реквизитов, очищая их от лишних пробелов по краям
НаименованиеТовара = СокрЛП(тзнДанные.Товар.Наименование);
Штрихкод = СокрЛП(тзнДанные.Штрихкод);
// Формируем результирующую строку с разделителем ";"
СтрокаВыгрузки = НаименованиеТовара + ";" + Штрихкод;
// Добавляем строку в текстовый объект
ТекстФайл.ДобавитьСтроку(СтрокаВыгрузки);
КонецЦикла;
// Записываем текстовый файл на диск
ТекстФайл.Записать("C:\выгрузка.csv");
Сообщить("Данные успешно сохранены в формате CSV!");
Преимущество этого способа заключается в его максимальной надежности, высокой скорости выполнения и абсолютной независимости от наличия на компьютере установленного пакета MS Office.
---
В некоторых случаях принимающая внешняя программа требует структурированный двоичный формат баз данных DBF. Платформа 1С 7.7 обладает мощным встроенным средством для создания таких файлов и манипулирования ими — объектом XBase.
Рассмотрим пример создания файла DBF и заполнения его строками из нашей таблицы значений:
БД = СоздатьОбъект("XBase");
// Определяем структуру будущего файла DBF.
// Параметры метода ДобавитьПоле: Имя поля (латиницей, до 10 символов), Тип ("S" - строка, "N" - число), Длина, Точность.
БД.ДобавитьПоле("TOVAR", "S", 100, 0); // Длина текстового поля 100 символов
БД.ДобавитьПоле("BARCODE", "S", 30, 0); // Длина поля под штрихкод 30 символов
// Создаем физический файл на диске с заданной структурой
БД.СоздатьФайл("C:\выгрузка.dbf");
тзнДанные.ВыбратьСтроки();
Пока тзнДанные.ПолучитьСтроку() = 1 Цикл
БД.Добавить(); // Создаем пустую запись в файле DBF
// Присваиваем значения полям созданной записи
БД.TOVAR = СокрЛП(тзнДанные.Товар.Наименование);
БД.BARCODE = СокрЛП(тзнДанные.Штрихкод);
БД.Записать(); // Фиксируем изменения в файле
КонецЦикла;
// Обязательно закрываем файл после окончания работы, чтобы освободить системные ресурсы
БД.ЗакрытьФайл();
Сообщить("Данные успешно сохранены в формате DBF!");
---
Если на рабочей станции, где выполняется код, установлен табличный процессор Microsoft Excel, мы можем программно запустить его в фоновом режиме, создать рабочую книгу и динамически заполнять ячейки прямо из 1С. Этот способ наиболее гибок, так как позволяет настраивать форматирование ячеек, шрифты, границы и ширину столбцов на лету.
Проанализируем пример кода для OLE-выгрузки:
Попытка
// Создаем COM-объект для связи с приложением Excel
Excel = СоздатьОбъект("Excel.Application");
Исключение
Сообщить("На данном компьютере не установлен MS Excel!");
Возврат;
КонецПопытки;
Excel.Visible = 0; // Скрываем окно Excel, чтобы процесс шел быстрее в фоновом режиме
Книги = Excel.Workbooks;
НоваяКнига = Книги.Add();
Лист = НоваяКнига.Worksheets(1);
// Создаем "шапку" нашей таблицы в первой строке Excel
Лист.Cells(1, 1).Value = "Товар";
Лист.Cells(1, 2).Value = "Штрихкод";
НомерСтроки = 2; // Данные начинаем заполнять со второй строки
тзнДанные.ВыбратьСтроки();
Пока тзнДанные.ПолучитьСтроку() = 1 Цикл
// Заполняем ячейку с наименованием товара
Лист.Cells(НомерСтроки, 1).Value = СокрЛП(тзнДанные.Товар.Наименование);
// КРИТИЧЕСКИ ВАЖНО для штрихкодов:
// Чтобы длинные цифровые штрихкоды не превращались в научный формат (например, 4.6E+12),
// перед строкой штрихкода мы добавляем символ одиночной кавычки (апострофа) "'".
// Это заставит Excel воспринимать значение строго как текстовое.
Лист.Cells(НомерСтроки, 2).Value = "'" + СокрЛП(тзнДанные.Штрихкод);
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
// Сохраняем созданную книгу на диск
НоваяКнига.SaveAs("C:\выгрузка_ole.xls");
// Обязательно корректно завершаем сеанс работы с Excel и уничтожаем ссылку на объект
Excel.Quit();
Excel = "";
Сообщить("Выгрузка через OLE успешно завершена!");
---
В завершение разбора темы акцентируем внимание на критически важном правиле интеграции систем. При выгрузке данных для стороннего софта (сайты, CRM, складские программы) никогда не выгружайте ссылочные типы объектов целиком. Платформа 1С при попытке неявного преобразования ссылки в строку вернет либо пустое значение, либо внутренний GUID (уникальный идентификатор), бесполезный вне вашей базы данных. Всегда явно обращайтесь к текстовым или числовым реквизитам объектов, получая строковые значения с помощью обращения через точку (например, тзнДанные.Товар.Наименование, тзнДанные.Товар.Код).
Мы подробно изучили 5 различных способов решения задачи выгрузки данных из таблицы значений в файл в системе 1С 7.7. Выбор конкретного метода зависит от требований принимающей стороны, объемов данных и технических условий работы вашей информационной системы.