@nurasyl
Fullstack разработчик

Как делать транзакцию и блокировку в 1C?

Привет всем!

Правильно я делаю транзакцию и блокировку в 1C?
Я там хочу проверить существует ли телефон номер в базе данных, здесь я хочу соблюдать уникальность телефон номера в таблице.

НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
			
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
|Контакты.Код
|ИЗ
|Справочник.Контакты КАК Контакты
|ГДЕ ТелефонНомер = """ + Объект.ТелефонНомер + """ ДЛЯ ИЗМЕНЕНИЯ";
		
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Количество = Выборка.Количество();

// Проверка существования телефон номера
Если Количество > 0 Тогда
	Если Объект.Код = "" Тогда
		// При новой записи
		Отказ = Истина;
		
		СообщитьТелефонНомерУжеСуществует();
	Иначе
		// Обновление существующей записи
		Пока Выборка.Следующий() Цикл
			Если Выборка.Код <> Объект.Код Тогда
				Отказ = Истина;
				
				СообщитьТелефонНомерУжеСуществует();
			КонецЕсли;
		КонецЦикла
	КонецЕсли;
КонецЕсли;

ЗафиксироватьТранзакцию();
  • Вопрос задан
  • 59 просмотров
Решения вопроса 1
Fragster
@Fragster
помогло? отметь решением!
1. телефон надо передавать в запрос параметром. надеюсь он нормализован.
2. ссылку можно также передавать параметром с условием <>. для нового она будет пустая, а все объекы в базе имеют непустую ссылку, так что ничего не сломается. И не будет лишнего ветвления.
3. сравнение с Объект.Код предполагает, что это модуль объекта. Если это событие ПередЗаписью - то транзакция не нужна, она и так есть. если ПроверкаЗаполнения - то нужна, но стоит помнить, что при программной работе ПроверитьЗаполнение нужно вызывать руками. Ну и если в ПроверкаЗаполнения, то между окончанием проверки и началом транзакции записи также кто-то может вклиниться.
Сама блокировка устанавливается как-то так:
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник.Контакты");
ЭлементБлокировки.УстановитьЗначение("ТелефонНомер", Объект.ТелефонНомер);
Блокировка.Заблокировать();

Устанавливать её следует ДО запроса
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы