Как изменить признак «Вести по документам расчетов» в договоре 1С, если по нему уже есть движения?

Программист 1С v8.3 (Управляемые формы) Управленческий учет
← На главную

В практике работы с программами на базе 1С:Предприятие часто возникает ситуация, когда в уже существующем и используемом договоре с контрагентом необходимо включить или выключить флаг «Вести по документам расчетов с контрагентом». Однако при попытке сохранить изменения система выдает ошибку, сообщая о том, что по данному договору уже зарегистрированы документы (движения по регистрам), и редактирование этого параметра запрещено.

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

Почему 1С блокирует запись договора?

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

Если мы принудительно поменяем этот флаг в существующем договоре, возникнет конфликт: старые записи в регистрах останутся без аналитики по документам, а новые документы будут требовать её заполнения. Это приведет к тому, что в отчетах вы увидите развернутое сальдо: долг будет висеть одновременно и в плюсе, и в минусе. Именно поэтому в коде модуля объекта СправочникСсылка.ДоговорыКонтрагентов прописана жесткая проверка на наличие движений.

Способ 1: Использование режима загрузки данных (Программный)

Самый быстрый и эффективный способ, который используют программисты, — это установка специального свойства ОбменДанными.Загрузка. Этот флаг дает понять платформе, что запись производится в режиме обмена (загрузки), и большинство проверок в модуле объекта (включая проверку на наличие документов) будут проигнорированы.

Проанализируем пример кода, который позволяет выполнить это действие:


// Получаем объект договора по ссылке
ОбъектДоговора = СсылкаНаДоговор.ПолучитьОбъект();

// Устанавливаем нужное значение реквизита
ОбъектДоговора.ВестиПоДокументамРасчетовСКонтрагентом = Истина;

// Включаем режим загрузки данных для обхода проверок
ОбъектДоговора.ОбменДанными.Загрузка = Истина;

// Записываем объект
Попытка
    ОбъектДоговора.Записать();
    Сообщить("Договор успешно обновлен!");
Исключение
    Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;

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

Способ 2: Групповое изменение реквизитов (Интерфейсный)

Если вы не хотите писать код, можно воспользоваться встроенной обработкой «Групповое изменение реквизитов». Однако обычный запуск этой обработки также наткнется на проверку при записи. Чтобы обойти её, выполним следующие шаги:

  1. Откроем обработку Групповое изменение реквизитов (в разделе Администрирование — Обслуживание — Корректировка данных).
  2. Выберем объект Договоры и настроим отбор по конкретному договору.
  3. Найдем в списке реквизит Вести по документам расчетов и установим новое значение.
  4. Важный шаг: Нажмем кнопку «Дополнительные параметры».
  5. В открывшемся окне установим флажок «Записывать объекты без проверок» (в некоторых версиях это называется «Выполнять в режиме загрузки данных»).
  6. Нажмем кнопку «Изменить реквизиты».

При включении этого параметра обработка программно установит ОбменДанными.Загрузка = Истина, и договор будет успешно сохранен.

Способ 3: Универсальный редактор реквизитов

Существуют внешние обработки, такие как «Универсальный редактор реквизитов» для управляемых форм. Они работают по схожему принципу, позволяя менять значения полей напрямую в базе данных. Выясним причину их популярности: они часто позволяют менять даже те поля, которые заблокированы платформой на уровне интерфейса (например, тип договора или валюту), предоставляя более гибкие инструменты контроля над свойством ОбменДанными.

Критические последствия: что делать после изменения?

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

  1. Перепроведение документов. Если период открыт, самым правильным решением будет перепровести все документы по данному договору с начала ведения учета. В этом случае система при проведении увидит новую настройку договора и заполнит аналитику по документам расчетов в регистрах.
  2. Использование документа «Корректировка долга». Если период закрыт и перепроведение невозможно, необходимо воспользоваться документом Корректировка долга (или Взаимозачет задолженности). Вам потребуется «перебросить» остатки с пустой аналитики «Документ расчетов» на конкретные накладные или заказы, чтобы выровнять регистры.
  3. Проверка отчетов. После внесения изменений обязательно сформируйте отчет «Ведомость по взаиморасчетам с контрагентами» (с детализацией до документов расчетов). Если вы видите одинаковые суммы с плюсом и минусом по одному договору, значит, аналитика «разъехалась» и требует корректировки.

Рекомендация по безопасному переходу

Если документов по договору много, а период закрыт давно, мы рекомендуем рассмотреть альтернативный «чистый» вариант:

Этот метод гарантирует, что исторические данные в закрытых периодах останутся неизменными, а новый учет будет вестись корректно и без технических «костылей».

← На главную