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

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет Финансы и профессиональные услуги
← На главную

Механизм контроля даты запрета изменения данных является краеугольным камнем для обеспечения целостности и достоверности бухгалтерского и управленческого учета в системе 1С. Он предотвращает несанкционированные или случайные изменения в уже закрытых отчетных периодах, что критически важно для корректного формирования отчетности и соблюдения законодательства. Однако на практике часто возникает потребность во временном доступе к таким периодам для внесения корректировок, обнаруженных уже после "закрытия". Типовой функционал 1С не предусматривает автоматического предоставления и последующего отзыва доступа по истечении заданного срока. Давайте подробно разберем, как мы можем реализовать такую доработку.

Стандартный функционал: возможности и ограничения

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

  1. Общая дата запрета: Вы можете установить единую дату запрета, которая будет действовать для всех пользователей информационной базы. Это базовый уровень защиты.
  2. Индивидуальные настройки для пользователей/групп: Система позволяет задавать различные даты запрета для конкретных пользователей или целых групп. Например, бухгалтерам можно разрешить редактирование до определенной даты, а другим отделам установить более ранний запрет.
  3. Ограничения по разделам или объектам: В некоторых конфигурациях возможно настроить дату запрета не для всей базы, а для отдельных разделов учета или даже конкретных видов объектов. Это повышает гибкость управления.

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

Концепция реализации: как это работает (идеальный сценарий)

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

Когда пользователю (например, "Иванову") требуется внести изменения в закрытый период (скажем, май 2025 года) на ограниченное время (например, на два дня), он формирует заявку. Эта заявка содержит:

  1. Имя пользователя ("Иванов").
  2. Период, к которому требуется доступ (например, "с 01.05.2025 по 31.05.2025").
  3. Срок, на который требуется открыть доступ (например, "2 дня").
  4. Причину запроса (например, "Исправление ошибки в документе реализации").

Заявка отправляется на согласование финансовому директору или другому ответственному лицу. После согласования заявки умный механизм автоматически выполняет следующие действия:

Такой подход минимизирует ручные операции, снижает риск ошибок и обеспечивает прозрачность процесса.

Архитектура доработки: ключевые компоненты 1С

Для реализации описанного функционала нам потребуются следующие объекты платформы 1С:

  1. Документ "Заявка на временный доступ": Этот документ будет служить инструментом для пользователя, чтобы сформулировать свой запрос. Он будет хранить информацию о заявителе, запрашиваемом периоде, сроке доступа и причине.
  2. Регистр сведений "Временные разрешения на редактирование": В этом регистре мы будем хранить информацию обо всех активных и истекших временных разрешениях. Это будет своего рода "белый список" для проверки даты запрета.
  3. Регламентное задание: Это ключевой элемент автоматизации. Регламентное задание будет регулярно (например, раз в час или раз в день) проверять истекшие разрешения и автоматически их отзывать.
  4. Общие модули и функции: Мы будем использовать существующие общие модули 1С, отвечающие за проверку даты запрета, дополняя их логикой проверки нашего регистра временных разрешений.
  5. Роли и права доступа: Важно правильно настроить права доступа к новому документу и регистру, а также к функционалу согласования, чтобы обеспечить безопасность и соблюдение принципа наименьших привилегий.
  6. Журнал регистрации: Для аудита всех действий, связанных с выдачей и отзывом временного доступа, а также с изменениями в закрытых периодах, мы будем активно использовать системный журнал регистрации и, возможно, дополнительный специализированный журнал.

Пошаговая реализация системы временного доступа

Давайте разберем процесс реализации такой системы по шагам.

Шаг 1: Проектирование и создание объекта "Заявка на временный доступ"

Первым делом мы создадим новый документ или, возможно,


РегистрСведений
с формой, который будет использоваться для оформления запросов. Назовем его, например, ЗаявкаНаВременныйДоступ.

Этот объект должен содержать следующие реквизиты:

  1. Пользователь (Заявитель): Ссылка на справочник Пользователи. Автоматически заполняется текущим пользователем.
  2. Ответственный (Согласующий): Ссылка на справочник Пользователи. Тот, кто должен согласовать заявку.
  3. ДатаНачалаПериода: Дата, с которой начинается запрашиваемый период доступа.
  4. ДатаОкончанияПериода: Дата, которой заканчивается запрашиваемый период доступа.
  5. СрокДоступаВДнях: Число, указывающее, на сколько дней открыть доступ. Это и есть та самая графа "Срок доступа", которую мы хотим добавить.
  6. ДатаОкончанияДействияРазрешения: Расчетное поле, которое будет вычисляться как ТекущаяДата() + СрокДоступаВДнях при выдаче разрешения.
  7. Причина: Строковое поле для обоснования необходимости доступа.
  8. Статус: Перечисление (например, НаСогласовании, Согласована, Отклонена, Выдана, Завершена).
  9. КомментарийСогласующего: Строковое поле для замечаний согласующего.
  10. ДатаСоздания, ДатаИзменения: Стандартные технические реквизиты.

