Выгрузка данных из 1С 8.3: от Excel до прямого доступа к СУБД

· 9 мин

Содержание

Данные из 1С выгружают не одним способом, а десятком — и выбор зависит от того, кто забирает данные и куда. Бухгалтеру хватает кнопки «Сохранить» в отчёте. Программисту, который переливает справочники в другую систему, нужен XML, JSON или OData. Админу, который отдаёт выборку в BI-систему, — прямой доступ к СУБД.

Главная ошибка — пытаться «вытащить всё из базы напрямую запросом к SQL». Для разовой таблицы это долго и опасно, а структуру базы 1С меняет при каждом обновлении конфигурации. Ниже — рабочие инструменты под каждую задачу: ручные, программные и сетевые.

Сохранение списков и отчётов в Excel и другие форматы

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

Для отчёта или печатной формы:

  1. Сформируйте отчёт.
  2. Главное меню (значок в левом верхнем углу) → Файл → Сохранить как.
  3. Выберите тип файла и укажите папку.

Доступные форматы табличного документа:

  • 📊 .xlsx и .xls — Excel (лист книги);
  • 📄 .ods — таблица LibreOffice/OpenOffice;
  • 📑 .mxl — родной формат 1С (откроется в другой базе 1С);
  • 📝 .txt, .csv — текст с разделителями;
  • 🌐 .html, .pdf — для публикации и печати.

Чтобы выгрузить список (например, список номенклатуры или документов, а не отчёт), откройте список и нажмите Ещё → Вывести список. 1С спросит, какие колонки включить, и выведет их в табличный документ — дальше сохраняете как обычно.

Если нужны все колонки, которых нет в списке по умолчанию, сначала настройте видимость колонок через Ещё → Изменить форму, а потом выводите список.

Отдельный случай — выгрузка в CSV для загрузки в другую программу. При сохранении в .csv или .txt проверьте разделитель и кодировку: внешние системы часто ждут UTF-8 и точку с запятой, а русский Excel по умолчанию открывает CSV в кодировке Windows-1251. Если принимающая сторона видит «кракозябры», дело почти всегда в кодировке файла, а не в самих данных.

Способ подходит для разовой задачи на десятки-тысячи строк. Для регулярного обмена и больших объёмов он не годится: форматирование «плывёт», а ручная операция не автоматизируется.

Полная выгрузка базы и универсальный обмен через XML

Когда нужна не выборка, а вся база целиком — например, для переноса на другой сервер или передачи на доработку, — используют выгрузку информационной базы в файл .dt.

  1. Запустите базу в режиме Конфигуратор.
  2. Меню Администрирование → Выгрузить информационную базу.
  3. Укажите имя файла .dt и дождитесь окончания.

Выгрузка .dt требует монопольного доступа — все пользователи должны выйти из базы. Для файловой базы это снимок всей информации; для клиент-серверной на большой базе выгрузка .dt идёт долго, и для бэкапа надёжнее средства СУБД (backup в MS SQL / pg_dump в PostgreSQL).

Файл .dt — это «всё или ничего»: его нельзя частично загрузить или прочитать снаружи. Если нужны отдельные объекты (справочники, документы за период) в переносимом виде, применяют универсальный обмен в формате XML.

Стандартная обработка «Выгрузка и загрузка данных XML» (берётся из комплекта ИТС) позволяет выбрать типы объектов, период и условия, и выгрузить их в один XML-файл. На приёмной стороне та же обработка загружает данные в идентичную по структуре конфигурацию.

Для обмена между разными конфигурациями (например, из «Управления торговлей» в «Бухгалтерию») используют формат EnterpriseData и правила конвертации, подготовленные в «Конвертации данных 3.0». Это уже настоящий обмен с сопоставлением реквизитов, а не простая выгрузка.

Выгрузка в XML и JSON средствами встроенного языка

Если выгрузку нужно встроить в обработку или регламентное задание, данные формируют кодом. 1С умеет сериализовать объекты в XML и писать JSON напрямую.

Сериализация объекта в XML через СериализаторXDTO:

Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\Выгрузка\contragent.xml");
СериализаторXDTO.ЗаписатьXML(Запись, Элемент.ПолучитьОбъект());
Запись.Закрыть();

Так выгружают конкретный элемент справочника или документ со всеми реквизитами и табличными частями.

Выгрузка в JSON (поддержка JSON доступна начиная с платформы 8.3.6). Сначала собираете структуру или массив, затем пишете его в файл:

