Имя: Пароль:
1C
1С v8
Контроль уникальности реквизита справочника
,
0 zzhiraf
 
09.08.12
17:51
Каким образом нужно правильно это делать?
1 Mort
 
09.08.12
17:52
В обработке проверки заполнения
2 Mort
 
09.08.12
17:53
Как вариант
3 Mort
 
09.08.12
17:54
Если нужно обеспечить контроль и при тупой программной записи, тогда в перед записью.
4 zzhiraf
 
09.08.12
17:54
Перед записью контролировать неправильно
5 х86
 
09.08.12
17:55
(4)почему?
6 zzhiraf
 
09.08.12
17:56
При одновременной записи в справочник в этом случае возможно появление дублей.
7 zzhiraf
 
09.08.12
17:57
Перед записью элемент справочника еще в базу не записан, поэтому второй поток не сможет выявить не уникальность реквизита.
8 х86
 
09.08.12
17:58
(6)тогда при записи )
9 zzhiraf
 
09.08.12
17:59
(8) Тоже неправильно)
10 х86
 
09.08.12
18:01
(9)тебе не угодишь  (
в типовой поиск дублей делается передЗаписью
11 х86
 
09.08.12
18:04
(7)создай тогда какую нить табличку и блокируй её, или блокируй всю табл справочника
12 Mort
 
09.08.12
18:13
(11) Если вся эта шняга затевается для того чтобы юзеры не били контров с одинаковым ИНН и вероятность наступления одномоментного ввода элементов с одинаковым реквизитами 10 в минус ХЗ какой степени, то зачем все эти геморрои?
13 zzhiraf
 
10.08.12
09:29
(11) Блокировать всю таблицу не правильно, т. к. при этом снижается производительность системы. Кроме того как это сделать?
(12) Нет, ИНН здесь ни при чем. Речь о многопотоковой параллельной работе со справочниками.
14 hhhh
 
10.08.12
09:34
(13) регистр сведений заведите с двумя измерениями: элемент справочника и его реквизит.
15 Godofsin
 
10.08.12
09:36
А чо, ПриИзменении не подойдет?
16 Alex_MA
 
10.08.12
09:37
Перед записью запросом ГДЕ МойСправочник.ИмяРеквизита = &Реквизит
17 х86
 
10.08.12
09:38
(13)>>Кроме того как это сделать?

в транзакции ДЛЯ ИЗМЕНЕНИЯ, или неробит?
18 Defender aka LINN
 
10.08.12
09:41
(7) Воспроизведи.
19 zzhiraf
 
10.08.12
09:46
(18) Я должен воспроизвести? Можешь мне поверить, или проверить)
(14) Почему с 2-мя измерениями? по моему измерение должно быть одно - реквизит, проверяемый на уникальность. ну и ресурс можно сделать - ссылка на элемент справочника....
20 zzhiraf
 
10.08.12
09:47
(17) ДЛЯ ИЗМЕНЕНИЯ в режиме управляемых блокировок вроде не работает
21 ptiz
 
10.08.12
09:49
1) первая проверка:
ПередЗаписью - пробегаемся по всему справочнику
Здесь же записываем значение реквизита (которое вводится сейчас) во временный РС "ЗначенияКоторыеВводятсяСейчас"

2) вторая проверка
ПриЗаписи - смотрим РС "ЗначенияКоторыеВводятсяСейчас", нет ли там таких значений, вводимых в данный момент другими (с полной блокировкой этот регистр)

3) Периодически (тут надо подумать) чистим наш вспомогательный РС (блокируя в этот момент таблицу справочника).

Ессно, в файловой версии это работать не будет. Да и в постгри, наверное, тоже.
22 hhhh
 
10.08.12
09:51
(19) да, с одним измерением круче, можно прямо в ПриИзменении реквизита на форме проверять.
23 zzhiraf
 
10.08.12
09:55
(21) Хитрый алгоритм, насколько он оптимален с точки зрения производительности? Особенно такие моменты как "ПередЗаписью - пробегаемся по всему справочнику "...

(22) Меня больше интересует программная запись)
24 Serg_1960
 
10.08.12
09:57
Насчет регистра сведений - это вы загнули. А с учетом многопользовательского режима работы - совсем уж лишнее. Пятое колесо в телеге :)
25 zzhiraf
 
10.08.12
09:59
(24) Дело в том, что только использование регистра сведений позволяет на уровне платформы гарантированно контролировать уникальность набора измерений записи.
26 hhhh
 
10.08.12
10:00
(24) почему? Зато уникальность сама по себе будет контролироваться. На уровне платформы. И как раз это для многопользовательской версии, для однопользовательской это не нужно.
27 Фрэнки
 
10.08.12
10:07
(25) нужно еще учесть тип значения или у вас строка?
28 zzhiraf
 
10.08.12
10:10
(27) Строка, длиной больше 254 символов...
29 Фрэнки
 
10.08.12
10:17
(28) все-таки вводить регистр сведений для уникальности будет избыточно. Даже если открыто одновременно две формы у разных пользователей... Можно в код ПослеЗаписи поставить запрос по этому реквизиту, если выдаст более одного значения в результат, то вот и получишь поиск неуникального. Если же искать среди не записанных, в том числе и без самого себя, то гарантированного результата не достигнуть, имхо
30 Фрэнки
 
10.08.12
10:19
+ имхо, потому что это все методы самой 1С. Если работать с транзакциями без 1С, то вполне допускаю мысль, что где-то они в решении такой задачи смогут помочь
31 ptiz
 
10.08.12
10:21
(23) В любом случае понадобится таблица, хранящая все значения. Хоть тот же справочник, хоть отдельный РС (в том случае, если реквизитов в справочнике ну очень много, чтобы таблица была меньше).
Речь вообще про какие объемы? Сколько элементов в секунду будет вводиться?
32 zzhiraf
 
10.08.12
10:25
(29) ПослеЗаписи, когда транзакция уже зафиксирована и данные внесены в БД, в случае не уникальности реквизита, придется удалять записанные данные, кроме того в этом случае возможна ситуация когда оба одновременно записываемых элемента (в случае 2-х конкурентных потоков) с одинаковыми реквизитами будут удалены
33 Базис
 
naïve
10.08.12
10:28
Чем типовое решение, с показом возможных дублей, не годится?
34 zzhiraf
 
10.08.12
10:28
+ кстати, для объекта справочник события ПослеЗаписи нет)
35 zzhiraf
 
10.08.12
10:30
(33) насчет типового решения не могу ничего сказать, т к не видел его
36 Serg_1960
 
10.08.12
10:40
(26) Хм... на "уровне платформы"... Это об той самойплатформе речь, где функционал распределенной информационной базы встроен. Риб-база - и все ваши "навороты" для обеспечения уникальности становятся бессмысленными.
37 zzhiraf
 
10.08.12
10:45
(36) В случае распределенной базы данных, да и в общем случае распределенных систем, использующих общие данные, должна быть отдельная база с так называемыми мастер-данными, для контроля уникальности и синхронизации общих элементов со всеми системами использующими эти данные.
38 mistеr
 
10.08.12
11:20
(28) Можно подробнее, что хранится в этом реквизите?

Технически, гарантированно обеспечить уникальность реквизита при многопользовательской работе можно только двумя способами:

1) Сериализовать все изменения сущности (будь то справочник, регистр и т.д.). То есть блокировать некий общий ресурс перед записью, проверить уникальность, записать, снять блокировку. Платформа позволяет это сделать несколькими способами.

2) Ввести ограничение уникальности на уровне СУБД (unique constraint или unique index). Тут есть такие варианты:
а) хранить данные, требующие уникальности, в реквизите, для которого платформа сама создает в БД такое ограничение (например код справочника, единственное измерение РС (19));
б) создать дополнительное ограничение самостоятельно через SQL (и самому же его поддерживать, платформа о нем не знает и может его снести)
39 zzhiraf
 
10.08.12
11:42
(38) Вариант 2-б мне нравится можно попробовать)
40 zzhiraf
 
10.08.12
11:54
(38) Хранится строка, содержащая url-адрес.
41 mistеr
 
10.08.12
11:57
(40) Похоже на самостоятельную сущность. Подумайте о 2а.
42 zzhiraf
 
10.08.12
12:02
(41) Мне нужно получить некий идентификатор (ссылку) для дальнейшей нормальной работы с этими url-адресами. В случае использования справочника ссылка формируется автоматически при записи. В случае использования 2а, выходит что придется поддерживать 2 сущности справочник - для формирования ссылок и регистр сведений - для контроля уникальности. и делать 2 записи вместо одной...
43 mistеr
 
10.08.12
12:17
(42) Вычислите хэш от URL и сделайте его кодом справочника (или частью кода).
44 zzhiraf
 
10.08.12
12:29
(43) Он точно будет уникальным?
45 Фрэнки
 
10.08.12
12:41
вот стоило бы в самом начале указать, какого характера инфу сохранять и получить совет из (43)
46 zzhiraf
 
10.08.12
12:48
(45) Хэш не гарантирует уникальность
47 Фрэнки
 
10.08.12
12:51
(46) md5 ?
48 Defender aka LINN
 
10.08.12
12:54
(19) Ну вот я какбе и не верю.
49 zzhiraf
 
10.08.12
13:00
50 zzhiraf
 
10.08.12
13:01
целая дискуссия по поводу использования md5 хэшей в качестве примари кей. Тут не все так однозначно
51 zzhiraf
 
10.08.12
13:01
(48) Проверь)
52 Фрэнки
 
10.08.12
13:04
угу. это даже не задумываясь о самой задаче исключения урлов, идентичных друг другу при отсечении хвостовых пробелов
53 mistеr
 
10.08.12
13:22
(44) Не точно. Добавьте проверку на коллизии. Можно еще один разряд добавить на случай коллизии, но я бы не стал.

(50) Не нашел там серьезных аргументов против. Кроме того, Код это не primary key.
54 х86
 
10.08.12
15:30
(42)делай подчинённый справочник, код у которого твой уникальный реквизит, ессно должна быть уникальность кодов
55 zzhiraf
 
10.08.12
15:41
(54) Длина кода ограничена
56 Defender aka LINN
 
11.08.12
10:59
(51) Вот я и говорю: воспроизведи для начала.
Закон Брукера: Даже маленькая практика стоит большой теории.