Создадим форму документа, удобную для заполнения пользователем и для согласования ответственным лицом.

Шаг 2: Разработка механизма согласования заявок

После создания заявки необходимо обеспечить ее согласование. Мы можем выбрать один из двух путей:

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

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

Шаг 3: Хранение и использование временных разрешений

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

Измерения:

  1. Пользователь: Ссылка на справочник Пользователи. (Ключевое измерение).
  2. ПериодДоступаС: Дата. Начало периода, к которому предоставлен временный доступ.
  3. ПериодДоступаПо: Дата. Конец периода, к которому предоставлен временный доступ.

Ресурсы:

  1. ДатаОкончанияДействия: Дата. Это самая важная дата, по которой будет определяться, активно ли еще разрешение. Она будет рассчитываться как
    
    ТекущаяДата() + СрокДоступаВДнях
    
    в момент выдачи разрешения.
  2. ЗаявкаОснование: Ссылка на наш документ ЗаявкаНаВременныйДоступ для прослеживаемости.
  3. Активно: Булево. Флаг, указывающий, активно ли сейчас разрешение (позволяет не удалять записи, а просто деактивировать их).

Когда заявка согласована, мы записываем информацию в этот регистр. Например, в модуле объекта документа ЗаявкаНаВременныйДоступ после установки статуса Согласована:


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

        НоваяЗапись = НаборЗаписей.Добавить();
        НоваяЗапись.Пользователь = Пользователь;
        НоваяЗапись.ПериодДоступаС = ДатаНачалаПериода;
        НоваяЗапись.ПериодДоступаПо = ДатаОкончанияПериода;
        // Дата окончания действия рассчитывается от текущей даты
        НоваяЗапись.ДатаОкончанияДействия = ТекущаяДата() + СрокДоступаВДнях * 24 * 3600; // Добавляем дни в секундах
        НоваяЗапись.ЗаявкаОснование = Ссылка;
        НоваяЗапись.Активно = Истина;

        НаборЗаписей.Записать();
    КонецЕсли;
КонецПроцедуры

Обратите внимание, что расчет даты окончания действия производится от текущей даты, а не от даты периода. Это позволяет предоставлять доступ "на два дня, начиная с сегодня", независимо от того, к какому прошлому периоду запрашивается доступ.

Шаг 4: Интеграция с проверкой даты запрета

Этот шаг является критически важным. Нам необходимо модифицировать стандартную логику проверки даты запрета изменения данных. В большинстве конфигураций 1С эта проверка выполняется в общем модуле, часто с использованием функции ОбщегоНазначения.ПолучитьДатуЗапретаИзменения() или аналогичной.

Наша задача — встроить логику, которая сначала проверяет наш регистр ВременныеРазрешенияНаРедактирование. Если для текущего пользователя и запрашиваемой даты записи есть активное временное разрешение, то стандартную проверку даты запрета мы должны временно "отключить" или вернуть такую дату запрета, которая позволит изменение.

Предположим, у нас есть функция ПроверитьДатуЗапретаИзмененийДляОбъекта(), которая вызывается перед записью любого объекта. Мы изменим ее примерно так:


// Примерный код в ОбщемМодуле (например, ОбщегоНазначения или АдминистраторскаяПанель)
Функция ПроверитьДатуЗапретаИзмененийДляОбъекта(Объект, ДатаИзменения) Экспорт
    // 1. Сначала проверяем наш регистр временных разрешений
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |    ВременныеРазрешенияНаРедактирование.Пользователь,
        |    ВременныеРазрешенияНаРедактирование.ПериодДоступаС,
        |    ВременныеРазрешенияНаРедактирование.ПериодДоступаПо,
        |    ВременныеРазрешенияНаРедактирование.ДатаОкончанияДействия
        |ИЗ
        |    РегистрСведений.ВременныеРазрешенияНаРедактирование КАК ВременныеРазрешенияНаРедактирование
        |ГДЕ
        |    ВременныеРазрешенияНаРедактирование.Пользователь = &ТекущийПользователь
        |    И ВременныеРазрешенияНаРедактирование.Активно = ИСТИНА
        |    И &ДатаИзменения МЕЖДУ ВременныеРазрешенияНаРедактирование.ПериодДоступаС И ВременныеРазрешенияНаРедактирование.ПериодДоступаПо
        |    И &ТекущаяДата < ВременныеРазрешенияНаРедактирование.ДатаОкончанияДействия";

    Запрос.УстановитьПараметр("ТекущийПользователь", Пользователи.ТекущийПользователь());
    Запрос.УстановитьПараметр("ДатаИзменения", ДатаИзменения);
    Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());

    РезультатЗапроса = Запрос.Выполнить();

    Если Не РезультатЗапроса.Пустой() Тогда
        // Найдено активное временное разрешение, разрешаем изменение
        Возврат Истина; 
    КонецЕсли;

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

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

