Имя: Пароль:
1C
1С v8
Блокировка регистра сведений на добавление данных
0 Gera1t
 
10.04.24
15:20
Здравствуйте! Есть регистр сведений "ШтрихКодыУпаковок".
Перед тем как добавить запись в этот регистр, проверяю штрихкод на уникальность.
Но возникает иногда такая ситуация, когда с 2 компьютеров это действие происходит одновременно.
Что бы этого избежать добавил вот такой код, для блокировки регистра:
    

НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);

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

    ЗафиксироватьТранзакцию();

Но это не работает.
Подскажите пожалуйста, как правильно реализовать блокировку регистра для добавления данных.
Спасибо!
1 vis
 
10.04.24
15:22
У вас с двух компов добавляют одинаковые ШК ?
2 Gera1t
 
10.04.24
15:25
(1) Не совсем так, но примерно. Я сделал дополнительный контроль, и одинаковые штрихкоды создать не возможно, но получилось как то сложно, хотелось бы решить проблему проще.
3 Gera1t
 
10.04.24
15:30
Получается так: с одного компьютера добавляется новый штрихкод, программа его генерит (генерит путем добавления к последнему текущему 1) и он записывается в регистр, в этот же момент с другого компьютера генериться еще один штрихкод, точно такой же, и это происходит в промежуток времени между генерацией нового штрихкода и записью его в регистр
4 СвинТуз
 
10.04.24
15:34
"Результат"
По ресурсу что ли работаешь?
Или по реквизиту?
5 СвинТуз
 
10.04.24
15:36
(0)
Блокируй весь регистр. Без отборов.
Чего мелочиться? Интенсивная запись идет с большими расчетами?
6 Gera1t
 
10.04.24
15:41
(4) По измерению
(5) Действий много с разных компьютеров, расчетов не много.
7 СвинТуз
 
10.04.24
15:44
(6)
Что то оно как то не того. я хз.
Сравни

ЭлементБлокировки.ИсточникДанных =
     ДокументОбъект.ВозвратнаяТара;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(
     "Номенклатура", "Номенклатура");

и
ЭлементБлокировки.ИсточникДанных = Результат;
    //ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Штрихкод", "Штрихкод");  

Комент меня смущает.
8 НастяПРО
 
10.04.24
15:54
(7) СВИНДАМА??? ИЛИ СВИНВАЛЕТ?
9 vicof
 
10.04.24
15:57
(8)Просвинастя
10 НастяПРО
 
10.04.24
15:58
(9) Саша лох, трусы в горох, сиськи по колено!!!!
11 vicof
 
10.04.24
16:00
Забаньте ее уже
12 НастяПРО
 
10.04.24
16:00
(11) Я тебя щас забаню, малолетний дебил
13 НастяПРО
 
10.04.24
16:00
(11) Я тебя щас забаню, малолетний дебил
14 НастяПРО
 
10.04.24
16:01
(11) СписокЗначений
15 НастяПРО
 
10.04.24
16:01
(11) Я тебя щас забаню, малолетний дебил
Я тебя щас забаню, малолетний дебил
16 НастяПРО
 
10.04.24
16:01
Я тебя щас забаню, малолетний дебил (11)
17 timurhv
 
10.04.24
16:11
(0) Нет там СпискаЗначений:
ЭлементБлокировкиДанных.ИсточникДанных
Использование:
Чтение и запись.
Описание:
Тип: РезультатЗапроса, Табличная часть, ТаблицаЗначений.
Источник данных, содержащий значения полей для установки условий на поля пространства блокировки.

https://www.koderline.ru/expert/instruktsii/article-upravlyaemye-blokirovki/

3.Установка условия блокировки записей с помощью источника данных

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

Данные для установки ограничений на поля этого элемента блокировки – это таблица значений "СписокНоменклатуры".
Блокируем в данных регистра "ОстаткиТоваровНаСкладах" все записи, у которых значение измерения "Склад" равно значению переменной "Склад", а значение измерения "Номенклатура" равно какому-либо значению из колонки "Номенклатура", указанного источника данных. В качестве источника данных можно указывать результат запроса, и для последнего примера можно было бы создать запрос, который бы отсекал номенклатуру, содержащую "услугу", тем самым нивелируя избыточность блокировки.
18 Sorento
 
11.04.24
09:34
(16) Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. (с)Фредерик Брукс-младший
19 ptiz
 
11.04.24
09:56
(0) Надо понимать смысл блокировок.
После того как ты сделал -БлокировкаДанных.Заблокировать(); - в той же транзакции проверяй: существует ли такой же ШК.
Без этого выходит, что ты просто ждешь, когда второй сеанс освободит регистр, но после освобождения там будет запись с этим ШК.