для сохранения существующих проводок."> для сохранения существующих проводок.">
При работе с инструментом 1С Конвертация данных 2.1 (далее КД 2.1) мы часто сталкиваемся с необходимостью переноса документов из одной информационной базы в другую. Особую сложность представляют документы, у которых установлен признак «Ручная корректировка движений». В стандартных сценариях обмена данные по движениям таких документов могут успешно выгружаться в файл обмена, но при загрузке в базу-приемник движения не создаются или очищаются. Давайте подробно разберем, почему это происходит, и как эффективно решить эту проблему.
Когда мы переносим документы с признаком «Ручная корректировка движений», мы обнаруживаем, что, несмотря на наличие правил конвертации для регистров и включенную опцию выгрузки движений, проводки не появляются в целевой базе. Это происходит потому, что процесс загрузки объекта в КД 2.1 имеет свои особенности:
Обмен.Загрузка = Истина. Этот флаг влияет на работу многих алгоритмов в конфигурации, но он не отменяет логику проведения документов, если она предусмотрена.Интересно, что при использовании универсальной обработки обмена данными в формате XML движения могут переноситься корректно даже без явных дополнительных настроек в правилах конвертации. Это может вводить в заблуждение, так как поведение КД 2.1 при прямом обмене или стандартной загрузке может отличаться.
Суть проблемы заключается в том, что мы не хотим, чтобы документ, переносимый с уже существующими ручными корректировками, пытался пройти стандартную процедуру проведения в базе-приемнике. Наша цель — перенести документ «как есть», сохранив все его движения, которые были в базе-источнике.
Решение оказывается достаточно простым и логичным: нам необходимо указать платформе, что документ должен быть только записан, но не проведен.
РежимЗаписи = "Запись"; в обработчике «Перед загрузкой»Наиболее эффективное и корректное место для применения данного решения — это обработчик «Перед загрузкой» Правила конвертации объектов (ПКО) для соответствующего документа.
РежимЗаписи = "Запись";
Почему это работает?
Метод Записать() для документов в 1С имеет параметр РежимЗаписи, который определяет, как именно документ будет сохранен. Он может принимать следующие значения:
РежимЗаписиДокумента.Запись: Документ сохраняется без выполнения движений по регистрам. Это идеальный режим для нашей задачи, так как он позволяет сохранить уже существующие движения, не вызывая механизм проведения.РежимЗаписиДокумента.Проведение: Документ сохраняется и выполняется его стандартный механизм проведения, формируя движения по регистрам. Это поведение по умолчанию при загрузке документов в КД 2.1, которое и приводит к описанной проблеме для документов с ручной корректировкой.РежимЗаписиДокумента.ОтменаПроведения: Документ сохраняется, и все его движения по регистрам удаляются.Указав РежимЗаписи = "Запись";, мы явно говорим системе, что после загрузки документа его не нужно проводить. Он будет записан со всеми движениями, которые были импортированы из файла обмена.
Документы, подобные «ОперацияБухгалтерская», имеют свою специфику. По своей природе они предназначены для прямой корректировки регистров и не имеют стандартного механизма проведения, который формировал бы движения. Их движения формируются непосредственно пользователем или программно. При переносе таких документов нам также необходимо обеспечить явную запись движений.
Если в КД 2.1 для таких документов движения по умолчанию не записываются, вы можете столкнуться с тем, что документ загрузился, но его табличные части (корректировки регистров) остаются пустыми. В этом случае в обработчике «После загрузки» ПКО для документа «ОперацияБухгалтерская» (или аналогичного) необходимо явно указать записывать движения:
Для Каждого ЭлементДвижений Из Объект.Движения Цикл
ЭлементДвижений.Записывать = Истина;
КонецЦикла;
Это гарантирует, что все движения, переданные в файле обмена, будут корректно записаны в регистры базы-приемника.
Что если нам нужно определять, проводить объект или только записывать его, в зависимости от каких-либо условий? Например, проводить только те документы, у которых нет ручной корректировки, и записывать те, у которых она есть. Проблема обработчика «Перед загрузкой» в том, что в нем отсутствует прямая ссылка на объект-источник, чтобы проверить его свойства (например, Источник.РучнаяКорректировка).
В этом случае мы можем применить тот же принцип, но на этапе выгрузки или в глобальном обработчике:
В этом обработчике у нас есть доступ к Источнику. Мы можем добавить в него свойство, которое затем будет прочитано при загрузке. Однако более элегантным будет использовать глобальный обработчик.
Это самый гибкий способ, если нам нужна условная логика, основанная на данных объекта-источника. Перейдем в глобальные обработчики правил конвертации (кнопка "Открыть глобальные обработчики" в КД 2.1).
Попытка
// Проверяем, есть ли у объекта-источника свойство "РучнаяКорректировка"
Если Источник.Метаданные().Свойства.Найти("РучнаяКорректировка") <> Неопределено Тогда
Если Источник.РучнаяКорректировка Тогда
// Если ручная корректировка установлена, устанавливаем режим записи
РежимЗаписи = "Запись";
КонецЕсли;
КонецЕсли;
Исключение
// Игнорируем ошибки, если у объекта нет такого свойства или оно не доступно
// Например, при конвертации объектов, которые не являются документами.
КонецПопытки;
Пояснения к коду:
Попытка...Исключение, чтобы избежать ошибок, если свойство РучнаяКорректировка отсутствует у объекта (например, если мы конвертируем справочник или другой объект, который не является документом и не имеет такого реквизита).Источник.Метаданные().Свойства.Найти("РучнаяКорректировка") <> Неопределено позволяет безопасно проверить наличие реквизита, прежде чем пытаться к нему обратиться.РучнаяКорректировка, мы устанавливаем переменную РежимЗаписи в значение "Запись". Эта переменная будет автоматически подхвачена системой КД 2.1 при загрузке объекта.В сообществе 1С часто можно встретить сложные и запутанные алгоритмы для решения данной задачи, которые пытаются «вручную» получить движения, записать объект, а затем записать движения обратно. Например, один из таких подходов, который можно найти на просторах интернета, выглядит примерно так (как упоминалось в форуме):
МетаданныеОбъекта = Объект.Метаданные;
Если Метаданные.Документы.Содержит(МетаданныеОбъекта) Тогда
ДвиженияВсе = Объект.Движения;
МассивДвижений = новый Массив;
Для каждого СтрокаДвижения из ДвиженияВсе Цикл
МассивДвижений.Добавить(СтрокаДвижения.Выгрузить());
КонецЦикла;
Объект.Записать(РежимЗаписиДокумента.Запись); // Это правильная часть
ИИ = 0;
Для Каждого ЭлементМассива из МассивДвижений Цикл
// Загрузим движения обратно
НаборЗаписей = Объект.Движения[ИИ];
НаборЗаписей.Прочитать();
НаборЗаписей.Загрузить(ЭлементМассива);
НаборЗаписей.Записать();
ИИ = ИИ + 1;
КонецЦикла;
КонецЕсли;
Анализируя этот код, мы видим несколько проблем и избыточность:
Объект.Движения. Попытка вручную «выгрузить» их из Объект.Движения после загрузки, а затем «загрузить» и «записать» их снова — это избыточно. Если мы правильно указываем РежимЗаписи = "Запись", система сама позаботится о сохранении всех движений, которые были переданы в файле обмена и ассоциированы с этим документом.РежимЗаписи = "Запись") происходит его проведение. Все эти сложные манипуляции с движениями после записи объекта и до его проведения не имеют смысла, так как следующим этапом проведения они будут проигнорированы или перезаписаны, если не использовать правильный режим записи.Предложенное нами решение, использующее РежимЗаписи = "Запись";, значительно проще, эффективнее и основано на понимании внутреннего механизма работы платформы 1С и инструмента КД 2.1. Оно позволяет избежать ненужного усложнения кода и ошибок, связанных с некорректной обработкой движений.
Перенос документов с признаком «Ручная корректировка движений» в 1С Конвертация данных 2.1, на первый взгляд, может показаться сложной задачей. Однако, понимая особенности процесса загрузки и поведения платформы 1С при работе с обменом данными, мы приходим к простому и элегантному решению.
Использование всего одной строки кода РежимЗаписи = "Запись"; в обработчике «Перед загрузкой» ПКО, или ее условное применение через глобальный обработчик «Перед конвертацией объекта», позволяет нам корректно переносить такие документы, сохраняя все их движения без необходимости сложных и избыточных алгоритмов. Этот подход обеспечивает целостность данных и значительно упрощает процесс настройки обмена.
Всегда стремитесь к пониманию базовых механизмов работы платформы, это позволит вам находить простые и эффективные решения для самых сложных задач конвертации данных.