Как сохранить бухгалтерские проводки неизменными при редактировании документов в базе-приемнике?

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

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

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

Вариант 1. Использование флага «Ручная корректировка»

Рассмотрим самое быстрое решение, к которому пришел автор темы. В типовых конфигурациях (включая редакции на обычных формах, например «Бухгалтерия предприятия 2.0») у документов предусмотрен реквизит РучнаяКорректировка.

Если при переносе данных через «Конвертацию данных» или правила обмена установить этот признак в значение Истина, платформа блокирует автоматическое обновление движений документа:

  1. При загрузке документа в базу-приемник устанавливаем реквизит РучнаяКорректировка = Истина.
  2. Пользователи базы-приемника могут открывать документ и корректировать управленческие реквизиты.
  3. При попытке штатного перепроведения система видит активный флаг ручной корректировки и не перезаписывает движения регистра бухгалтерии.

Важные ограничения и риски данного подхода:

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

  1. Блокировка управленческих движений: в ряде типовых конфигураций флаг ручной корректировки блокирует перезапись движений абсолютно по всем регистрам документа. В таком случае управленческие регистры также не обновятся при изменении данных документа.
  2. Очистка при отмене проведения: флаг не защищает движения от отмены проведения или пометки на удаление. Если пользователь снимет документ с проведения или пометит на удаление, платформа автоматически удалит все записи регистра Хозрасчетный.
  3. Разрыв связи с печатными формами: первичный документ будет содержать одни суммы и номенклатуру, а бухгалтерский регистр — прежние, что вызовет вопросы при внутренних аудитах.

Чтобы минимизировать риски при выборе этого варианта, обязательно настроим права доступа в базе-приемнике: отключим у пользователей право интерактивной отмены проведения и пометки на удаление документов, имеющих бухгалтерские проводки, а также заблокируем доступ к снятию флага ручной корректировки.

Вариант 2. Разделение регистраторов через документ «Операция»

Разберем наиболее надежный архитектурный подход, исключающий коллизии между контурами учета. Вместо того чтобы пытаться сохранить неизменными проводки внутри общего документа, разделим управленческий первичный документ и бухгалтерские записи на уровне объектов метаданных базы-приемника.

  1. Первичные документы переносятся в базу-приемник для управленцев, но флаг отражения в бухгалтерском учете в них снимается. Документ формирует движения исключительно по управленческим регистрам.
  2. Бухгалтерские проводки из источника загружаются в типовой документ Операция (или КорректировкаЗаписейРегистров).
  3. Документ Операция связывается с основным управленческим документом через реквизит основания или механизм дополнительных реквизитов.

Посмотрим на преимущества такого разделения: управленцы могут без ограничений редактировать, перепроводить и рассчитывать свои первичные документы, не затрагивая регламентированные бухгалтерские итоги, так как регистратором проводок выступает отдельный закрытый от редактирования документ.

Вариант 3. Программный перехват в подписках на события

Если конфигурацию можно дорабатывать, а разделять документы на два объекта нежелательно, реализуем сохранение бухгалтерских проводок программно. Рассмотрим вариант реализации через подписки на события ПередЗаписью и ОбработкаПроведения.

Логика работы следующая: перед перепроведением документа мы считываем существующие бухгалтерские проводки, помещаем их во временную структуру, а в процессе проведения принудительно восстанавливаем их в наборе записей.

Посмотрим на пример кода в модуле подписки на событие ПередЗаписью документа:


// В подписке ПередЗаписью сохраняем существующие проводки
Если Не Источник.ЭтоНовый() И Источник.Проведен Тогда
    НаборБух = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
    НаборБух.Отбор.Регистратор.Установить(Источник.Ссылка);
    НаборБух.Прочитать();
    
    // Выгружаем текущие проводки в таблицу значений
    ТаблицаПроводок = НаборБух.Выгрузить();
    
    // Помещаем таблицу в ДополнительныеСвойства документа
    Источник.ДополнительныеСвойства.Вставить("СохраненныеПроводкиБух", ТаблицаПроводок);
КонецЕсли;

Теперь разберем, как восстановить эти проводки в процедуре обработки проведения или соответствующей подписке:


// В обработке проведения восстанавливаем проводки
Если Движения.Хозрасчетный <> Неопределено Тогда
    ТаблицаПроводок = Неопределено;
    Если ДокументОбъект.ДополнительныеСвойства.Свойство("СохраненныеПроводкиБух", ТаблицаПроводок) Тогда
        Если ТаблицаПроводок <> Неопределено И ТаблицаПроводок.Количество() > 0 Тогда
            Движения.Хозрасчетный.Очистить();
            Движения.Хозрасчетный.Загрузить(ТаблицаПроводок);
            Движения.Хозрасчетный.Записывать = Истина;
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

Также важно заблокировать непреднамеренную отмену проведения перенесенных документов. Для этого в событии ПередЗаписью анализируем изменение признака проведения:


Если Не Источник.ЭтоНовый() Тогда
    ПризнакПроведенВБазе = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Источник.Ссылка, "Проведен");
    Если ПризнакПроведенВБазе И Не Источник.Проведен Тогда
        // Проверяем, был ли документ загружен из бухгалтерской базы
        Если Источник.ДополнительныеСвойства.Свойство("ПеренесенИзДругойБазы") Тогда
            ВызватьИсключение "Отмена проведения документов, загруженных из бухгалтерии, запрещена!";
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

Вариант 4. Настройка режима удаления движений

Выясним еще одну системную возможность платформы 1С. В свойствах метаданных конкретного документа существует свойство Удаление движений. По умолчанию оно установлено в значение Удалять автоматически.

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

  1. В обработчике ОбработкаПроведения мы очищаем и формируем заново только те регистры, которые относятся к управленческому учету.
  2. Для регистра Хозрасчетный устанавливаем свойство флага записи в ложь: Движения.Хозрасчетный.Записывать = Ложь;.
  3. В этом случае платформа не будет очищать существующие записи бухгалтерского регистра перед проведением, и загруженные проводки сохранятся в исходном виде.

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

← На главную