Как пользователь смог изменить документ в закрытом периоде в 1С:УПП: разбираем причины и механизмы обхода

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет Промышленность, строительство и АПК
← На главную

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

Анализ ситуации: как «обманули» дату запрета

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

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

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

Технические нюансы проверки ДатыЗапретаРедактирования

Рассмотрим, как это выглядит с точки зрения программного кода. В конфигурации 1С:УПП проверка даты запрета обычно инициируется в модуле объекта в процедуре ПередЗаписью или через подписки на события. Проанализируем типичный алгоритм проверки:


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

    // Проверка даты запрета
    Если Не ПроверитьДатуЗапрета(ЭтотОбъект) Тогда
        Отказ = Истина;
        Возврат;
    КонецЕсли;
КонецПроцедуры

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

Роль полных прав и специфических настроек

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

В регистре сведений "Настройки прав доступа пользователей" или в константах может существовать флаг "Применять дату запрета для пользователей с полными правами". Если эта галочка не установлена, то любой пользователь с ролью ПолныеПрава может редактировать документы в любом периоде, несмотря на установленную дату запрета. При этом в Журнале регистрации изменений самой даты запрета не будет, так как пользователь её не менял — он просто воспользовался своим правом её игнорировать.

Также проанализируем ситуацию с отсутствием записей в Журнале регистрации. Если вы не видите события изменения документа, проверьте следующие настройки:

Использование привилегированного режима и внешних обработок

Рассмотрим еще один сценарий — программный обход. В 1С:УПП существует возможность записи документа в так называемом привилегированном режиме. Если код выполняется на стороне сервера внутри фрагмента:


УстановитьПривилегированныйРежим(Истина);
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
УстановитьПривилегированныйРежим(Ложь);

В этом случае проверки прав доступа (включая RLS) могут игнорироваться. Если на предприятии используются внешние обработки для автоматического формирования или корректировки документов, они могут обходить дату запрета, если разработчик не предусмотрел явный вызов процедур проверки.

Рекомендации по предотвращению подобных инцидентов

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

  1. Настройка прав: Обязательно проверьте, чтобы дата запрета распространялась на пользователей с полными правами, если это не противоречит вашей политике безопасности. Для администраторов лучше устанавливать персональную дату запрета, которая будет "отставать" от общей всего на несколько дней для оперативных правок.
  2. Доработка проверки: Если вы столкнулись с обходом через смену даты (из будущего в прошлое), рассмотрите возможность модификации кода в подписке на событие ПередЗаписью. Проверяйте как ЭтотОбъект.Дата, так и ЭтотОбъект.Ссылка.Дата (значение в базе до записи).
  3. Контроль обменов: Помните, что механизм ОбменДанными.Загрузка = Истина отключает большинство проверок. Если сотрудники имеют доступ к загрузке данных через COM-соединение или XML, они могут менять документы в обход всех экранных ограничений.
  4. Регулярный аудит: Настройте отчет по Журналу регистрации, который будет уведомлять о любых изменениях документов с датой, меньшей установленной даты запрета.

Подводя итог, можно сказать, что ситуация в 1С:УПП была вызвана сочетанием человеческого фактора (попытка исправить ошибку в последний момент) и технической особенности проверки дат. Своевременный контроль настроек прав и понимание логики работы платформы позволяют избежать подобных "детективных" историй в будущем.

← На главную