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