Рассмотрим распространенную ситуацию, с которой сталкиваются разработчики при переносе данных из других баз в 1С:ERP с помощью Конвертации Данных 2 (КД2). Вы успешно загружаете исторические документы прошлых периодов (например, «Прочие расходы») вместе с их движениями по регистрам. В базе-приемнике все выглядит отлично: данные висят на просмотре, проводки сформированы. Однако стоит пользователю открыть такой документ и нажать кнопку «Записать» или «Провести», как все перенесенные движения бесследно исчезают. Проанализируем причину такого поведения системы и разберем по шагам доступные пути решения данной проблемы.
Для начала выясним причину, заглянув под капот платформы 1С:Предприятие и логики конфигурации 1С:ERP, построенной на базе Библиотеки стандартных подсистем (БСП).
Дело в том, что в момент самой загрузки данных через COM-соединение, XML-файл или другие механизмы обмена КД2 автоматически устанавливается свойство ОбменДанными.Загрузка в значение Истина. Это свойство дает команду платформе полностью игнорировать бизнес-логику при записи объекта. Система не выполняет проверки, не формирует новые движения и не очищает старые — она просто записывает переданные данные «как есть».
Но как только пользователь открывает уже загруженный документ в интерфейсе 1С:ERP и нажимает кнопку записи, документ записывается в штатном режиме, где ОбменДанными.Загрузка равно Ложь. В этот момент срабатывает типовой алгоритм ERP: перед проведением система автоматически очищает старые движения. Поскольку документ перенесен из прошлых закрытых периодов и может не иметь актуальной нормативно-справочной базы для корректного перерасчета, новые движения либо формируются пустыми, либо не формируются вообще. В результате регистры остаются чистыми.
Разберем один из самых экологичных способов решения проблемы для тех документов, в которых это предусмотрено типовым функционалом.
Если в 1С:ERP для загружаемого типа документа присутствует реквизит вроде «Ручная корректировка проводок/движений» (обычно это булево поле), то при настройке правил обмена в КД2 вам необходимо жестко передавать этот флаг со значением Истина. Посмотрим на результат: система «поймет», что движения этого документа были отредактированы вручную (в нашем случае — принудительно загружены из исторической базы). При последующей перезаписи документа пользователем стандартные алгоритмы 1С не будут пытаться очистить такие наборы записей или пересчитать их, сохраняя ваши исторические данные в неприкосновенности.
Проанализируем методологическую сторону вопроса. Переносить исторические документы «один в один» со всеми их движениями только ради того, чтобы «висели данные на просмотр» — это весьма рискованный путь в 1С:ERP. Любой пользователь с достаточными правами может случайно перепровести исторический документ, и данные необратимо исказятся.
Более правильным, надежным и безопасным подходом является конвертация старых документов (или непосредственно только их движений) в специализированный технический документ конфигурации. В ERP это документ Корректировка регистров (или Операция регламентированного учета, если речь идет исключительно о проводках бухгалтерии).
Этот документ специально спроектирован для ручного ввода и хранения статичных записей в регистрах накопления и сведений. Он не имеет сложной встроенной логики проведения по бизнес-процессам, и, соответственно, не удалит свои движения при банальной перезаписи формы.
Рассмотрим еще одну возможность, которую предоставляет Конвертация Данных 2. В правилах обмена (КД2) можно настроить выгрузку и загрузку самих документов и их движений (наборов записей регистров) абсолютно независимо друг от друга.
ОбменДанными.Загрузка = Истина, которые жестко записываются поверх документа.Важное замечание: Этот метод поможет гарантированно доставить движения в базу-приемник, но он не защитит от проблемы их исчезновения, если пользователь позже решит перепровести документ вручную. Поэтому этот метод лучше комбинировать с программным запретом на перепроведение загруженных исторических документов.
Если по какой-то причине вы не можете использовать ни «Ручную корректировку», ни «Корректировку регистров», посмотрим на вариант решения на уровне конфигуратора. Как было подсказано на форуме, можно проверить дополнительные свойства и режим загрузки в обработчике ПередЗаписью соответствующего регистра накопления.
Вы можете добавить проверку в модуль набора записей, чтобы блокировать очистку движений для определенных исторических документов. Пример реализации базовой проверки на загрузку:
Процедура ПередЗаписью(Отказ, Замещение)
// Если данные загружаются через обмен, пропускаем типовые проверки
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Дополнительная логика защиты от очистки исторических документов
// Например, проверка даты документа или специального дополнительного свойства
Если ЗначениеЗаполнено(Отбор.Регистратор.Значение) Тогда
ДокументРегистратор = Отбор.Регистратор.Значение;
Если ДокументРегистратор.Дата < '20230101' Тогда
// Запрещаем замещение (очистку) для старых документов при ручной записи
Замещение = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Внимание: Вмешательство в модуль набора записей регистра в типовой конфигурации 1С:ERP следует проводить крайне осторожно (желательно через расширения), так как снятие признака Замещение или жесткая блокировка записи может привести к коллизиям при нормальной работе системы в текущем периоде.
Мы подробно разобрали, почему платформа ведет себя подобным образом при работе с перенесенными документами. Настоятельно рекомендуем для исторических данных (когда нужна только история для отчетов) использовать документы корректировки регистров. Если же необходимо сохранить оригинальные документы, обязательно задействуйте механизмы фиксации движений, такие как флаги ручной корректировки, чтобы штатные обработчики 1С:ERP не уничтожали ваши данные при случайном перепроведении.