Как перенести данные из регистра бухгалтерии в регистр сведений с помощью Конвертации Данных 2.0?

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

При работе с конфигурациями 1С часто возникает необходимость перенести данные из одного типа хранилища в другое. Одной из распространенных задач является передача информации из регистра бухгалтерии в регистр сведений, особенно когда требуется агрегировать или преобразовать данные для специфических отчетов или механизмов учета. Мы с вами разберем, как эффективно решить эту проблему, используя механизм «Конвертация Данных 2.0» (КД2).

Выясним причину, по которой такая задача может возникнуть. Регистр бухгалтерии хранит проводки, формируемые документами, с привязкой к счетам, субконто и суммам. Регистры сведений же предназначены для хранения произвольной периодической или непериодической информации, не связанной напрямую с бухгалтерскими проводками. Часто для аналитики или интеграции требуется извлечь определенные показатели из проводок и сохранить их в более удобном для обработки виде в регистре сведений.

Рассмотрим подробнее подходы к решению этой задачи.

Использование функции "ВыгрузитьПоПравилу()" для гибкого переноса данных

Одним из наиболее мощных и гибких инструментов в КД2 для решения подобных задач является функция ВыгрузитьПоПравилу(). Она позволяет программно формировать данные для выгрузки и передавать их в определенное Правило Конвертации Объектов (ПКО), минуя стандартные механизмы выборки объектов-источников.

Разберем по шагам, как мы можем использовать этот подход:

  1. Подготовка данных в источнике. В обработчике события, например, "Перед выгрузкой" для Правила Выгрузки Данных (ПВД) или Правила Конвертации Объектов (ПКО), нам необходимо сформировать выборку нужных данных из регистра бухгалтерии. Мы можем использовать запросы для отбора и агрегации информации. Результат запроса удобно представить в виде Структуры или ТаблицыЗначений. Эти данные будут служить "входящими данными" для ПКО-приемника.

    Посмотрим на пример формирования данных (этот код будет выполняться в обработчике события ПВД или ПКО в базе-источнике):

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

    В этом примере мы формируем структуру ДанныеДляРегистра для каждой строки выборки и передаем ее в ПКО с именем "ПереносДанныхРегистраСведений".

  2. Использование ВыгрузитьПоПравилу(). Как мы уже видели в примере, функция ВыгрузитьПоПравилу() принимает два основных параметра: ВходящиеДанные (наша Структура или ТаблицаЗначений) и ИмяПКО (имя Правила Конвертации Объектов, которое будет отвечать за загрузку данных в регистр сведений или документ-приемник). Мы можем вызывать эту функцию многократно, передавая каждую порцию данных.

  3. Настройка ПКО приемника. Для ПКО, которое мы указали в ВыгрузитьПоПравилу() (в нашем примере это "ПереносДанныхРегистраСведений"), мы должны выполнить следующие настройки:

    • Источник оставляем пустым. Это ключевой момент, так как данные будут поступать не из объекта-источника, а из параметра ВходящиеДанные.

    • В Правилах Конвертации Свойств (ПКС) для полей регистра сведений (измерения, ресурсы) необходимо установить флажок "Получать значение из входящих данных". Таким образом, поля регистра сведений будут заполняться значениями из переданной структуры или таблицы значений.

    Например, если в регистре сведений есть измерения "Период", "Организация" и ресурс "Сумма", то для каждого из них в ПКС мы указываем, что значение берется из входящих данных, и сопоставляем с соответствующим именем поля в структуре (Период, Организация, Сумма).

Этот подход позволяет нам полностью контролировать процесс формирования и передачи данных, что особенно важно для сложных выборок из регистров.

Передача движений регистра бухгалтерии через документ "ОперацияБух"

Иногда требуется перенести не просто агрегированные данные, а полноценные движения регистра бухгалтерии, например, в документ-приемник типа "ОперацияБух" (или аналогичный), который затем сформирует движения в целевой базе. Это часто применяется при переносе специфических проводок, таких как депонированная заработная плата.

