В типовых конфигурациях 1С справочник ДоговорыКонтрагентов является подчиненным справочнику Контрагенты. Если по договору уже зарегистрированы документы или сделаны проводки по регистрам бухгалтерии и накопления, платформа блокирует интерактивное изменение реквизита Владелец в форме элемента. Разберем, почему возникает данное ограничение, к каким последствиям может привести принудительная смена владельца и как правильно решить эту задачу программно и методологически.
Рассмотрим структуру взаиморасчетов в системе. В регистре бухгалтерии Хозрасчетный учет по счетам 60, 62 и 76 ведется в разрезе двух жестко связанных аналитик: Субконто 1 — это Контрагенты, а Субконто 2 — Договоры контрагентов. Система рассчитывает на то, что договор строго принадлежит контрагенту из первого субконто. Если изменить только владельца у договора, возникнет разрыв связей между аналитиками, что приведет к искажению оборотно-сальдовых ведомостей и ошибкам регламентных процедур (зачет авансов, переоценка валюты, закрытие месяца).
Если произошла техническая ошибка ввода, период открыт для редактирования и требуется исправить данные в самом договоре и документах, воспользуемся программной записью объекта в режиме загрузки данных. Установка флага ОбменДанными.Загрузка = Истина позволяет обойти встроенные проверки в модуле объекта справочника.
Разберем по шагам, как выполнить программную замену:
Контрагент.Посмотрим на пример программного кода для изменения владельца договора:
ДоговорОбъект = СсылкаНаДоговор.ПолучитьОбъект();
ДоговорОбъект.ОбменДанными.Загрузка = Истина;
ДоговорОбъект.Владелец = НовыйКонтрагентСсылка;
ДоговорОбъект.Записать();
После изменения самого договора обязательно проанализируем связанные документы. Чтобы в базе не возникла рассинхронизация между шапкой документа и его проводками, заменим значение контрагента в документах и перезапишем их движения:
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(СсылкаНаДоговор);
ТаблицаСсылок = НайтиПоСсылкам(МассивСсылок);
Для Каждого Стр Из ТаблицаСсылок Цикл
Если Метаданные.Документы.Содержит(Стр.Данные.Метаданные()) Тогда
ДокОбъект = Стр.Данные.ПолучитьОбъект();
Если ДокОбъект.Метаданные().Реквизиты.Найти("Контрагент") <> Неопределено Тогда
ДокОбъект.Контрагент = НовыйКонтрагентСсылка;
ДокОбъект.ОбменДанными.Загрузка = Истина;
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Для массовой замены ссылок в информационных базах можно использовать типовую внешнюю обработку с диска ИТС — ПоискИЗаменаЗначений.epf. При вызове функций замены элементов с отключением контроля записи система выполняет прямое перенаправление ссылок во всех таблицах базы данных.
Рассмотрим, как работает программный интерфейс пакетной замены ссылок:
Посмотрим на пример вызова функции замены из состава типовых сервисных алгоритмов:
// Вызов функции пакетной замены ссылок в объектах
ТаблицаСсылок = Новый ТаблицаЗначений;
// Заполняем ТаблицаСсылок парами ИсходнаяСсылка - НоваяСсылка
вВыполнитьЗаменуЭлементов(Заменяемые, ТаблицаСсылок, Истина, Истина);
Важно: При использовании прямой замены ссылок необходимо одновременно заменять как ссылку на старый договор на новый договор, так и ссылку на старого контрагента на нового во всех регистраторах, чтобы исключить расхождения аналитики в бухгалтерском регистре Хозрасчетный.
Если документы относятся к закрытому периоду, по которому уже сдана бухгалтерская и налоговая отчетность, прямое редактирование объектов задним числом категорически не рекомендуется. В этом случае правильным решением является отражение переноса задолженности текущей датой.
Разберем порядок действий при методологическом подходе:
Такой подход гарантирует юридическую чистоту взаиморасчетов, сохраняет неизменность сданной отчетности и исключает технические ошибки при последующем формировании отчетов Оборотно-сальдовая ведомость по счету и Акт сверки взаиморасчетов.