Регистр сведений из 1С в Excel, XML или CSV: пять рабочих способов

· 10 мин

Содержание

Быстрее всего выгрузить регистр сведений 1С в файл через форму списка: откройте регистр в Все функции → Регистры сведений, нажмите Ещё → Вывести список…, а получившийся табличный документ сохраните в .xlsx. Для переноса данных в другую базу нужен XML, а для регулярной выгрузки в стороннюю систему — код или OData.

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

СпособФормат файлаКогда подходитОграничения
📄 Вывести списокxlsx, xls, ods, csv-подобный txt, mxl, pdfРазовая выгрузка до десятков тысяч строкТолько колонки формы списка, медленно на больших объёмах
🔍 Консоль запросов / отчётxlsx, mxlНужен отбор, срез на дату, свои колонкиНужна внешняя обработка или право на конструктор отчётов
📦 Обработка выгрузки XMLxmlПеренос в базу с той же конфигурациейФайл не для чтения человеком
💻 Свой кодxml, json, csv, xlsxРегулярная выгрузка, миллионы строкНужен программист и права на внешние обработки
🌐 ODatajson, xml по HTTPИнтеграция с BI, сайтом, другой учётной системойНужна публикация базы на веб-сервере

Как открыть регистр сведений и что проверить перед выгрузкой

Большинство регистров сведений в интерфейсе «Такси» не вынесены в разделы. Добраться до любого из них можно через команду «Все функции».

  1. Откройте главное меню (кнопка с тремя полосками в левом верхнем углу).
  2. Если пункта Все функции нет, включите его: Сервис и настройки → Параметры, флажок «Отображать команду “Все функции”».
  3. Выберите Все функции → Регистры сведений и откройте нужный регистр двойным щелчком.

Перед выгрузкой проверьте три вещи:

  • 🔐 Права. Для сохранения табличного документа в файл пользователю нужно право «Вывод». Если кнопки сохранения нет или она неактивна, вопрос к администратору базы.
  • 🗂 Отбор. Выгружайте только нужное. Отбор по измерению (организации, сотруднику, номенклатуре) задаётся в форме списка через Ещё → Настроить список… на вкладке «Отбор» или в строке поиска.
  • 📅 Периодичность. Если в списке есть колонка «Период», регистр периодический. В нём хранится вся история значений, и «текущее» значение получается срезом. Об этом — в отдельном разделе ниже.

Технические имена регистров (например, КурсыВалют) видны в Конфигураторе. В пользовательском режиме вы видите синоним — «Курсы валют». Для выгрузки через форму списка имя не нужно, для запроса и кода — нужно.

Выгрузка регистра сведений в Excel из формы списка

Это способ без программирования и без внешних обработок. Он работает в любой типовой конфигурации на платформе 8.3.

Пошагово

  1. Откройте регистр и настройте отбор, если нужна часть записей.
  2. При необходимости добавьте колонки: Ещё → Изменить форму… и отметьте нужные поля. В выгрузку попадут именно видимые колонки.
  3. Нажмите Ещё → Вывести список….
  4. В окне вывода выберите «Табличный документ», отметьте колонки. Флажок «Только выделенные» выводит строки, которые вы выделили в списке мышью.
  5. Нажмите «ОК». Откроется табличный документ.
  6. Сохраните его: команда сохранения есть в главном меню (Файл → Сохранить как…) и в командной панели табличного документа. В поле «Тип файла» выберите «Лист Excel 2007-…» (.xlsx).

Если нужен текстовый файл, в том же окне сохранения выберите «Текстовый документ» (.txt). Колонки в нём разделяются табуляцией, такой файл Excel открывает мастером импорта.

Чего ждать на больших регистрах

Форма списка подгружает строки порциями, а «Вывести список» выводит всё сразу. На регистре в 200–300 тысяч записей операция занимает минуты и съедает память клиента. В тонком клиенте через интернет может закончиться время ожидания.

Excel принимает не больше 1 048 576 строк на лист. Если в регистре больше записей, разбейте выгрузку отбором (по годам, организациям) или используйте CSV.

Отбор, срез и свои колонки: выгрузка через консоль запросов

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

Простой запрос ко всему регистру:

ВЫБРАТЬ
    Рег.Период,
    Рег.Валюта,
    Рег.Курс,
    Рег.Кратность
ИЗ
    РегистрСведений.КурсыВалют КАК Рег
ГДЕ
    Рег.Период МЕЖДУ &НачалоПериода И &КонецПериода
УПОРЯДОЧИТЬ ПО
    Рег.Период