Разберем процесс:

  1. Выборка данных из регистра бухгалтерии. Как и в предыдущем случае, мы формируем запрос к регистру бухгалтерии, чтобы отобрать необходимые проводки. Например, для депонированной зарплаты это могут быть проводки по счету 76.04 (Расчеты по депонированным суммам) или другим соответствующим счетам.

    Посмотрим на пример запроса для депонированной зарплаты:

    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Хозрасчетный.Период КАК Период,
        |    Хозрасчетный.СчетДт КАК СчетДебета,
        |    Хозрасчетный.СчетКт КАК СчетКредита,
        |    Хозрасчетный.СубконтоДт1 КАК СубконтоДебета1,
        |    Хозрасчетный.СубконтоКт1 КАК СубконтоКредита1,
        |    Хозрасчетный.Сумма КАК Сумма
        |ИЗ
        |    РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
        |ГДЕ
        |    Хозрасчетный.СчетКт = &СчетДепонирования
        |    И Хозрасчетный.Период МЕЖДУ &НачалоПериода И &КонецПериода";
    
    Запрос.УстановитьПараметр("СчетДепонирования", ПланыСчетов.Хозрасчетный.НайтиПоКоду("76.04"));
    Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДата()));
    Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ТекущаяДата()));
    
    Выборка = Запрос.Выполнить().Выбрать();
    
  2. Формирование структуры движений для "ОперацииБух". На основе выбранных данных нам необходимо программно сформировать структуру, которая будет имитировать табличную часть "Движения" документа "ОперацияБух". Эта структура должна содержать все необходимые реквизиты проводки: счет дебета, счет кредита, субконто, сумму, содержание и т.д.

    Посмотрим на пример формирования данных для документа "ОперацияБух":

    
    ТаблицаДвижений = Новый ТаблицаЗначений;
    ТаблицаДвижений.Колонки.Добавить("Период");
    ТаблицаДвижений.Колонки.Добавить("СчетДт");
    ТаблицаДвижений.Колонки.Добавить("СчетКт");
    ТаблицаДвижений.Колонки.Добавить("СубконтоДт1");
    ТаблицаДвижений.Колонки.Добавить("СубконтоКт1");
    ТаблицаДвижений.Колонки.Добавить("Сумма");
    ТаблицаДвижений.Колонки.Добавить("Содержание");
    
    Пока Выборка.Следующий() Цикл
        НоваяСтрока = ТаблицаДвижений.Добавить();
        НоваяСтрока.Период = Выборка.Период;
        НоваяСтрока.СчетДт = Выборка.СчетДебета;
        НоваяСтрока.СчетКт = Выборка.СчетКредита;
        НоваяСтрока.СубконтоДт1 = Выборка.СубконтоДебета1;
        НоваяСтрока.СубконтоКт1 = Выборка.СубконтоКредита1;
        НоваяСтрока.Сумма = Выборка.Сумма;
        НоваяСтрока.Содержание = "Депонированная зарплата за " + Формат(Выборка.Период, "ДФ=MM.yyyy");
    КонецЦикла;
    
    // Теперь нам нужно передать эту ТаблицуДвижений в ПКО документа "ОперацияБух"
    // как свойство, которое будет соответствовать табличной части "Движения"
    // в документе-приемнике.
    
  3. Настройка ПКО для документа "ОперацияБух". В ПКО, отвечающем за создание документа "ОперацияБух", необходимо создать Правило Конвертации Свойств (ПКС) для табличной части, соответствующей движениям регистра бухгалтерии (например, "ДвиженияБухгалтерии" или "Хозрасчетный" в зависимости от конфигурации и метаданных). Для этого ПКС источником будет наша ТаблицаДвижений, а приемником – соответствующая табличная часть документа. Для каждого поля табличной части (СчетДт, СчетКт, Сумма и т.д.) мы устанавливаем сопоставление с колонками нашей ТаблицыДвижений.

    Важный момент: Убедитесь, что при выгрузке метаданных из исходной базы были корректно включены регистры бухгалтерии. В ПКО документа-приемника должна быть доступна группа свойств, соответствующая движениям регистра бухгалтерии (например, "Хозрасчетный"). Если эта группа отсутствует, возможно, требуется обновить структуру метаданных в конфигурации КД2 или перепроверить настройки выгрузки метаданных.

  4. Вызов ВыгрузитьПоПравилу(). В конце мы передаем сформированные данные в ПКО документа "ОперацияБух".

    
    // Предположим, что мы хотим создать один документ "ОперацияБух"
    // на основании всех сформированных движений.
    СтруктураДокумента = Новый Структура;
    СтруктураДокумента.Вставить("Дата", КонецМесяца(ТекущаяДата()));
    СтруктураДокумента.Вставить("Содержание", "Перенос депонированной зарплаты");
    СтруктураДокумента.Вставить("ДвиженияБухгалтерии", ТаблицаДвижений); // Имя свойства должно соответствовать ПКС в ПКО
    
    ВыгрузитьПоПравилу(СтруктураДокумента, "ОперацияБухгалтерская"); // "ОперацияБухгалтерская" - имя ПКО для документа
    

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

