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