Выгрузка данных из 1С 8.3: от Excel до прямого доступа к СУБД
Содержание
Данные из 1С выгружают не одним способом, а десятком — и выбор зависит от того, кто забирает данные и куда. Бухгалтеру хватает кнопки «Сохранить» в отчёте. Программисту, который переливает справочники в другую систему, нужен XML, JSON или OData. Админу, который отдаёт выборку в BI-систему, — прямой доступ к СУБД.
Главная ошибка — пытаться «вытащить всё из базы напрямую запросом к SQL». Для разовой таблицы это долго и опасно, а структуру базы 1С меняет при каждом обновлении конфигурации. Ниже — рабочие инструменты под каждую задачу: ручные, программные и сетевые.
Сохранение списков и отчётов в Excel и другие форматы
Самый частый сценарий — выгрузить то, что уже видно на экране. Любой отчёт или печатная форма в 1С — это табличный документ, и его можно сохранить в файл.
Для отчёта или печатной формы:
- Сформируйте отчёт.
- Главное меню (значок в левом верхнем углу) →
Файл → Сохранить как. - Выберите тип файла и укажите папку.
Доступные форматы табличного документа:
- 📊
.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.
- Запустите базу в режиме Конфигуратор.
- Меню
Администрирование → Выгрузить информационную базу. - Укажите имя файла
.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 — самый простой вариант, кода писать не нужно:
- В Конфигураторе:
Администрирование → Публикация на веб-сервере(нужен установленный Apache или IIS). - На вкладке
ODataвключите стандартный интерфейс и выберите объекты, которые отдаёте наружу. - Данные становятся доступны по адресу вида
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) | Интеграция с системой на WSDL | XML (SOAP) |
Выгрузка больших объёмов без перегрузки сервера
На сотнях тысяч строк наивная выгрузка «загрузить всё в память, потом записать» упирается в память и блокировки. Приёмы, которые это снимают:
- Читайте запросом, а не перебором объектов. Запрос с нужными полями в разы легче, чем
ПолучитьОбъект()по каждой ссылке в цикле. - Выгружайте порциями. Делите выборку на пакеты (например, по 1000–5000 строк) с условием по дате или по диапазону ссылок, чтобы не держать весь результат в памяти.
- Переносите выгрузку в фоновое задание. Длинную операцию запускайте регламентным или фоновым заданием ночью — пользователи не ждут, а сервер не занят.
- Для O и HTTP — отдавайте страницами.*
$top/$skipв OData или параметр страницы в своём HTTP-сервисе; приёмник листает, а не тянет миллион строк одним запросом. - Для полного слепка базы — средства СУБД. Снять всю базу быстрее через backup MS SQL или
pg_dump, чем выгружать.dtили гнать XML.
Если выгрузка нужна регулярно и в одно и то же место, свяжите её с планом обмена или регламентным заданием. Разовую ручную операцию каждый раз повторять не нужно.
Ещё одна частая боль — выгрузка «съедает» рабочий сервер днём, и пользователи жалуются на тормоза. Тяжёлую выборку запускайте в непиковые часы и, если база клиент-серверная, по возможности уводите чтение на реплику СУБД. Для OData и HTTP-сервисов проверьте, что внешняя система листает данные страницами, а не дёргает полный список при каждом обращении — именно такие «жадные» интеграции чаще всего и создают нагрузку.
Какой способ под какую задачу — коротко:
Файл → Сохранить как либо Ещё → Вывести список в Excel..dt в Конфигураторе или backup средствами СУБД.ПолучитьСтруктуруХраненияБазыДанных(), чтение на реплике.Частые вопросы
Можно ли выгрузить данные из 1С без программиста?
Файл → Сохранить как для отчёта и Ещё → Вывести список для списка дают файл Excel без единой строки кода. Программист нужен, когда выгрузку надо автоматизировать или отдать в другую систему.Чем отличается `.dt` от выгрузки XML?
.dt — это слепок всей базы целиком, его можно только загрузить в такую же конфигурацию, прочитать снаружи нельзя. XML-обмен выгружает выбранные объекты за период и годится для частичной передачи данных.Безопасно ли читать базу 1С напрямую запросом к SQL?
Как отдать данные веб-приложению в формате JSON?
ЗаписьJSON в обработчике.