для сохранения существующих проводок."> для сохранения существующих проводок.">

Как переносить движения документов с признаком «Ручная корректировка движений» в 1С Конвертация данных 2.1?

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

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

Понимание проблемы: почему движения не переносятся?

Когда мы переносим документы с признаком «Ручная корректировка движений», мы обнаруживаем, что, несмотря на наличие правил конвертации для регистров и включенную опцию выгрузки движений, проводки не появляются в целевой базе. Это происходит потому, что процесс загрузки объекта в КД 2.1 имеет свои особенности:

  1. Первичная запись объекта: При загрузке документа в базу-приемник, он сначала просто записывается. На этом этапе документ уже существует в базе данных, но его движения еще не сформированы или, если они были загружены из файла, они могут быть проигнорированы стандартным механизмом проведения.
  2. Режим обмена и проведение: Важно понимать, что в контексте обмена данными, платформа 1С устанавливает специальный флаг — Обмен.Загрузка = Истина. Этот флаг влияет на работу многих алгоритмов в конфигурации, но он не отменяет логику проведения документов, если она предусмотрена.
  3. Стандартный механизм проведения: После первичной записи документа, платформа пытается его провести. Если у документа установлен флаг «Ручная корректировка движений», стандартный механизм проведения специально игнорирует создание или перезапись движений по регистрам. Это сделано для того, чтобы ручные корректировки, сделанные пользователем, не были случайно удалены или изменены при обычном перепроведении документа.
  4. Итог: пустые проводки: В результате этого взаимодействия, если документ с ручной корректировкой загружается и система пытается его провести, движения не формируются, и мы получаем документ с пустыми проводками.

Интересно, что при использовании универсальной обработки обмена данными в формате XML движения могут переноситься корректно даже без явных дополнительных настроек в правилах конвертации. Это может вводить в заблуждение, так как поведение КД 2.1 при прямом обмене или стандартной загрузке может отличаться.

Ключевое решение: использование РежимЗаписи = "Запись"

Суть проблемы заключается в том, что мы не хотим, чтобы документ, переносимый с уже существующими ручными корректировками, пытался пройти стандартную процедуру проведения в базе-приемнике. Наша цель — перенести документ «как есть», сохранив все его движения, которые были в базе-источнике.

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

Применение РежимЗаписи = "Запись"; в обработчике «Перед загрузкой»

Наиболее эффективное и корректное место для применения данного решения — это обработчик «Перед загрузкой» Правила конвертации объектов (ПКО) для соответствующего документа.

  1. Откройте Правила Конвертации Объектов (ПКО): Найдите ПКО для документа, который вы переносите (например, «Реализация товаров и услуг»).
  2. Перейдите в обработчики: На вкладке «Обработчики» найдите обработчик «Перед загрузкой».
  3. Добавьте код: В этот обработчик добавьте всего одну строку кода:

РежимЗаписи = "Запись";

Почему это работает?

Метод Записать() для документов в 1С имеет параметр РежимЗаписи, который определяет, как именно документ будет сохранен. Он может принимать следующие значения:

Указав РежимЗаписи = "Запись";, мы явно говорим системе, что после загрузки документа его не нужно проводить. Он будет записан со всеми движениями, которые были импортированы из файла обмена.

Особенности переноса документов типа «ОперацияБухгалтерская»

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

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


Для Каждого ЭлементДвижений Из Объект.Движения Цикл
    ЭлементДвижений.Записывать = Истина;
КонецЦикла;

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

Продвинутое решение: условная установка режима записи

Что если нам нужно определять, проводить объект или только записывать его, в зависимости от каких-либо условий? Например, проводить только те документы, у которых нет ручной корректировки, и записывать те, у которых она есть. Проблема обработчика «Перед загрузкой» в том, что в нем отсутствует прямая ссылка на объект-источник, чтобы проверить его свойства (например, Источник.РучнаяКорректировка).

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

Вариант 1: В обработчике «Перед выгрузкой» ПКО

В этом обработчике у нас есть доступ к Источнику. Мы можем добавить в него свойство, которое затем будет прочитано при загрузке. Однако более элегантным будет использовать глобальный обработчик.

