К статье
Практический материал

Администрирование · 11 мин

Как программно установить дату запрета редактирования в 1С

Как программно установить дату запрета редактирования в 1С: константа, функциональная опция, код для обычных и управляемых форм, проверка результата и типичные ошибки.

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

Программная установка даты запрета сводится к записи значения в константу или в специальный регистр сведений — в зависимости от того, как реализован механизм в конкретной конфигурации. В типовых решениях на базе Библиотеки стандартных подсистем (БСП) используется подсистема «Даты запрета изменения данных», и у неё есть программный интерфейс.

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

Где хранится дата запрета в типовых конфигурациях

В конфигурациях на базе БСП (1С:Бухгалтерия 3.0, ЗУП 3.1, ERP, УТ 11) дата запрета редактирования хранится не в одном месте, а распределённо. Есть общая дата для всех пользователей и персональные даты для конкретных пользователей или групп. Технически значения сохраняются в регистре сведений или в константе — точное хранилище зависит от версии БСП.

Интерактивно настройка находится в разделе «Администрирование» → «Поддержка и обслуживание» → «Даты запрета изменения данных». Там же можно увидеть, включена ли сама возможность ограничения: если флажок снят, программная запись значений не даст эффекта — проверка просто не выполняется.

Для программной работы с подсистемой предназначен общий модуль ДатыЗапретаИзменения (в серверном варианте — ДатыЗапретаИзмененияСлужебный). Он содержит функции проверки и процедуры установки дат. Прямая запись в регистры подсистемы без использования её API не рекомендуется: структура хранения может меняться между версиями БСП.

Программная установка даты запрета через БСП

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

УстановитьПривилегированныйРежим(Истина);

Константы.ДатаЗапретаРедактирования.Установить(Дата(2026, 12, 31));

УстановитьПривилегированныйРежим(Ложь);

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

Если нужно установить дату для конкретного пользователя или группы, придётся работать с регистром сведений подсистемы. Логика такая: создаётся набор записей, указывается пользователь (или группа), раздел данных и сама дата:

УстановитьПривилегированныйРежим(Истина);

МенеджерЗаписи = РегистрыСведений.ДатыЗапретаИзмененияДанных.СоздатьМенеджерЗаписи();

МенеджерЗаписи.Пользователь = Справочники.Пользователи.НайтиПоНаименованию("Иванов И.И.");

МенеджерЗаписи.Раздел = ПланыВидовХарактеристик.РазделыДатЗапретаИзменения.НайтиПоНаименованию("Бухгалтерский учет");

МенеджерЗаписи.ДатаЗапрета = Дата(2026, 12, 31);

МенеджерЗаписи.Записать();

УстановитьПривилегированныйРежим(Ложь);

Точные имена регистра, измерений и плана видов характеристик смотрите в своей конфигурации — они зависят от версии БСП. Привилегированный режим нужен, потому что настройки обычно доступны только администраторам.

Установка даты запрета в самописной конфигурации

Если конфигурация собственная и подсистемы БСП в ней нет, механизм придётся реализовать самостоятельно. Минимальный рабочий вариант состоит из трёх элементов: константа для хранения даты, функция проверки и подписка на событие ПередЗаписью документов.

Сначала создайте константу ДатаЗапретаРедактирования типа «Дата». Затем добавьте общий модуль с функцией проверки:

Функция РедактированиеЗапрещено(ДатаДокумента) Экспорт

ДатаЗапрета = Константы.ДатаЗапретаРедактирования.Получить();

Если Не ЗначениеЗаполнено(ДатаЗапрета) Тогда

Возврат Ложь;

КонецЕсли;

Возврат ДатаДокумента <= КонецДня(ДатаЗапрета);

КонецФункции

Далее создайте подписку на событие «ПередЗаписью» для документов и в обработчике вызывайте проверку:

Процедура ПроверкаДатыЗапретаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт

Если РедактированиеЗапрещено(Источник.Дата) Тогда

Отказ = Истина;

ВызватьИсключение "Редактирование данных за закрытый период запрещено.";

КонецЕсли;

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

Программная установка даты в этом случае — одна строка: Константы.ДатаЗапретаРедактирования.Установить(НоваяДата). Учтите, что подписка на запись не сработает при обмене данными, если в обработчике стоит проверка ОбменДанными.Загрузка — добавьте её осознанно, чтобы не блокировать загрузку.

Автоматическое закрытие периода регламентным заданием

Частая задача — автоматически закрывать месяц или квартал по расписанию. Для этого создаётся регламентное задание, которое раз в период (например, 10-го числа каждого месяца) сдвигает дату запрета на конец предыдущего месяца.

Процедура ЗакрытьПредыдущийМесяц() Экспорт

УстановитьПривилегированныйРежим(Истина);

НоваяДата = НачалоМесяца(ТекущаяДатаСеанса()) - 1;

