Как изменить владельца у договора контрагента, если по нему уже есть движения?

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

В типовых конфигурациях 1С справочник ДоговорыКонтрагентов является подчиненным справочнику Контрагенты. Если по договору уже зарегистрированы документы или сделаны проводки по регистрам бухгалтерии и накопления, платформа блокирует интерактивное изменение реквизита Владелец в форме элемента. Разберем, почему возникает данное ограничение, к каким последствиям может привести принудительная смена владельца и как правильно решить эту задачу программно и методологически.

Рассмотрим структуру взаиморасчетов в системе. В регистре бухгалтерии Хозрасчетный учет по счетам 60, 62 и 76 ведется в разрезе двух жестко связанных аналитик: Субконто 1 — это Контрагенты, а Субконто 2 — Договоры контрагентов. Система рассчитывает на то, что договор строго принадлежит контрагенту из первого субконто. Если изменить только владельца у договора, возникнет разрыв связей между аналитиками, что приведет к искажению оборотно-сальдовых ведомостей и ошибкам регламентных процедур (зачет авансов, переоценка валюты, закрытие месяца).

Способ 1. Программная смена владельца с отключением проверок

Если произошла техническая ошибка ввода, период открыт для редактирования и требуется исправить данные в самом договоре и документах, воспользуемся программной записью объекта в режиме загрузки данных. Установка флага ОбменДанными.Загрузка = Истина позволяет обойти встроенные проверки в модуле объекта справочника.

Разберем по шагам, как выполнить программную замену:

  1. Находим нужный договор и создаем объект для записи.
  2. Устанавливаем режим обмена данными для обхода типовых ограничений.
  3. Заменяем владельца на нового контрагента и записываем объект.
  4. Находим все документы, в которых фигурирует этот договор, и синхронизируем в них реквизит Контрагент.
  5. Перепроводим документы либо программно корректируем субконто в наборах записей регистров.

Посмотрим на пример программного кода для изменения владельца договора:


ДоговорОбъект = СсылкаНаДоговор.ПолучитьОбъект();
ДоговорОбъект.ОбменДанными.Загрузка = Истина;
ДоговорОбъект.Владелец = НовыйКонтрагентСсылка;
ДоговорОбъект.Записать();

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


МассивСсылок = Новый Массив;
МассивСсылок.Добавить(СсылкаНаДоговор);
ТаблицаСсылок = НайтиПоСсылкам(МассивСсылок);

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

Способ 2. Использование обработки «Поиск и замена значений»

Для массовой замены ссылок в информационных базах можно использовать типовую внешнюю обработку с диска ИТС — ПоискИЗаменаЗначений.epf. При вызове функций замены элементов с отключением контроля записи система выполняет прямое перенаправление ссылок во всех таблицах базы данных.

Рассмотрим, как работает программный интерфейс пакетной замены ссылок:

  1. Формируем список заменяемых и заменяющих ссылок.
  2. Передаем таблицу соответствий в процедуру замены элементов.
  3. Отключаем контроль записи и выполняем операцию в транзакции.

Посмотрим на пример вызова функции замены из состава типовых сервисных алгоритмов:


// Вызов функции пакетной замены ссылок в объектах
ТаблицаСсылок = Новый ТаблицаЗначений;
// Заполняем ТаблицаСсылок парами ИсходнаяСсылка - НоваяСсылка
вВыполнитьЗаменуЭлементов(Заменяемые, ТаблицаСсылок, Истина, Истина);

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

Способ 3. Методологический перенос задолженности (без изменения истории)

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

Разберем порядок действий при методологическом подходе:

  1. Создаем новый договор, подчиненный правильному контрагенту.
  2. Создаем типовой документ Корректировка долга.
  3. Выбираем вид операции Перенос задолженности (или Взаимозачет).
  4. Указываем старого контрагента со старым договором и нового контрагента с новым договором.
  5. Заполняем суммы остатков и проводим документ текущей датой.

Такой подход гарантирует юридическую чистоту взаиморасчетов, сохраняет неизменность сданной отчетности и исключает технические ошибки при последующем формировании отчетов Оборотно-сальдовая ведомость по счету и Акт сверки взаиморасчетов.

← На главную