Почему документ «Корректировка регистров» игнорирует дату запрета изменений в 1С:ERP и КА?

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

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

Выясним причину: почему форма остается доступной?

Рассмотрим архитектурную особенность документа Корректировка регистров. В отличие от стандартных первичных документов (например, Приобретение товаров и услуг), где дата документа жестко определяет период отражения в учете, корректировка является универсальным техническим инструментом.

Проанализируем логику работы БСП (Библиотеки стандартных подсистем), которая отвечает за дату запрета. Для обычных объектов проверка срабатывает при открытии формы, блокируя элементы управления. Однако в Корректировке регистров дата в «шапке» документа может не иметь ничего общего с датами движений в табличных частях. Пользователь может создать документ текущей датой, но внутри на закладках регистров указать записи за прошлый год.

По этой причине система не может однозначно заблокировать форму только на основании даты документа. Логика 1С в данном случае переносится с контроля объекта (документа) на контроль набора записей (регистра). Проверка срабатывает не в момент открытия формы, а в момент попытки записи набора записей в базу данных.

Разберем влияние типа регистра на проверку

Как показывает практика, поведение системы зависит от того, какой именно регистр вы пытаетесь изменить. Разберем ситуацию подробнее:

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

Решение проблемы через расширение: контроль периодов в строках

Если перед нами стоит задача полностью запретить использование корректировок в закрытых периодах, нам необходимо внедрить собственную проверку, фактически реализуя блокировку записи объекта по условию. Рассмотрим, как это сделать правильно. Просто проверить дату документа в шапке недостаточно — нужно проанализировать все движения.

Рассмотрим пример логики, которую можно внедрить в Расширение в модуле объекта или в подписку на событие ПередЗаписью:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    // Если документ новый или загружается, проверки могут отличаться
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

    // Проверяем дату самого документа (базовая проверка)
    Если ДатыЗапретаИзменения.ПериодИзмененияЗапрещен(ЭтотОбъект.Дата, ЭтотОбъект) Тогда
        // Здесь можно либо сразу выдать Отказ, либо продолжить проверку табличных частей
    КонецЕсли;

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

КонецПроцедуры

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

Использование типовых механизмов: подписки на события

Посмотрим на ситуацию со стороны платформенных механизмов. В типовых конфигурациях существует подписка на событие ПроверитьДатуЗапретаИзмененияПередЗаписьюНабораЗаписей. Если какой-то регистр в Корректировке регистров «пропускает» изменения, значит, он либо не включен в эту подписку, либо в самой подписке есть исключение для данного типа регистратора.

Проанализируем шаги по настройке через эту подписку:

Практические рекомендации по безопасности базы

Поскольку документ Корректировка регистров является крайне «опасным» инструментом, позволяющим обойти бизнес-логику системы, рекомендуется придерживаться следующих правил:

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

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

← На главную