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

1. mavlenkov 26.11.22 22:08 Сейчас в теме
Приветствую.
Через веб-сервис поступают заказы. Параллельно могут единовременно приходить несколько одинаковых заказов из которых в базу нужно записать только один. Насколько я понял, для того чтобы заблокировать параллельное создание новых документов для обеспечения контроля уникальности необходимо использовать транзакции, но нигде не могу найти пример, каким образом это реализуется. Просьба помочь самым простым примером или ссылкой на описание чего-либо подобного.
Вот так сейчас реализована функция веб-сервиса, которая создаёт документ:
Функция НайтиСоздатьДокументЗаказ(Идентификатор, ДатаЗаказа)
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ДокументЗаказ.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.ДокументЗаказ КАК ДокументЗаказ
	|ГДЕ
	|	ДокументЗаказ.Идентификатор = &Идентификатор
	|	И НЕ ДокументЗаказ.ПометкаУдаления";
	Запрос.УстановитьПараметр("Идентификатор", Идентификатор);
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();
	Если Выборка.Следующий() Тогда
		Возврат Выборка.Ссылка.ПолучитьОбъект();
	Иначе
		НовыйДокументЗаказ = Документы.ДокументЗаказ.СоздатьДокумент();
		НовыйДокументЗаказ.Дата = ДатаЗаказа;
		НовыйДокументЗаказ.УстановитьНовыйНомер();
		НовыйДокументЗаказ.ВремяСоздания = ТекущаяДатаСеанса();
		НовыйДокументЗаказ.Идентификатор = Идентификатор;
		НовыйДокументЗаказ.СтатусЗаказа = Перечисления.СтатусыЗаказов.ЗаказПолучен;
		Возврат НовыйДокументЗаказ;
	КонецЕсли;
КонецФункции
Показать
Romeo_1c_programmer; +1 Ответить
По теме из базы знаний
Найденные решения
7. minarenko 27.11.22 08:55 Сейчас в теме
(6) Перед Возврат НовыйДокументЗаказ; запиши документ и все. Никаких тут блокировок не надо.
mavlenkov; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1826630 26.11.22 22:31 Сейчас в теме
(1)
Параллельно могут единовременно приходить несколько одинаковых заказов из которых в базу нужно записать только один.

Что значит "одинаковых"? По каким критериям ты это определяешь?
5. mavlenkov 27.11.22 08:11 Сейчас в теме
9. user1826630 27.11.22 13:31 Сейчас в теме
(5) А как у этих заказов получается одинаковый идентификатор?
3. user1826630 26.11.22 22:32 Сейчас в теме
(1)
Насколько я понял, для того чтобы заблокировать параллельное создание новых документов для обеспечения контроля уникальности необходимо использовать транзакции
Неправильно понял.
6. mavlenkov 27.11.22 08:24 Сейчас в теме
(3) Скажем так, транзакции или управляемые блокировки. Бог с ними с транзакциями, нет понимания как заблокировать создание новых документов при помощи управляемых блокировок и где это лучше делать, в веб-сервисе или модуле документа?

Думаю сделать что-то вроде такого:

БлокировкаДанных = Новый БлокировкаДанных;
ЭлементБлокировки = БлокировкаДанных.Добавить("Документ.ДокументЗаказ");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Идентификатор", Идентификатор);

Нет, однако, уверенности, что это то, что нужно.
Проблема ещё в том, что у меня ограничены возможности отладки - я не могу воспроизвести единовременное поступление одинаковых заказов, а экспериментировать на рабочей базе плохая идея.
7. minarenko 27.11.22 08:55 Сейчас в теме
(6) Перед Возврат НовыйДокументЗаказ; запиши документ и все. Никаких тут блокировок не надо.
mavlenkov; +1 Ответить
8. mavlenkov 27.11.22 12:22 Сейчас в теме
11. mavlenkov 27.11.22 17:32 Сейчас в теме
(7) Похоже, это решило проблему. Спасибо.
10. mavlenkov 27.11.22 17:10 Сейчас в теме
(9) Генерируется внешней информационной системой.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот