Регистр сведений из 1С в Excel, XML или CSV: пять рабочих способов
Содержание
Быстрее всего выгрузить регистр сведений
1С в файл через форму списка: откройте регистр в Все функции → Регистры сведений, нажмите Ещё → Вывести список…, а получившийся табличный документ сохраните в .xlsx. Для переноса данных в другую базу нужен XML, а для регулярной выгрузки в стороннюю систему — код или OData.
Выбор зависит от трёх вещей: сколько строк, кто будет читать файл (человек или программа) и нужно ли повторять выгрузку. Сводка ниже, подробности — по разделам.
| Способ | Формат файла | Когда подходит | Ограничения |
|---|---|---|---|
📄 Вывести список | xlsx, xls, ods, csv-подобный txt, mxl, pdf | Разовая выгрузка до десятков тысяч строк | Только колонки формы списка, медленно на больших объёмах |
| 🔍 Консоль запросов / отчёт | xlsx, mxl | Нужен отбор, срез на дату, свои колонки | Нужна внешняя обработка или право на конструктор отчётов |
| 📦 Обработка выгрузки XML | xml | Перенос в базу с той же конфигурацией | Файл не для чтения человеком |
| 💻 Свой код | xml, json, csv, xlsx | Регулярная выгрузка, миллионы строк | Нужен программист и права на внешние обработки |
| 🌐 OData | json, xml по HTTP | Интеграция с BI, сайтом, другой учётной системой | Нужна публикация базы на веб-сервере |
Как открыть регистр сведений и что проверить перед выгрузкой
Большинство регистров сведений в интерфейсе «Такси» не вынесены в разделы. Добраться до любого из них можно через команду «Все функции».
- Откройте главное меню (кнопка с тремя полосками в левом верхнем углу).
- Если пункта
Все функциинет, включите его:Сервис и настройки → Параметры, флажок «Отображать команду “Все функции”». - Выберите
Все функции → Регистры сведенийи откройте нужный регистр двойным щелчком.
Перед выгрузкой проверьте три вещи:
- 🔐 Права. Для сохранения табличного документа в файл пользователю нужно право «Вывод». Если кнопки сохранения нет или она неактивна, вопрос к администратору базы.
- 🗂 Отбор. Выгружайте только нужное. Отбор по измерению (организации, сотруднику, номенклатуре) задаётся в форме списка через
Ещё → Настроить список…на вкладке «Отбор» или в строке поиска. - 📅 Периодичность. Если в списке есть колонка «Период», регистр периодический. В нём хранится вся история значений, и «текущее» значение получается срезом. Об этом — в отдельном разделе ниже.
Технические имена регистров (например, КурсыВалют) видны в Конфигураторе. В пользовательском режиме вы видите синоним — «Курсы валют». Для выгрузки через форму списка имя не нужно, для запроса и кода — нужно.
Выгрузка регистра сведений в Excel из формы списка
Это способ без программирования и без внешних обработок. Он работает в любой типовой конфигурации на платформе 8.3.
Пошагово
- Откройте регистр и настройте отбор, если нужна часть записей.
- При необходимости добавьте колонки:
Ещё → Изменить форму…и отметьте нужные поля. В выгрузку попадут именно видимые колонки. - Нажмите
Ещё → Вывести список…. - В окне вывода выберите «Табличный документ», отметьте колонки. Флажок «Только выделенные» выводит строки, которые вы выделили в списке мышью.
- Нажмите «ОК». Откроется табличный документ.
- Сохраните его: команда сохранения есть в главном меню (
Файл → Сохранить как…) и в командной панели табличного документа. В поле «Тип файла» выберите «Лист Excel 2007-…» (.xlsx).
Если нужен текстовый файл, в том же окне сохранения выберите «Текстовый документ» (.txt). Колонки в нём разделяются табуляцией, такой файл Excel открывает мастером импорта.
Чего ждать на больших регистрах
Форма списка подгружает строки порциями, а «Вывести список» выводит всё сразу. На регистре в 200–300 тысяч записей операция занимает минуты и съедает память клиента. В тонком клиенте через интернет может закончиться время ожидания.
Excel принимает не больше 1 048 576 строк на лист. Если в регистре больше записей, разбейте выгрузку отбором (по годам, организациям) или используйте CSV.
Отбор, срез и свои колонки: выгрузка через консоль запросов
Когда форма списка не даёт нужного набора полей, выручает запрос. Его выполняют в консоли запросов (внешняя обработка, есть на диске ИТС и в составе многих сборок разработчиков) или в конструкторе отчётов, если конфигурация поддерживает «Универсальный отчёт».
Простой запрос ко всему регистру:
ВЫБРАТЬ
Рег.Период,
Рег.Валюта,
Рег.Курс,
Рег.Кратность
ИЗ
РегистрСведений.КурсыВалют КАК Рег
ГДЕ
Рег.Период МЕЖДУ &НачалоПериода И &КонецПериода
УПОРЯДОЧИТЬ ПО
Рег.Период
Результат консоль выводит в табличный документ, который сохраняется в .xlsx так же, как в предыдущем разделе.
Универсальный отчёт в БП 3.0, ЗУП 3.1 и УТ 11 строится по виду объекта «Регистр сведений». В нём можно выбрать регистр, задать отбор, порядок колонок и сохранить вариант отчёта. Это удобно, если выгрузку повторяют раз в месяц: настройку не придётся собирать заново.
💡 В отчёте на основе СКД числа выводятся с разделителями групп разрядов. Если файл пойдёт в другую программу, задайте формат поля без группировки (ЧГ=0) в настройках оформления.
Перенос регистра в другую базу: обработка выгрузки и загрузки XML
Если файл нужен не человеку, а другой базе, удобна универсальная обработка «Выгрузка и загрузка данных XML». Это внешняя обработка (.epf), её распространяют на диске ИТС отдельно для платформы 8.3. Открывается через Файл → Открыть.
- Откройте обработку в базе-источнике. Нужны права на открытие внешних обработок.
- На вкладке выгрузки в дереве метаданных разверните «Регистры сведений» и отметьте нужный.
- Для периодического регистра задайте даты начала и окончания, иначе выгрузится вся история.
- Укажите имя файла и запустите выгрузку.
- В базе-приёмнике откройте ту же обработку, перейдите на вкладку загрузки, укажите файл и загрузите.
Обработка рассчитана на одинаковые конфигурации источника и приёмника. Если структура регистра различается (другое число измерений, иначе названы реквизиты), загрузка упадёт с ошибкой или запишет неполные данные. Для разных конфигураций используют «Конвертацию данных» с правилами обмена.
Загрузка записывает наборы записей регистра целиком по отбору. Записи в приёмнике с теми же значениями измерений (и периода) будут заменены. Перед загрузкой в рабочую базу сделайте её резервную копию.
Ссылки на справочники в файле передаются по уникальному идентификатору. Если в приёмнике нет элемента с таким идентификатором, в регистре появится «битая» ссылка вида <Объект не найден>. Поэтому справочники, на которые ссылается регистр, обычно выгружают вместе с ним.
Программная выгрузка регистра сведений в XML, JSON и CSV
Свой код нужен, когда выгрузка регулярная, объём большой или приёмнику нужен строгий формат. Его оформляют во внешней обработке или в расширении конфигурации, чтобы не трогать типовую.
XML через сериализатор XDTO
Самый короткий путь: прочитать набор записей и отдать его СериализаторXDTO. Сериализатор доступен на сервере, поэтому процедура выполняется с директивой &НаСервере.
&НаСервере
Процедура ВыгрузитьВXML(ИмяФайла)
Набор = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
// Без отбора прочитаются все записи регистра
Набор.Прочитать();
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ИмяФайла, "UTF-8");
Запись.ЗаписатьОбъявлениеXML();
СериализаторXDTO.ЗаписатьXML(Запись, Набор);
Запись.Закрыть();
КонецПроцедуры
Полученный файл обратно загружается через СериализаторXDTO.ПрочитатьXML() и запись набора. Формат зависит от структуры конфигурации, поэтому он годится для обмена между базами 1С, но неудобен для внешних систем.
Для JSON у того же сериализатора есть метод ЗаписатьJSON в паре с объектом ЗаписьJSON. Внешней системе чаще удобнее собрать JSON вручную из результата запроса: так вы контролируете имена полей.
CSV из запроса
CSV читают Excel, Python, BI-системы, загрузчики сайтов. Пример выгружает срез курсов на дату. Разделитель — точка с запятой, как ждёт русскоязычный Excel.
&НаСервере
Процедура ВыгрузитьВCSV(ИмяФайла, ДатаСреза)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Рег.Период КАК Период,
| Рег.Валюта.Код КАК КодВалюты,
| Рег.Курс КАК Курс,
| Рег.Кратность КАК Кратность
|ИЗ
| РегистрСведений.КурсыВалют.СрезПоследних(&ДатаСреза, ) КАК Рег";
Запрос.УстановитьПараметр("ДатаСреза", ДатаСреза);
Текст = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
Текст.ЗаписатьСтроку("Период;КодВалюты;Курс;Кратность");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Стр = СтрШаблон("%1;%2;%3;%4",
Формат(Выборка.Период, "ДФ=yyyy-MM-dd"),
Выборка.КодВалюты,
Формат(Выборка.Курс, "ЧРД=.; ЧГ=0"),
Формат(Выборка.Кратность, "ЧГ=0"));
Текст.ЗаписатьСтроку(Стр);
КонецЦикла;
Текст.Закрыть();
КонецПроцедуры
Строки пишутся в файл по одной, в памяти не копится весь результат. Поэтому способ выдерживает миллионы записей.
Excel программно
Если нужен именно .xlsx, заполните ТабличныйДокумент и вызовите ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX). Для больших объёмов этот путь медленнее CSV: табличный документ целиком строится в памяти.
Код выполняется на сервере, и файл ляжет на диск сервера 1С. Пользователю его передают через временное хранилище и ПолучитьФайл или его асинхронный аналог. В файловой базе сервер и клиент — один компьютер, путь совпадает.
Выгрузка без ручного файла: OData и веб-сервисы
Когда регистр нужен внешней системе каждый день, файл лучше не гонять вручную. Платформа умеет отдавать данные через стандартный интерфейс OData.
Что для этого нужно:
- Опубликовать базу на веб-сервере (Apache или IIS) с флажком публикации стандартного интерфейса OData.
- Включить регистр в состав OData. В конфигурациях на БСП для этого есть форма «Настройка стандартного интерфейса OData» в разделе администрирования; универсальный вариант — вызов метода
УстановитьСоставСтандартногоИнтерфейсаOData. - Создать пользователя с правами только на чтение нужных объектов.
После этого регистр доступен по адресу вида:
http://сервер/база/odata/standard.odata/InformationRegister_КурсыВалют?$format=json
Для периодических регистров есть виртуальная таблица среза: InformationRegister_КурсыВалют/SliceLast(). Отбор задают параметром $filter, число записей — $top. Power BI и Excel (через «Получить данные → Из канала OData») подключаются к такому адресу напрямую.
Если приёмнику нужен свой формат, программист создаёт в конфигурации HTTP-сервис или веб-сервис (SOAP) с пакетом XDTO. Это уже доработка конфигурации, её делают в расширении.
Периодический регистр: срез последних и выгрузка истории
Типичная ошибка — выгрузить периодический регистр целиком и получить в Excel по 300 строк на каждую валюту или сотрудника. Сначала решите, что именно нужно.
| Что нужно | Как получить | Где задать |
|---|---|---|
| Значения на дату | СрезПоследних(&Дата) | Запрос, отчёт, OData SliceLast |
| Первое значение после даты | СрезПервых(&Дата) | Запрос, OData SliceFirst |
| Вся история за период | Основная таблица с отбором по «Период» | Форма списка, обработка XML, запрос |
| История по одному объекту | Отбор по измерению | Форма списка, запрос |
Срез последних возвращает по одной записи на каждую комбинацию измерений: последнюю, у которой период не позже указанной даты. Если дату не передать, берётся последняя запись вообще.
Отбор по измерениям лучше ставить внутрь параметров виртуальной таблицы, а не в ГДЕ:
ВЫБРАТЬ
Рег.Валюта,
Рег.Курс
ИЗ
РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта В (&Валюты)) КАК Рег
Так платформа строит срез только по нужным валютам и не обрабатывает остальные. На больших регистрах разница в скорости заметная.
У регистров, подчинённых регистратору (документу), записи меняются только через документы. Выгружать их можно любым способом выше, а вот загружать обратно обработкой XML надо осторожно: при перепроведении документа загруженные записи перезапишутся.
Кодировка, разделители и большие объёмы
Большинство жалоб после выгрузки сводится к кракозябрам в Excel и зависаниям. Разберём по симптомам.
ЗаписьТекста с КодировкаТекста.UTF8 (она добавляет метку BOM) либо с КодировкаТекста.ANSI. Если файл уже есть, откройте его через «Данные → Из текстового/CSV-файла» и выберите кодировку 65001 (UTF-8).; или укажите разделитель в мастере импорта.Формат(Число, "ЧРД=.; ЧГ=0"). Пробелы-разделители разрядов убирает ЧГ=0.Для регистров в десятки миллионов строк выгрузку делят на порции по периоду: месяц за месяцем, в отдельные файлы. Так проще перезапустить упавший кусок, а файлы помещаются в Excel. Запускать такую выгрузку удобнее регламентным заданием ночью, чтобы не нагружать сервер в рабочее время.
Тяжёлый запрос к большому регистру в рабочее время тормозит работу всех пользователей базы и может упереться в блокировки. Длинные выгрузки ставьте на вечер или выходные.
Частые вопросы
Можно ли выгрузить регистр сведений без прав администратора?
Вывести список и сохранения в Excel. Внешние обработки и консоль запросов требуют отдельного права на их открытие.Чем выгрузка регистра отличается от выгрузки базы в .dt?
.dt — это вся информационная база целиком, его делают в Конфигураторе для резервного копирования. Выбрать в нём один регистр нельзя, а прочитать содержимое без загрузки в 1С невозможно.Почему в Excel не все записи регистра?
Как выгрузить регистр сведений в JSON?
ЗаписьJSON, либо сериализовать набор записей методом СериализаторXDTO.ЗаписатьJSON. Без программирования JSON отдаёт стандартный интерфейс OData с параметром $format=json.