Вариант 2: В глобальном обработчике «Перед конвертацией объекта»

Это самый гибкий способ, если нам нужна условная логика, основанная на данных объекта-источника. Перейдем в глобальные обработчики правил конвертации (кнопка "Открыть глобальные обработчики" в КД 2.1).

  1. Откройте глобальные обработчики.
  2. Найдите обработчик «Перед конвертацией объекта».
  3. Добавьте следующий код:

Попытка
    // Проверяем, есть ли у объекта-источника свойство "РучнаяКорректировка"
    Если Источник.Метаданные().Свойства.Найти("РучнаяКорректировка") <> Неопределено Тогда
        Если Источник.РучнаяКорректировка Тогда
            // Если ручная корректировка установлена, устанавливаем режим записи
            РежимЗаписи = "Запись";
        КонецЕсли;
    КонецЕсли;
Исключение
    // Игнорируем ошибки, если у объекта нет такого свойства или оно не доступно
    // Например, при конвертации объектов, которые не являются документами.
КонецПопытки;

Пояснения к коду:

Ошибочные подходы и их критика

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


МетаданныеОбъекта = Объект.Метаданные;
Если Метаданные.Документы.Содержит(МетаданныеОбъекта) Тогда
    ДвиженияВсе = Объект.Движения;
    МассивДвижений = новый Массив;
    Для каждого СтрокаДвижения из ДвиженияВсе Цикл
        МассивДвижений.Добавить(СтрокаДвижения.Выгрузить());
    КонецЦикла;

    Объект.Записать(РежимЗаписиДокумента.Запись); // Это правильная часть

    ИИ = 0;
    Для Каждого ЭлементМассива из МассивДвижений Цикл
        // Загрузим движения обратно
        НаборЗаписей = Объект.Движения[ИИ];
        НаборЗаписей.Прочитать();
        НаборЗаписей.Загрузить(ЭлементМассива);
        НаборЗаписей.Записать();
        ИИ = ИИ + 1;
    КонецЦикла;
КонецЕсли;

Анализируя этот код, мы видим несколько проблем и избыточность:

  1. Избыточность выгрузки регистров: Автор подобного кода часто предлагает в инструменте выгрузки структуры конфигурации (например, MD83Exp) выставлять чекбоксы «выгружать регистры», «выгружать движения». На самом деле, для переноса движений документов достаточно иметь правила конвертации регистров, и они в документах КД 2.1 представлены как табличные части. Чекбокс «Выгружать движения документов» в КД 2.1 обычно является достаточным.
  2. «Масло масляное» в логике движений: Если движения уже были корректно выгружены и включены в файл обмена, то КД 2.1 при загрузке документа *уже* попытается загрузить эти движения в соответствующие коллекции Объект.Движения. Попытка вручную «выгрузить» их из Объект.Движения после загрузки, а затем «загрузить» и «записать» их снова — это избыточно. Если мы правильно указываем РежимЗаписи = "Запись", система сама позаботится о сохранении всех движений, которые были переданы в файле обмена и ассоциированы с этим документом.
  3. Непонимание этапов загрузки: Как мы уже выяснили, документ сначала записывается, а затем (если не указано РежимЗаписи = "Запись") происходит его проведение. Все эти сложные манипуляции с движениями после записи объекта и до его проведения не имеют смысла, так как следующим этапом проведения они будут проигнорированы или перезаписаны, если не использовать правильный режим записи.

Предложенное нами решение, использующее РежимЗаписи = "Запись";, значительно проще, эффективнее и основано на понимании внутреннего механизма работы платформы 1С и инструмента КД 2.1. Оно позволяет избежать ненужного усложнения кода и ошибок, связанных с некорректной обработкой движений.

Заключение

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

Использование всего одной строки кода РежимЗаписи = "Запись"; в обработчике «Перед загрузкой» ПКО, или ее условное применение через глобальный обработчик «Перед конвертацией объекта», позволяет нам корректно переносить такие документы, сохраняя все их движения без необходимости сложных и избыточных алгоритмов. Этот подход обеспечивает целостность данных и значительно упрощает процесс настройки обмена.

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

← На главную