Зачастую в бизнес-процессах компаний возникает необходимость ограничить пользователя в создании дублирующих документов. Например, регламентные списания или операции по закрытию смены должны выполняться строго один раз в сутки. Давайте разберем, какими способами можно реализовать такой запрет в 1С:Предприятие и на что стоит обратить внимание при разработке.
Самый простой и распространенный способ — выполнение проверки непосредственно перед сохранением документа в базу данных. Для этого мы используем обработчик события ПередЗаписью в модуле объекта. Логика заключается в поиске уже существующих документов за текущую дату.
Рассмотрим пошагово, как это реализовать:
ПередЗаписью.Запрос к таблице документов этого же вида.
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Документ.Ссылка
|ИЗ
| Документ.НазваниеВашегоДокумента КАК Документ
|ГДЕ
| НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ) = НАЧАЛОПЕРИОДА(&ДатаДокумента, ДЕНЬ)
| И Документ.Проведен = ИСТИНА
| И Документ.Ссылка <> &ТекущаяСсылка";
Запрос.УстановитьПараметр("ДатаДокумента", Дата);
Запрос.УстановитьПараметр("ТекущаяСсылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Сообщить("Внимание! Документ за этот день уже существует. Создание второго экземпляра запрещено.");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Если система работает в условиях высокой конкуренции (множество пользователей одновременно создают документы), обычный запрос может не защитить от «гонки» транзакций. В таких случаях мы используем регистр сведений.
Разберем логику работы с регистром:
РегистрСведений.Дата, без времени).Анализируя задачу, стоит помнить о рисках, связанных с конкурентным доступом:
Проблема гонки (Race Condition): Если два пользователя одновременно открыли новые документы и начали их заполнять, оба «не видят» документ друг друга. Проверка сработает только в момент записи. В высоконагруженных системах рекомендуется использовать управляемые БлокировкиДанных в начале транзакции, чтобы «застолбить» день за первым начавшим запись пользователем. Для более глубокого понимания механизмов защиты данных пригодится руководство по видам объектных блокировок в 1С.
Альтернативный подход (Дозаполнение): Вместо жесткого запрета, мы можем спроектировать интерфейс так, чтобы при попытке создания второго документа система автоматически находила первый созданный документ и открывала его для добавления новых строк. Это гораздо более дружелюбный сценарий для пользователей, позволяющий избежать потери данных и необходимости «бегать» к администратору за снятием запретов.
Административный контроль: Иногда программный запрет избыточен. Если процесс создания документов строго регламентирован (например, только один человек имеет право создавать списания), лучше ограничить доступ через Роли и Права доступа, чем усложнять код конфигурации. Это избавит вас от проблем, когда «незаменимый сотрудник заболел», а стажер не может выполнить работу из-за программной заглушки.
Мы рекомендуем всегда анализировать бизнес-цель: если цель — избежать дублей, то архитектурное решение (автоматическое открытие существующего документа) почти всегда лучше, чем жесткий запрет (отказ в записи).