Данные = Новый Массив;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Стр = Новый Структура;
    Стр.Вставить("Код", Выборка.Код);
    Стр.Вставить("Наименование", Выборка.Наименование);
    Данные.Добавить(Стр);
КонецЦикла;

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл("C:\Выгрузка\nomenclature.json");
ЗаписатьJSON(ЗаписьJSON, Данные);
ЗаписьJSON.Закрыть();

JSON удобен, когда данные принимает веб-приложение или внешний сервис — он легче парсится на стороне приёмника, чем XML.

Для выгрузки табличной части или произвольной выборки берите данные запросом и заполняйте структуру сами. Не выгружайте объекты целиком, если приёмнику нужны три поля из тридцати — так файл меньше и загрузка быстрее.

COM-соединение: забрать данные из другой базы 1С

Когда данные нужно получить из другой базы 1С программно (не выгружая файл вручную), подключаются по COM через V83.COMConnector.

Коннектор = Новый COMObject("V83.COMConnector");
Соединение = Коннектор.Connect(
    "File=""C:\Base"";Usr=""Администратор"";Pwd=""пароль""");
Запрос = Соединение.NewObject("Запрос");
Запрос.Текст = "ВЫБРАТЬ Код, Наименование ИЗ Справочник.Номенклатура";
Выборка = Запрос.Выполнить().Выбрать();

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

Что важно учесть:

  • внешнее соединение занимает отдельную клиентскую лицензию 1С;
  • строка соединения для клиент-серверной базы отличается: Srvr="сервер";Ref="имя_базы";
  • V83.COMConnector — COM-объект, поэтому запуск идёт из Windows (внешний скрипт, ещё одна база 1С, служба).

ODBC в контексте 1С работает в обратную сторону: механизм «Внешние источники данных» через ODBC-драйвер читает чужую СУБД (MS SQL, PostgreSQL, Oracle) и показывает её таблицы внутри 1С как справочники. Для выгрузки из 1С наружу он не предназначен — наружу данные отдают COM-соединением, сериализацией или сервисами.

Прямой доступ к таблицам SQL Server и PostgreSQL

Клиент-серверная база 1С хранится в MS SQL или PostgreSQL, и формально её таблицы можно прочитать напрямую SQL-запросом в обход платформы. Это самый быстрый способ для аналитики и BI — но и самый рискованный.

Почему «в лоб» запрос к базе почти никогда не работает :

  • имена таблиц не человекочитаемы — _Reference123, _Document456, _AccumRg789;
  • имена колонок тоже кодированы: _Fld1234, _IDRRef;
  • при изменении структуры конфигурации (реструктуризации) номера меняются, и запрос ломается;
  • ссылки хранятся в бинарном виде, суммы — в отдельных полях, перечисления — числами.

Чтобы связать имена метаданных с именами таблиц СУБД, в 1С есть функция:

Соответствие = ПолучитьСтруктуруХраненияБазыДанных();

Она возвращает таблицу соответствия «объект метаданных → имя таблицы и поля в СУБД». По ней строят представления (VIEW) в базе данных, а аналитика работает уже с понятными именами. При обновлении конфигурации представления пересоздают по новой карте.

Прямой доступ к базе 1С официально не поддерживается, и писать в таблицы напрямую нельзя — вы нарушите целостность и итоги. Читать можно, но только через повторяемый механизм (VIEW по карте таблиц), а не разовыми запросами к _Reference123. Для продуктивной базы делайте это на реплике или резервной копии, чтобы не нагружать рабочий сервер.

OData, HTTP- и web-сервисы для выгрузки по сети

Когда данные должна забирать внешняя система по сети — без файлов и COM, — 1С публикуется на веб-сервере и отдаёт данные по HTTP.

Стандартный интерфейс OData — самый простой вариант, кода писать не нужно:

  1. В Конфигураторе: Администрирование → Публикация на веб-сервере (нужен установленный Apache или IIS).
  2. На вкладке OData включите стандартный интерфейс и выберите объекты, которые отдаёте наружу.
  3. Данные становятся доступны по адресу вида http://сервер/база/odata/standard.odata/.

Запрос .../Catalog_Номенклатура?$format=json вернёт справочник номенклатуры в JSON. OData поддерживает фильтры $filter, выбор полей $select и постраничность $top/$skip — внешнему приложению не нужно знать внутреннее устройство 1С.

