При настройке правил обмена в «1С:Конвертация данных 2.1» (КД 2.1) специалисты часто сталкиваются с ситуацией, когда документ ОперацияБух (или аналогичные ему в других конфигурациях) переносится успешно, но его проводки в базе-приемнике отсутствуют. Рассмотрим подробнее, почему это происходит и как правильно настроить правила, чтобы все движения регистров переносились корректно.
Проанализируем техническую сторону вопроса. Большинство документов в системе 1С имеют признак «Проведение», установленный в значение «Разрешить». Для таких объектов при загрузке в КД достаточно установить флаг «Проводить при загрузке», и система автоматически сформирует движения в модуле проведения.
Однако документ Операция является особенным. В его метаданных свойство «Проведение» всегда установлено в значение «Не разрешить». Это означает, что у него нет модуля проведения, и он не может быть «проведен» в привычном понимании. Движения этого документа (например, по регистру бухгалтерии Хозрасчетный) записываются непосредственно в момент сохранения самого объекта.
При использовании Конвертации данных 2.1, когда мы сопоставляем движения как табличные части, данные успешно выгружаются из источника и загружаются в коллекцию движений объекта в памяти приемника. Но платформа 1С устроена так, что при вызове метода Объект.Записать() движения не будут физически сохранены в базу данных, если для конкретного набора записей регистра не установлен специальный флаг Записывать = Истина. По умолчанию этот флаг всегда имеет значение Ложь.
Прежде чем переходить к написанию кода, проверим базовые настройки в конфигурации Конвертация данных. Разберем по шагам, что должно быть сделано в интерфейсе:
xml-файл) из базы-источника и базы-приемника убедитесь, что в обработке выгрузки установлена галочка «Выгружать движения документов».Хозрасчетный).Если эти действия выполнены, но движений всё равно нет, значит, нам необходимо «ткнуть КД носом», как выразились участники обсуждения, и принудительно заставить систему записать движения.
Выясним причину, по которой стандартные механизмы могут давать сбой. КД 2.1 не всегда автоматически устанавливает флаг записи для непроводящихся документов. Самый надежный и проверенный способ решить эту проблему — использовать обработчик ПослеЗагрузки в ПКО нужного документа.
Рассмотрим конкретный пример кода. Если нам нужно обеспечить запись только одного регистра (например, Хозрасчетный), мы можем прописать это явно:
Объект.Движения.Хозрасчетный.Записывать = Истина;
Однако документ Операция может делать записи сразу в несколько регистров: регистры бухгалтерии, регистры сведений или регистры накопления. Чтобы сделать наше решение универсальным, проанализируем ситуацию и применим цикл по всем коллекциям движений объекта.
Посмотрим на пример кода, который рекомендуется использовать в обработчике ПослеЗагрузки. Этот подход гарантирует, что какие бы движения ни были переданы из источника, все они будут корректно сохранены в приемнике:
Для Каждого НаборЗаписей Из Объект.Движения Цикл
НаборЗаписей.Записывать = Истина;
КонецЦикла;
Важное замечание: Этот код нужно размещать именно в ПКО документа Операция (или ОперацияБух) в событии ПослеЗагрузки. На этом этапе объект уже полностью заполнен данными из файла обмена, включая коллекции движений, но еще не записан окончательно в базу данных приемника.
Разберем несколько важных моментов, которые помогут избежать ошибок при переносе данных:
Записывать = Истина может привести к ошибке при попытке физической записи объекта.ОбменДанными.Загрузка = Истина.Записывать стали жестче. То, что могло работать «магическим образом» в старых версиях 8.2, теперь требует обязательного программного указания в обработчиках.Таким образом, мы выяснили, что для документа Операция стандартного сопоставления регистров в КД 2.1 часто бывает недостаточно. Принудительная установка флага Записывать = Истина в цикле по всем движениям объекта — это «золотой стандарт» решения данной проблемы, обеспечивающий надежный перенос бухгалтерских проводок между базами.