Как перенести документ «ОперацияБух» со всеми движениями в «Конвертации данных 2.1»?

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

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

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

Выясняем причину: почему движения не записываются автоматически?

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

С документом ОперацияБух этот фокус не сработает. Так как алгоритма проведения у него нет, его движения должны переноситься напрямую из базы-источника. Однако платформа 1С при записи объекта типа ДокументОбъект по умолчанию очищает или просто не записывает наборы записей его движений, если ей явно не указать обратное. В результате создается пустой документ-пустышка.

Шаг 1. Правильная выгрузка метаданных из источника и приемника

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

При выгрузке структуры конфигурации с помощью обработки MD82Exp.epf обратите внимание на настройки. Нам необходимо в обязательном порядке снять флаг «Не выгружать регистры бухгалтерии». Если этот флаг будет установлен, КД 2.1 не увидит структуру регистра бухгалтерии (например, Хозрасчетный или ЖурналПроводокЕПСБУ), и мы не сможем настроить правила конвертации свойств (ПКС) для движений.

Шаг 2. Базовое решение — установка признака записи движений

Рассмотрим самое простое и быстрое решение, которое помогает в 90% случаев. Нам нужно принудительно заставить платформу записать загруженный набор движений вместе с документом.

Для этого в конфигурации «Конвертация данных» откроем созданное ПКО для документа ОперацияБух (или ОперацияБухгалтерская) и перейдем в обработчик события «После загрузки». Запишем туда следующую строку кода:

Если мы переносим данные в Бухгалтерию предприятия 3.0 (БП):

Объект.Движения.Хозрасчетный.Записывать = Истина;

Если мы выполняем перенос в Бухгалтерию государственного учреждения 2.0 (БГУ):

Объект.Движения.ЖурналПроводокЕПСБУ.Записывать = Истина;

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

Шаг 3. Надежный обход проблемы сброса движений (альтернативный код)

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

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


// Для БГУ используется "ЖурналПроводокЕПСБУ", для БП — "Хозрасчетный"
НаборДвижений = Объект.Движения.ЖурналПроводокЕПСБУ; 

// Выгружаем загруженные конвертацией движения во временную таблицу значений
ТаблицаДвижений = НаборДвижений.Выгрузить();

// Записываем сам документ-регистратор в базу данных
Объект.Записать(РежимЗаписиДокумента.Запись);

// Создаем независимый набор записей регистра бухгалтерии
НаборЗаписей = РегистрыБухгалтерии.ЖурналПроводокЕПСБУ.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Объект.Ссылка);

// Загружаем сохраненные строки движений и записываем их напрямую
НаборЗаписей.Загрузить(ТаблицаДвижений);
НаборЗаписей.Записать();

Этот способ гарантирует 100% результат, поскольку запись движений происходит в обход стандартного механизма записи документа.

Шаг 4. Настройка правил конвертации динамических субконто

Даже если движения начали переноситься, вы можете столкнуться с тем, что аналитика (субконто) на счетах дебета или кредита оказывается пустой или вызывает ошибки при загрузке. Субконто в 1С — это динамические типы данных, базирующиеся на Планах видов характеристик (ПВХ). Давайте разберем, как правильно их настроить.

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

Также возможна ситуация, когда в базе-источнике у счета настроено три субконто, а в базе-приемнике у этого же счета — только два. В этом случае попытка записать лишнее субконто приведет к ошибке транзакции. Чтобы обезопасить себя от этого, добавим в обработчик «После загрузки» ПКО документа код автоматической очистки лишней аналитики:


Для каждого Проводка из Объект.Движения.ЖурналПроводокЕПСБУ Цикл
    // Проверяем и очищаем лишние Субконто Дт
    Для каждого Субконто из Проводка.СубконтоДт Цикл
        Доступно = Ложь;
        Для каждого ВидСубконто из Проводка.СчетДт.ВидыСубконто Цикл
            Если ВидСубконто.ВидСубконто = Субконто.Ключ Тогда
                Доступно = Истина;
                Прервать;
            КонецЕсли;
        КонецЦикла;
        Если НЕ Доступно Тогда
            Проводка.СубконтоДт.Удалить(Субконто.Ключ);
        КонецЕсли;
    КонецЦикла;

    // Проверяем и очищаем лишние Субконто Кт
    Для каждого Субконто из Проводка.СубконтоКт Цикл
        Доступно = Ложь;
        Для каждого ВидСубконто из Проводка.СчетКт.ВидыСубконто Цикл
            Если ВидСубконто.ВидСубконто = Субконто.Ключ Тогда
                Доступно = Истина;
                Прервать;
            КонецЕсли;
        КонецЦикла;
        Если НЕ Доступно Тогда
            Проводка.СубконтоКт.Удалить(Субконто.Ключ);
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

Шаг 5. Альтернативный метод: Перенос через входящие данные

Если объем данных очень большой или стандартный XML-парсер КД дает сбои при сериализации движений регистра, мы можем применить альтернативный подход с использованием временной таблицы значений.

Рассмотрим схему реализации этого метода:

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

Этот способ позволяет полностью абстрагироваться от стандартных механизмов КД по выгрузке регистров и гарантирует максимальную гибкость при сопоставлении аналитики счетов.

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

← На главную