В практической работе с конфигурациями на платформе 1С:Предприятие (такими как 1С:УНФ, 1С:БП или 1С:ERP) разработчики и администраторы часто сталкиваются с ситуацией, когда система блокирует изменение критически важных реквизитов. Яркий пример — попытка изменить Счет учета или Счет затрат в карточке эквайрингового терминала, договора или номенклатуры, по которым в базе данных уже зарегистрированы хозяйственные операции (движения по регистрам).
В этой статье мы подробно разберем, почему платформа устанавливает подобные ограничения, чем грозит их необдуманный обход, а также пошагово изучим безопасные и эффективные методы решения этой задачи: от программного изменения реквизитов до использования стандартных сервисных обработок и расширений.
Прежде чем мы перейдем к техническим инструкциям по обходу блокировки, давайте разберем методологическую суть проблемы. Запрет на редактирование реквизитов при наличии движений — это не программный сбой, а важнейший механизм защиты целостности данных.
Счета учета используются системой в момент проведения документов для формирования записей в регистрах бухгалтерии и регистрах накопления (таких как «Запасы», «Доходы и расходы», «Управленческий»). Если мы принудительно заменим счет в карточке объекта, но оставим исторические документы нетронутыми, в информационной базе возникнет опасный прецедент:
Поэтому, если вы решились на принудительное изменение реквизита, обязательно спланируйте последующее перепроведение документов по данному объекту либо убедитесь, что это не нарушит логику закрытия периода.
---
Самый популярный способ обойти любые проверки бизнес-логики при записи объекта в 1С — это использование свойства ОбменДанными.Загрузка. Данное свойство указывает платформе, что запись производится в рамках обмена данными (синхронизации), а значит, применять строгие проверки к объекту не нужно.
Важный нюанс: свойство ОбменДанными.Загрузка доступно только у объекта базы данных (СправочникОбъект, ДокументОбъект), но отсутствует у ссылки (СправочникСсылка, ДокументСсылка).
Давайте рассмотрим пример программного кода, который позволяет найти эквайринговый терминал по наименованию и принудительно перезаписать его счет затрат:
// Определяем ссылку на нужный нам элемент справочника
СсылкаНаТерминал = Справочники.ЭквайринговыеТерминалы.НайтиПоНаименованию("Терминал Основной");
Если ЗначениеЗаполнено(СсылкаНаТерминал) Тогда
// Получаем объект для редактирования
ОбъектТерминала = СсылкаНаТерминал.ПолучитьОбъект();
// Включаем режим загрузки данных, чтобы обойти стандартные проверки ПередЗаписью
ОбъектТерминала.ОбменДанными.Загрузка = Истина;
// Устанавливаем новый правильный счет учета (затрат)
// В данном примере находим счет в плане счетов "Управленческий" по коду
НовыйСчет = ПланыСчетов.Управленческий.НайтиПоКоду("26.02");
Если ЗначениеЗаполнено(НовыйСчет) Тогда
ОбъектТерминала.СчетЗатрат = НовыйСчет;
// Записываем объект в базу данных
Попытка
ОбъектТерминала.Записать();
Сообщить("Счет затрат успешно изменен в режиме загрузки данных.");
Исключение
Сообщить("Не удалось записать объект: " + ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Указанный счет учета не найден в плане счетов.");
КонецЕсли;
КонецЕсли;
Этот код можно выполнить с помощью внешней обработки или через стандартную обработку «Групповое изменение реквизитов» (если у вас есть права администратора).
---
Если вы не хотите писать программный код, ту же самую операцию можно проделать интерактивно через встроенные инструменты 1С. Однако обычный запуск обработки «Групповое изменение реквизитов» выдаст ошибку при записи, так как по умолчанию она производит запись с флагом ОбменДанными.Загрузка = Ложь.
Давайте разберем по шагам, как задействовать скрытый режим загрузки данных в этой обработке:
Эквайринговые терминалы (или любой другой справочник, в котором нужно поменять реквизит).Благодаря установленному флагу обработка обойдет платформенные проверки, и реквизит запишется без ошибок.
---
Иногда пользователи предлагают радикальные методы: снять конфигурацию с поддержки и закомментировать участки кода, отвечающие за проверку блокировки редактирования. Мы настоятельно рекомендуем никогда не прибегать к снятию типовой конфигурации с поддержки ради разовых изменений. Это существенно усложнит последующие обновления программы.
Если вам требуется регулярно или временно отключать проверку возможности редактирования счетов, правильнее использовать механизм Расширений конфигурации. Рассмотрим, как это сделать:
ЭквайринговыеТерминалы), и его модуль объекта.ПередЗаписью).&Вместо или &Перед, прописав условие, которое будет пропускать проверку для пользователей с определенной ролью (например, «ПолныеПрава»).Пример перехвата процедуры проверки в расширении:
&Вместо("ПроверитьВозможностьИзмененияРеквизитов")
Процедура Расш1_ПроверитьВозможностьИзмененияРеквизитов(Отказ)
// Если текущий пользователь обладает административными правами, игнорируем отказ
Если РольДоступна("ПолныеПрава") Тогда
Возврат; // Выходим из процедуры проверки, позволяя записать объект
КонецЕсли;
// Для остальных пользователей выполняем стандартную проверку
ПродолжитьВызов(Отказ);
КонецПроцедуры
Использование расширений сохраняет конфигурацию на полной поддержке и позволяет безболезненно обновлять систему в будущем.
---
Если вы хотите избежать потенциальных проблем со счетами учета в будущем без принудительной записи объектов «задним числом», методологи 1С рекомендуют использовать подход с ротацией элементов справочника.
Разберем этот безопасный алгоритм:
[НЕ ИСПОЛЬЗОВАТЬ] или переместите его в архивную группу справочника, чтобы исключить его случайный выбор пользователями в новых документах.Выбор конкретного метода зависит от масштаба вашей проблемы. Если неверный счет был установлен по ошибке в самом начале ведения учета и документов немного — воспользуйтесь изменением через ОбменДанными.Загрузка = Истина с последующим перепроведением документов. Если же база ведется давно, а данные прошлых лет закрыты и подтверждены отчетностью — безопаснее пойти путем создания нового элемента справочника.