Шаг 5: Автоматическое снятие временного доступа

Для автоматического отзыва доступа по истечении срока нам потребуется регламентное задание. Создадим новое регламентное задание, например, АвтоматическоеЗакрытиеВременногоДоступа.

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


// Примерный код в модуле регламентного задания
Процедура ВыполнитьАвтоматическоеЗакрытиеВременногоДоступа() Экспорт
    // 1. Получаем все активные разрешения, срок действия которых истек
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ВременныеРазрешенияНаРедактирование.Пользователь,
        |    ВременныеРазрешенияНаРедактирование.ПериодДоступаС,
        |    ВременныеРазрешенияНаРедактирование.ПериодДоступаПо,
        |    ВременныеРазрешенияНаРедактирование.ДатаОкончанияДействия,
        |    ВременныеРазрешенияНаРедактирование.ЗаявкаОснование
        |ИЗ
        |    РегистрСведений.ВременныеРазрешенияНаРедактирование КАК ВременныеРазрешенияНаРедактирование
        |ГДЕ
        |    ВременныеРазрешенияНаРедактирование.Активно = ИСТИНА
        |    И ВременныеРазрешенияНаРедактирование.ДатаОкончанияДействия <= &ТекущаяДата";

    Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());

    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();

    НаборЗаписей = РегистрыСведений.ВременныеРазрешенияНаРедактирование.СоздатьНаборЗаписей();

    Пока Выборка.Следующий() Цикл
        // 2. Деактивируем или удаляем истекшие записи
        НаборЗаписей.Отбор.Пользователь.Установить(Выборка.Пользователь);
        НаборЗаписей.Отбор.ПериодДоступаС.Установить(Выборка.ПериодДоступаС);
        НаборЗаписей.Отбор.ПериодДоступаПо.Установить(Выборка.ПериодДоступаПо);
        НаборЗаписей.Прочитать();

        Если НаборЗаписей.Количество() > 0 Тогда
            Запись = НаборЗаписей.Получить(0);
            Запись.Активно = Ложь; // Деактивируем запись
            НаборЗаписей.Записать();

            // 3. Оповещение пользователей и администраторов
            // Здесь можно добавить код для отправки уведомлений
            Сообщить("Временный доступ для пользователя " + Выборка.Пользователь + 
                     " к периоду с " + Формат(Выборка.ПериодДоступаС, "ДФ=dd.MM.yyyy") + 
                     " по " + Формат(Выборка.ПериодДоступаПо, "ДФ=dd.MM.yyyy") + 
                     " был автоматически закрыт.", СтатусСообщения.Информация);

            // Также можно обновить статус в документе-основании ЗаявкаНаВременныйДоступ
            ДокОснование = Выборка.ЗаявкаОснование.ПолучитьОбъект();
            Если ДокОснование <> Неопределено Тогда
                ДокОснование.Статус = Перечисления.СтатусыЗаявокНаДоступ.Завершена;
                ДокОснование.Записать();
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

Шаг 6: Журналирование и контроль изменений

Любые изменения в закрытых периодах должны быть зафиксированы. Мы используем следующие механизмы:

  1. Системный Журнал регистрации: Все действия по записи документов в закрытых периодах автоматически попадают в журнал регистрации 1С. Мы можем настроить просмотр этого журнала, чтобы отслеживать, кто, когда и какие изменения внес, используя выданный временный доступ.
  2. Журнал "Заявки на временный доступ": Сам документ ЗаявкаНаВременныйДоступ будет служить журналом всех запросов, их согласования и статусов завершения.
  3. Отчеты по временным разрешениям: Мы можем разработать простые отчеты, которые будут показывать список активных разрешений, истекших разрешений, а также статистику по запросам.

Это обеспечивает полную прозрачность и возможность аудита.

Важные аспекты и рекомендации

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

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

← На главную