Результат консоль выводит в табличный документ, который сохраняется в .xlsx так же, как в предыдущем разделе.

Универсальный отчёт в БП 3.0, ЗУП 3.1 и УТ 11 строится по виду объекта «Регистр сведений». В нём можно выбрать регистр, задать отбор, порядок колонок и сохранить вариант отчёта. Это удобно, если выгрузку повторяют раз в месяц: настройку не придётся собирать заново.

💡 В отчёте на основе СКД числа выводятся с разделителями групп разрядов. Если файл пойдёт в другую программу, задайте формат поля без группировки (ЧГ=0) в настройках оформления.

Перенос регистра в другую базу: обработка выгрузки и загрузки XML

Если файл нужен не человеку, а другой базе, удобна универсальная обработка «Выгрузка и загрузка данных XML». Это внешняя обработка (.epf), её распространяют на диске ИТС отдельно для платформы 8.3. Открывается через Файл → Открыть.

  1. Откройте обработку в базе-источнике. Нужны права на открытие внешних обработок.
  2. На вкладке выгрузки в дереве метаданных разверните «Регистры сведений» и отметьте нужный.
  3. Для периодического регистра задайте даты начала и окончания, иначе выгрузится вся история.
  4. Укажите имя файла и запустите выгрузку.
  5. В базе-приёмнике откройте ту же обработку, перейдите на вкладку загрузки, укажите файл и загрузите.

Обработка рассчитана на одинаковые конфигурации источника и приёмника. Если структура регистра различается (другое число измерений, иначе названы реквизиты), загрузка упадёт с ошибкой или запишет неполные данные. Для разных конфигураций используют «Конвертацию данных» с правилами обмена.

Загрузка записывает наборы записей регистра целиком по отбору. Записи в приёмнике с теми же значениями измерений (и периода) будут заменены. Перед загрузкой в рабочую базу сделайте её резервную копию.

Ссылки на справочники в файле передаются по уникальному идентификатору. Если в приёмнике нет элемента с таким идентификатором, в регистре появится «битая» ссылка вида <Объект не найден>. Поэтому справочники, на которые ссылается регистр, обычно выгружают вместе с ним.

Программная выгрузка регистра сведений в 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.

Что для этого нужно:

  1. Опубликовать базу на веб-сервере (Apache или IIS) с флажком публикации стандартного интерфейса OData.
  2. Включить регистр в состав OData. В конфигурациях на БСП для этого есть форма «Настройка стандартного интерфейса OData» в разделе администрирования; универсальный вариант — вызов метода УстановитьСоставСтандартногоИнтерфейсаOData.
  3. Создать пользователя с правами только на чтение нужных объектов.

После этого регистр доступен по адресу вида:

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 и зависаниям. Разберём по симптомам.

Диагностика: выберите симптом

Для регистров в десятки миллионов строк выгрузку делят на порции по периоду: месяц за месяцем, в отдельные файлы. Так проще перезапустить упавший кусок, а файлы помещаются в Excel. Запускать такую выгрузку удобнее регламентным заданием ночью, чтобы не нагружать сервер в рабочее время.

Тяжёлый запрос к большому регистру в рабочее время тормозит работу всех пользователей базы и может упереться в блокировки. Длинные выгрузки ставьте на вечер или выходные.

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

Можно ли выгрузить регистр сведений без прав администратора?
Да, если у пользователя есть право просмотра регистра и право «Вывод». Этого достаточно для Вывести список и сохранения в Excel. Внешние обработки и консоль запросов требуют отдельного права на их открытие.
Чем выгрузка регистра отличается от выгрузки базы в .dt?
Файл .dt — это вся информационная база целиком, его делают в Конфигураторе для резервного копирования. Выбрать в нём один регистр нельзя, а прочитать содержимое без загрузки в 1С невозможно.
Почему в Excel не все записи регистра?
Скорее всего, в форме списка стоял отбор или включён флажок «Только выделенные» в окне вывода. Ещё одна причина — ограничение доступа на уровне записей: пользователь видит только записи своих организаций.
Как выгрузить регистр сведений в JSON?
Через код: собрать данные запросом и записать объектом ЗаписьJSON, либо сериализовать набор записей методом СериализаторXDTO.ЗаписатьJSON. Без программирования JSON отдаёт стандартный интерфейс OData с параметром $format=json.
Можно ли загрузить отредактированный в Excel файл обратно в регистр?
Штатной загрузки из Excel в произвольный регистр нет. Используют внешнюю обработку загрузки из табличного документа или пишут свою. Перед загрузкой в рабочую базу проверьте результат на копии.