Как выгрузить данные по конкретному счету из регистра бухгалтерии через XML?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

В практике администратора или программиста 1С часто возникают ситуации, когда необходимо перенести данные из бэкапа в рабочую базу выборочно. Одной из самых трудоемких задач является перенос движений по конкретному бухгалтерскому счету из регистра Хозрасчетный. Стандартная обработка «Выгрузка и загрузка данных XML» по умолчанию предлагает выгрузить весь регистр целиком, что недопустимо при больших объемах данных. Разберем по шагам, как настроить фильтрацию, какие нюансы учесть и как избежать появления «битых ссылок».

Метод 1. Настройка отборов в стандартной обработке «Выгрузка и загрузка данных XML»

Рассмотрим стандартный механизм, который используется в большинстве типовых конфигураций. Нам необходимо ограничить состав выгружаемых записей регистра бухгалтерии. Посмотрим, как это сделать:

  1. Откроем обработку «Выгрузка и загрузка данных XML». Если вы используете управляемые формы (современные версии БП 3.0, ERP, КА), интерфейс может показаться упрощенным.
  2. Найдем в списке объектов метаданных строку РегистрБухгалтерии.Хозрасчетный.
  3. Проанализируем возможность установки фильтра. В обычных формах (как в старых редакциях) кнопка отбора доступна сразу в колонке списка. В управляемых формах необходимо выделить строку с регистром и нажать на кнопку «Настроить отбор» (иногда она скрыта за иконкой воронки или в контекстном меню по правой кнопке мыши).
  4. Если кнопка настройки отбора недоступна, это верный признак того, что используется упрощенная версия обработки. В этом случае мы рекомендуем воспользоваться расширенным инструментом — обработкой «Универсальный обмен данными в формате XML» (ее можно найти в составе конфигурации «Конвертация данных»).

Техническая специфика фильтрации по счету

Разберем важный момент, который часто упускают новички. В регистре бухгалтерии Хозрасчетный нет одного универсального поля Счет. Проводка всегда состоит из двух сторон. Следовательно, чтобы выгрузить все движения по конкретному счету (например, 60.01), нам нужно установить условие по двум полям:

Важное замечание: Стандартный механизм отборов в XML-выгрузке обычно объединяет условия по правилу «И». Если вы установите СчетДт = 60.01 и СчетКт = 60.01, система попытается найти проводки, где и в дебете, и в кредите указан этот счет одновременно. Таких записей может не быть вовсе.

Чтобы выгрузить все движения, правильнее будет сделать две отдельные выгрузки:

  1. Выгрузка, где установлен фильтр только по СчетДт.
  2. Выгрузка, где установлен фильтр только по СчетКт.

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

Метод 2. Использование обработки «Универсальный обмен данными в формате XML»

Если штатная выгрузка не позволяет гибко настроить условия, воспользуемся более мощным инструментом. Эта обработка позволяет выгружать данные на основе произвольных правил обмена или даже простых запросов. Рассмотрим алгоритм действий:

  1. Переходим на вкладку «Выгрузка данных».
  2. В дереве объектов находим наш регистр.
  3. В правой части окна настройки находим раздел «Построитель отчета» или «Настройки отбора».
  4. Здесь мы можем добавить поле Счет (если система позволяет обращаться к виртуальным таблицам) или, что надежнее, добавить два условия через группу «ИЛИ», если интерфейс обработки это поддерживает.

Проблема «Объектов не найдены» и как её решить

Выясним причину, по которой после загрузки XML в базе-приемнике вместо документов-регистраторов могут появиться надписи <Объект не найден>. Это происходит из-за того, что проводки в 1С не существуют сами по себе — они жестко привязаны к регистратору (документу).

Проанализируем стратегию выгрузки:

Внимание: Включение этого флага может привести к «эффекту домино». Регистр потянет за собой Документ, Документ потянет Контрагентов и Договоры, Договоры потянут Организации и так далее. В итоге вы можете случайно выгрузить из бэкапа половину базы. Чтобы этого не случилось, перед загрузкой в основную базу проверьте наличие основных справочников (Контрагенты, Номенклатура) — они должны быть синхронизированы по GUID.

Метод 3. Программный перенос через COM-соединение

Если данных много и XML-файлы получаются слишком тяжелыми, профессионалы используют программный способ. Напишем примерную логику кода, который можно использовать во внешней обработке для прямого переноса записей:


// Пример логики подключения к бэкапу через COM
V83COM = Новый COMОбъект("V83.COMConnector");
Соединение = V83COM.Connect("File=""C:\BackupDB"";Usr=""Admin"";");

Запрос = Соединение.NewObject("Запрос");
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Хозрасчетный.Регистратор,
    |   Хозрасчетный.Период,
    |   Хозрасчетный.СчетДт,
    |   Хозрасчетный.СчетКт,
    |   Хозрасчетный.Сумма
    |ИЗ
    |   РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
    |ГДЕ
    |   Хозрасчетный.СчетДт = &НужныйСчет ИЛИ Хозрасчетный.СчетКт = &НужныйСчет";

Запрос.УстановитьПараметр("НужныйСчет", НужныйСчетСсылка);
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    // Здесь описывается логика создания набора записей в текущей базе
    // с поиском или созданием документов-регистраторов
КонецЦикла;

Обязательное завершение: Пересчет итогов

После того как вы успешно загрузили данные любым из способов, вы заметите, что отчеты (Оборотно-сальдовая ведомость) могут показывать старые или неверные цифры. Разберем, почему это происходит.

При прямой загрузке записей в регистр через XML или программно, система не всегда инициирует автоматический пересчет итогов бухгалтерского учета. Чтобы актуализировать данные, выполните следующие действия:

  1. Зайдите в раздел «Администрирование» — «Обслуживание».
  2. Выберите пункт «Управление итогами».
  3. Установите период расчета итогов, охватывающий ваши новые данные, и нажмите «Установить основной период» или «Пересчитать итоги».

Резюме: Перенос данных по счету через XML возможен, но требует внимательности к настройке отборов (учитываем СчетДт и СчетКт) и обязательной проверки целостности ссылок. Всегда делайте резервную копию основной базы перед загрузкой в нее сторонних данных.

← На главную