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