HTTP-сервисы пишут, когда нужна своя логика выгрузки: входной параметр, формирование ответа, авторизация. Вы объявляете HTTP-сервис в конфигурации, в обработчике формируете JSON или XML и возвращаете его. Публикация — там же, в Публикация на веб-сервере, вкладка HTTP-сервисы.

Web-сервисы (SOAP) применяют для интеграции со старыми корпоративными системами, которым нужен WSDL-контракт. Для новых интеграций обычно выбирают OData или HTTP-сервис — они легче.

Отдельно про доступ: публикуя базу наружу, не отдавайте её в интернет без защиты. Доступ к OData и сервисам закрывают аутентификацией 1С (логин-пароль пользователя с нужными правами), а снаружи — HTTPS и, по возможности, ограничением по IP или доступом только из внутренней сети. Для Odata заведите отдельного пользователя 1С только на чтение нужных справочников — тогда через интерфейс не утекут документы и остатки, которые отдавать не планировали.

СпособКогда выбиратьФормат ответа
ODataБыстро отдать данные без кодаJSON / Atom
HTTP-сервисНужна своя логика и авторизациялюбой (JSON/XML/текст)
Web-сервис (SOAP)Интеграция с системой на WSDLXML (SOAP)

Выгрузка больших объёмов без перегрузки сервера

На сотнях тысяч строк наивная выгрузка «загрузить всё в память, потом записать» упирается в память и блокировки. Приёмы, которые это снимают:

  • Читайте запросом, а не перебором объектов. Запрос с нужными полями в разы легче, чем ПолучитьОбъект() по каждой ссылке в цикле.
  • Выгружайте порциями. Делите выборку на пакеты (например, по 1000–5000 строк) с условием по дате или по диапазону ссылок, чтобы не держать весь результат в памяти.
  • Переносите выгрузку в фоновое задание. Длинную операцию запускайте регламентным или фоновым заданием ночью — пользователи не ждут, а сервер не занят.
  • Для O и HTTP — отдавайте страницами.* $top/$skip в OData или параметр страницы в своём HTTP-сервисе; приёмник листает, а не тянет миллион строк одним запросом.
  • Для полного слепка базы — средства СУБД. Снять всю базу быстрее через backup MS SQL или pg_dump, чем выгружать .dt или гнать XML.

Если выгрузка нужна регулярно и в одно и то же место, свяжите её с планом обмена или регламентным заданием. Разовую ручную операцию каждый раз повторять не нужно.

Ещё одна частая боль — выгрузка «съедает» рабочий сервер днём, и пользователи жалуются на тормоза. Тяжёлую выборку запускайте в непиковые часы и, если база клиент-серверная, по возможности уводите чтение на реплику СУБД. Для OData и HTTP-сервисов проверьте, что внешняя система листает данные страницами, а не дёргает полный список при каждом обращении — именно такие «жадные» интеграции чаще всего и создают нагрузку.

Какой способ под какую задачу — коротко:

Кому и куда уходят данные?

Частые вопросы

Можно ли выгрузить данные из 1С без программиста?
Да, если речь о списках и отчётах. Файл → Сохранить как для отчёта и Ещё → Вывести список для списка дают файл Excel без единой строки кода. Программист нужен, когда выгрузку надо автоматизировать или отдать в другую систему.
Чем отличается `.dt` от выгрузки XML?
.dt — это слепок всей базы целиком, его можно только загрузить в такую же конфигурацию, прочитать снаружи нельзя. XML-обмен выгружает выбранные объекты за период и годится для частичной передачи данных.
Безопасно ли читать базу 1С напрямую запросом к SQL?
Читать — можно, писать — нельзя. Прямой доступ официально не поддерживается, имена таблиц меняются при обновлении конфигурации. Делайте это через представления по карте таблиц и на резервной копии или реплике, а не на рабочем сервере.
Как отдать данные веб-приложению в формате JSON?
Включите стандартный интерфейс OData при публикации на веб-сервере — он сам отдаёт JSON по HTTP. Если нужна своя логика, напишите HTTP-сервис и формируйте JSON через ЗаписьJSON в обработчике.
Почему выгрузка большой базы идёт по несколько часов?
Скорее всего, данные читаются перебором объектов и держатся в памяти целиком. Перепишите на запрос с выборкой нужных полей, выгружайте порциями и перенесите операцию в фоновое задание.