Работа с РегистромСведений.СоответствияОбъектовИнформационныхБаз

Мы должны уделить особое внимание регистру сведений РегистрСведений.СоответствияОбъектовИнформационныхБаз. Этот регистр является ключевым для поддержания связей между объектами в разных информационных базах при обмене. Он используется для сопоставления объектов по уникальным идентификаторам (GUID) или другим полям поиска, что особенно важно для ссылочных типов данных (справочники, документы).

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

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

Передача нессылочных и ссылочных данных

При переносе данных из регистров важно различать типы данных:

  1. Нессылочные данные. Для простых значений, таких как числа, строки, даты, булевы значения, мы можем напрямую сопоставлять свойства в ПКС или собирать их в Структуру или ТаблицуЗначений и передавать через ВходящиеДанные, как мы рассматривали выше. Здесь нет необходимости в дополнительных механизмах сопоставления.

  2. Ссылочные данные. Для ссылочных типов, таких как элементы справочников (например, "Организации", "Контрагенты", "Сотрудники"), документы или другие объекты метаданных, ситуация сложнее. Нам необходимо создавать отдельные ПКО и ПКС для каждого типа ссылочного объекта. Эти ПКО будут отвечать за поиск существующего объекта в базе-приемнике по уникальному идентификатору (GUID) или по полям поиска (например, ИНН/КПП для организаций) или за его создание, если объект не найден.

    Механизм сопоставления объектов по GUID или полям поиска в КД2, а также через регистр СоответствияОбъектовИнформационныхБаз, обеспечивает целостность ссылок. Если СтрокаТаблицы.ОбъектВыборки не является объектом ссылочного типа, то попытка привязать его к ПКО для ссылочного объекта приведет к ошибке.

Отладка правил обмена КД2

Отладка правил обмена в КД2, особенно при использовании Библиотеки Стандартных Подсистем (БСП) или сложных алгоритмов, может быть непростой задачей. Однако, мы можем использовать следующие методы:

  1. Включение отладки. Первым шагом всегда является включение отладки в конфигурациях источника и приемника. Это позволит нам ставить точки останова и пошагово выполнять код.

  2. Использование расширений конфигурации. Для отладки и доработки правил рекомендуется использовать расширения конфигурации, а не внешние файлы правил. Расширения позволяют вносить изменения в типовой код и отлаживать его без снятия с поддержки.

  3. Точки останова. Точки останова можно устанавливать в общих модулях, задействованных в обмене, например, в модулях, относящихся к БСП (ОбменДаннымиХДТО, ОбменДаннымиСобытия и т.д.), а также в обработчиках событий наших ПВД и ПКО. Важно понимать последовательность вызова обработчиков событий (например, "Перед выгрузкой", "После выгрузки", "При выгрузке", "При загрузке") для эффективного размещения точек останова.

  4. "Универсальный обмен данными в формате XML". Эта обработка часто используется для тестирования и отладки правил обмена. Она позволяет выгружать и загружать данные, используя созданные правила, и, что важно, она "проглатывает" произвольный алгоритм без объекта выборки в ПВД. Это делает ее незаменимым инструментом для проверки работы ВыгрузитьПоПравилу() и других программных алгоритмов.

Мы всегда начинаем "от печки": сначала описываем правила загрузки "куда надо" (в регистр сведений или документ), затем делаем выборку нужных данных (например, проводки 51 счета) и формируем данные для загрузки, используя ВыгрузитьПоПравилу(). Далее мы играемся с правилами через "Универсальный обмен в формате XML" – выгружаем, загружаем, поправляем правила. И только последним этапом будем делать план обмена и выдавать ему правила.

Таким образом, мы видим, что перенос данных из регистра бухгалтерии в регистр сведений, хотя и требует внимательной настройки и понимания механизмов КД2, является вполне решаемой задачей с использованием функций ВыгрузитьПоПравилу() и правильной настройкой ПКО и ПКС. Не забывайте про отладку и особенности работы со ссылочными данными!

← К списку