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

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

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

Метод 1: Проверка запросом в событии «ПередЗаписью»

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

Рассмотрим пошагово, как это реализовать:

  1. В модуле объекта документа находим (или создаем) обработчик ПередЗаписью.
  2. Составляем Запрос к таблице документов этого же вида.
  3. Устанавливаем условие, что дата документа должна совпадать с датой текущего создаваемого документа (отбрасывая время).
  4. Если запрос возвращает хотя бы одну запись (учитывая, что при записи нового документа он еще не записан в базу, либо исключая текущую ссылку при перезаписи), мы вызываем отказ.

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

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

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

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

    Если НЕ РезультатЗапроса.Пустой() Тогда
        Сообщить("Внимание! Документ за этот день уже существует. Создание второго экземпляра запрещено.");
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

Метод 2: Контроль через регистр сведений

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

Разберем логику работы с регистром:

Важные замечания по архитектуре и «человеческому фактору»

Анализируя задачу, стоит помнить о рисках, связанных с конкурентным доступом:

Проблема гонки (Race Condition): Если два пользователя одновременно открыли новые документы и начали их заполнять, оба «не видят» документ друг друга. Проверка сработает только в момент записи. В высоконагруженных системах рекомендуется использовать управляемые БлокировкиДанных в начале транзакции, чтобы «застолбить» день за первым начавшим запись пользователем. Для более глубокого понимания механизмов защиты данных пригодится руководство по видам объектных блокировок в 1С.

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

Административный контроль: Иногда программный запрет избыточен. Если процесс создания документов строго регламентирован (например, только один человек имеет право создавать списания), лучше ограничить доступ через Роли и Права доступа, чем усложнять код конфигурации. Это избавит вас от проблем, когда «незаменимый сотрудник заболел», а стажер не может выполнить работу из-за программной заглушки.

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

← На главную