Константы.ДатаЗапретаРедактирования.Установить(НоваяДата);

ЗаписьЖурналаРегистрации("Закрытие периода",

УровеньЖурналаРегистрации.Информация, , ,

"Установлена дата запрета: " + Формат(НоваяДата, "ДЛФ=D"));

УстановитьПривилегированныйРежим(Ложь);

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

Запись в журнал регистрации обязательна: если задание не отработает или установит неожиданную дату, по журналу можно восстановить картину. Для регламентного задания укажите расписание и пользователя, от имени которого оно выполняется, — у него должны быть права на изменение констант.

Порядок действий для автозакрытия периода
  1. 1
    Создайте общий модуль с процедурой установки даты запрета
  2. 2
    Добавьте регламентное задание и привяжите к нему эту процедуру
  3. 3
    Настройте расписание, например 10-е число каждого месяца
  4. 4
    Укажите пользователя с правами на изменение констант
  5. 5
    Проверьте работу на копии базы и контролируйте журнал регистрации

Проверка, что дата запрета реально работает

После программной установки обязательно проверьте результат, причём под обычным пользователем, а не под администратором — у администратора часто есть право «Изменение данных до даты запрета», и он не заметит блокировки.

Минимальная проверка: войдите под тестовым пользователем, откройте документ с датой раньше установленной, попробуйте изменить и записать его. Должно появиться сообщение о запрете. Затем откройте документ текущего периода и убедитесь, что он записывается нормально.

Контрольные точки

Как проверить результат

Запись старого документа
Норма

Система отказывает в записи с сообщением о запрете

Тревожный признак

Документ записывается без предупреждений

Запись документа текущего периода
Норма

Документ проводится штатно

Тревожный признак

Блокируются и актуальные документы — дата установлена слишком поздняя

Значение константы
Норма

В константе записана ожидаемая дата

Тревожный признак

Константа пуста или дата отличается от заданной

Журнал регистрации
Норма

Есть запись об установке даты от регламентного задания

Тревожный признак

Ошибки прав доступа или задание не выполнялось

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

Типичные ошибки при программной установке

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

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

Типичные ошибки
01
Запись в неправильную константу или регистр — дата сохраняется, но проверка её не читает
02
Отсутствие привилегированного режима — ошибка прав доступа при записи
03
Проверка только под администратором — блокировка незаметна из-за права обхода запрета
04
Граница периода посчитана неверно — заблокирован текущий месяц или открыт лишний день
05
В подписке ПередЗаписью не учтён режим ОбменДанными.Загрузка — обмен падает с ошибкой

Третья группа ошибок связана с границами периода. Помните, что дата запрета обычно трактуется включительно: документы с датой, равной дате запрета, тоже блокируются. Если нужно закрыть декабрь, дата запрета — 31 декабря, а не 1 января.

Ограничения и альтернативные подходы

Дата запрета редактирования — не инструмент защиты от злоумышленника. Пользователь с полными правами может снять или сдвинуть дату через интерфейс. Для реального контроля комбинируйте механизм с разграничением прав: уберите у рядовых пользователей доступ к настройкам дат запрета и право «Администрирование данных».

Альтернативы в зависимости от задачи: закрытие периода в бухгалтерском учёте через регламентные операции (не блокирует редактирование, но фиксирует итоги), запрет изменения через RLS на уровне записей, версионирование объектов для аудита изменений. Дата запрета — самый простой и наглядный вариант, когда нужно именно запретить правку старых документов.

Сравнение вариантов защиты периода

Дата запрета редактирования

Простая настройка и понятное поведение; не защищает от администратора и не ведёт аудит изменений

Подписка ПередЗаписью с проверкой

Гибкая логика под любые условия; требует разработки и сопровождения кода

RLS на уровне записей

Тонкое разграничение по пользователям; сложнее в настройке и может снижать производительность запросов

Версионирование объектов

Сохраняет историю изменений для аудита; не запрещает редактирование само по себе

FAQ

Почему после установки даты запрета документы всё равно редактируются?

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

Можно ли установить разные даты запрета для разных организаций?

В типовых конфигурациях на базе БСП — да, если включены разделы дат запрета: тогда дату можно задать отдельно по разделам учёта и организациям. В самописной конфигурации это потребует хранения дат в регистре сведений с измерением «Организация» вместо одной константы.

Дата запрета считается включительно или нет?

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

Нужен ли привилегированный режим для установки даты?

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

Блокирует ли дата запрета загрузку данных через обмен?

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

Как отменить дату запрета программно?

Достаточно записать пустую дату в ту же константу: Константы.ДатаЗапретаРедактирования.Установить('00010101'). Для регистров сведений с персональными датами нужно удалить соответствующие записи или установить в них пустое значение.

Итог

Что важно запомнить

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