Как программно или с помощью стандартных средств изменить заблокированный счет учета в 1С?

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

В практической работе с конфигурациями на платформе 1С:Предприятие (такими как 1С:УНФ, 1С:БП или 1С:ERP) разработчики и администраторы часто сталкиваются с ситуацией, когда система блокирует изменение критически важных реквизитов. Яркий пример — попытка изменить Счет учета или Счет затрат в карточке эквайрингового терминала, договора или номенклатуры, по которым в базе данных уже зарегистрированы хозяйственные операции (движения по регистрам).

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

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

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

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

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

Поэтому, если вы решились на принудительное изменение реквизита, обязательно спланируйте последующее перепроведение документов по данному объекту либо убедитесь, что это не нарушит логику закрытия периода.

---

Способ 1. Программное изменение через свойство ОбменДанными.Загрузка

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

Важный нюанс: свойство ОбменДанными.Загрузка доступно только у объекта базы данных (СправочникОбъект, ДокументОбъект), но отсутствует у ссылки (СправочникСсылка, ДокументСсылка).

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


// Определяем ссылку на нужный нам элемент справочника
СсылкаНаТерминал = Справочники.ЭквайринговыеТерминалы.НайтиПоНаименованию("Терминал Основной");

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

Этот код можно выполнить с помощью внешней обработки или через стандартную обработку «Групповое изменение реквизитов» (если у вас есть права администратора).

---

Способ 2. Использование стандартной обработки «Групповое изменение реквизитов»

Если вы не хотите писать программный код, ту же самую операцию можно проделать интерактивно через встроенные инструменты 1С. Однако обычный запуск обработки «Групповое изменение реквизитов» выдаст ошибку при записи, так как по умолчанию она производит запись с флагом ОбменДанными.Загрузка = Ложь.

Давайте разберем по шагам, как задействовать скрытый режим загрузки данных в этой обработке:

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

Благодаря установленному флагу обработка обойдет платформенные проверки, и реквизит запишется без ошибок.

---

Способ 3. Использование расширений конфигурации (вместо снятия с поддержки)

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

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

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

Пример перехвата процедуры проверки в расширении:


&Вместо("ПроверитьВозможностьИзмененияРеквизитов")
Процедура Расш1_ПроверитьВозможностьИзмененияРеквизитов(Отказ)
    // Если текущий пользователь обладает административными правами, игнорируем отказ
    Если РольДоступна("ПолныеПрава") Тогда
        Возврат; // Выходим из процедуры проверки, позволяя записать объект
    КонецЕсли;
    
    // Для остальных пользователей выполняем стандартную проверку
    ПродолжитьВызов(Отказ);
КонецПроцедуры

Использование расширений сохраняет конфигурацию на полной поддержке и позволяет безболезненно обновлять систему в будущем.

---

Методологически правильный (безопасный) путь решения проблемы

Если вы хотите избежать потенциальных проблем со счетами учета в будущем без принудительной записи объектов «задним числом», методологи 1С рекомендуют использовать подход с ротацией элементов справочника.

Разберем этот безопасный алгоритм:

  1. Вместо редактирования старой карточки эквайрингового терминала (в которой накопились неверные движения) создайте в справочнике новый элемент с абсолютно аналогичными параметрами, но укажите верный счет учета.
  2. Старому терминалу в наименовании допишите пометку [НЕ ИСПОЛЬЗОВАТЬ] или переместите его в архивную группу справочника, чтобы исключить его случайный выбор пользователями в новых документах.
  3. Все новые хозяйственные операции оформляйте на новый терминал. Старые документы останутся нетронутыми, отчетность за закрытые периоды не исказится, а новые данные будут формироваться по верным счетам учета.

Выбор конкретного метода зависит от масштаба вашей проблемы. Если неверный счет был установлен по ошибке в самом начале ведения учета и документов немного — воспользуйтесь изменением через ОбменДанными.Загрузка = Истина с последующим перепроведением документов. Если же база ведется давно, а данные прошлых лет закрыты и подтверждены отчетностью — безопаснее пойти путем создания нового элемента справочника.

← На главную