Как переопределить первоначальную выгрузку данных регистра бухгалтерии в подсистеме БСП

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

При настройке синхронизации данных между конфигурациями на базе 1С:Библиотека стандартных подсистем (БСП) часто возникает задача выполнения «первоначальной» или полной выгрузки накопленных данных. Особенную сложность представляет выгрузка данных из регистра бухгалтерии (например, по счету 60 «Расчеты с поставщиками и подрядчиками»), когда объем записей исчисляется миллионами. Стандартные механизмы БСП, предлагающие выгрузить «Все данные», могут привести к критической нагрузке на систему. В этой статье мы подробно разберем, как переопределить этот процесс, минимизировать нагрузку на базу данных и корректно передать проводки в целевую систему.

Проблема стандартной регистрации в БСП

Рассмотрим ситуацию: нам необходимо передать сведения об оплатах из «1С:Бухгалтерия предприятия» в самописную базу. Все нужные данные находятся в движениях документов (Дт 60 - Кт 51, 52). Если мы пойдем по стандартному пути и добавим документы-регистраторы в план обмена, а затем попытаемся зарегистрировать их все за несколько лет, мы столкнемся с проблемой производительности. Регистрация 10 миллионов документов создаст огромную таблицу изменений (AutoRegistration), что замедлит работу всей системы. Проанализируем, как можно обойти это ограничение.

Способ 1. Использование переопределяемых модулей БСП

В современных версиях БСП предусмотрены программные точки расширения для управления составом данных при начальной синхронизации. Разберем работу с общим модулем ОбменДаннымиПереопределяемый. Нас интересует процедура ПриЗаполненииДанныхДляРегистрацииНаПервоначальнуюВыгрузку.

Этот метод позволяет программно вмешаться в процесс, который запускает «Помощник настройки синхронизации». Вместо того чтобы регистрировать все объекты выбранных типов, мы можем наложить фильтр непосредственно в коде. Посмотрим на пример логики, которую можно внедрить:


Процедура ПриЗаполненииДанныхДляРегистрацииНаПервоначальнуюВыгрузку(ПараметрыРегистрации) Экспорт
    
    // Проверяем, что это наш план обмена
    Если ПараметрыРегистрации.ИмяПланаОбмена = "МойПланОбменаССамописнойБазой" Тогда
        
        // Вместо регистрации всех документов, выбираем только те, 
        // которые имеют проводки по 60 счету
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ РАЗЛИЧНЫЕ
            |	ХозрасчетныйДвиженияССубконто.Регистратор КАК Регистратор
            |ИЗ
            |	РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(&ДатаНачала, , СчетДт В ИЕРАРХИИ (&Счет60)) КАК ХозрасчетныйДвиженияССубконто";
        
        Запрос.УстановитьПараметр("ДатаНачала", '20200101');
        Запрос.УстановитьПараметр("Счет60", ПланыСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками);
        
        Результат = Запрос.Выполнить();
        Если Не Результат.Пустой() Тогда
            // Регистрируем найденные ссылки в параметрах БСП
            ПараметрыРегистрации.ОбъектыДляРегистрации.Добавить(Результат.Выгрузить().ВыгрузитьКолонку("Регистратор"));
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

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

Способ 2. Реализация выгрузки через «Конвертацию данных 2.0» без регистрации

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

Разберем по шагам, как это настроить:

  1. В конфигурации КД создаем новое ПВД для регистра бухгалтерии.
  2. Устанавливаем способ выборки «Произвольный алгоритм».
  3. В обработчике «Перед выгрузкой данных» пишем запрос, который выбирает данные напрямую из регистра бухгалтерии.
  4. Используем метод ВыгрузитьПоПравилу(), чтобы отправить каждую запись или сформированную структуру в файл обмена.

Пример алгоритма в ПВД:


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

Запрос.УстановитьПараметр("Счет60", ПланыСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками);
Запрос.УстановитьПараметр("Счет51", ПланыСчетов.Хозрасчетный.РасчетныйСчет);
Запрос.УстановитьПараметр("Счет52", ПланыСчетов.Хозрасчетный.ВалютныеСчета);

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    // Создаем структуру для передачи в ПКО (Правило конвертации объектов)
    ДанныеДляПКО = Новый Структура("Период, Регистратор, Сумма, СчетДт, СчетКт");
    ЗаполнитьЗначенияСвойств(ДанныеДляПКО, Выборка);
    
    // Выгружаем данные по ПКО, где в качестве источника может быть указан РС или документ
    ВыгрузитьПоПравилу(ДанныеДляПКО, , , , "ХозрасчетныйВЗаписьРегистраСведений");
КонецЦикла;

Этот метод хорош тем, что не создает записей в таблицах изменений плана обмена. Вы просто один раз прогоняете данные через правила выгрузки.

Способ 3. Регистрация наборов записей вместо ссылок

Проанализируем ситуацию, когда автор сообщения опасается, что регистрация «встанет». В 1С можно регистрировать не только документы, но и конкретные записи регистров. Если в составе плана обмена указан регистр бухгалтерии, мы можем программно зарегистрировать изменения только по нужным проводкам.

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


// Пример порционной регистрации изменений
Счет60 = ПланыСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками;
УзелОбмена = ПланыОбмена.СинхронизацияССамописной.НайтиПоКоду("001");

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

Выборка = Запрос.Выполнить().Выбрать();

МассивРегистраторов = Новый Массив;
Счетчик = 0;

Пока Выборка.Следующий() Цикл
    МассивРегистраторов.Добавить(Выборка.Регистратор);
    Счетчик = Счетчик + 1;
    
    // Регистрируем порциями по 1000 объектов
    Если Счетчик % 1000 = 0 Тогда
        ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, МассивРегистраторов);
        МассивРегистраторов.Очистить();
    КонецЕсли;
КонецЦикла;

// Дорегистрируем остаток
Если МассивРегистраторов.Количество() > 0 Тогда
    ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, МассивРегистраторов);
КонецЕсли;

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

Рекомендации по оптимизации

Для успешного выполнения задачи по первоначальной выгрузке миллионов проводок, мы рекомендуем придерживаться следующих правил:

Таким образом, комбинируя методы программной регистрации через ОбменДаннымиПереопределяемый и возможности произвольных алгоритмов в КД 2.0, мы можем гибко управлять составом первоначальной выгрузки, избегая деградации производительности системы.

← На главную