Проверка реквизитов справочника на уникальность

Контроль уникальности реквизита справочника

Я
   zzhiraf

09.08.12 — 17:51

Каким образом нужно правильно это делать?

  

Партнерская программа EFSOL Oblako

   Mort

1 — 09.08.12 — 17:52

В обработке проверки заполнения

   Mort

2 — 09.08.12 — 17:53

Как вариант

   Mort

3 — 09.08.12 — 17:54

Если нужно обеспечить контроль и при тупой программной записи, тогда в перед записью.

   zzhiraf

4 — 09.08.12 — 17:54

Перед записью контролировать неправильно

   х86

5 — 09.08.12 — 17:55

(4)почему?

   zzhiraf

6 — 09.08.12 — 17:56

При одновременной записи в справочник в этом случае возможно появление дублей.

   zzhiraf

7 — 09.08.12 — 17:57

Перед записью элемент справочника еще в базу не записан, поэтому второй поток не сможет выявить не уникальность реквизита.

   х86

8 — 09.08.12 — 17:58

(6)тогда при записи )

   zzhiraf

9 — 09.08.12 — 17:59

(8) Тоже неправильно)

   х86

10 — 09.08.12 — 18:01

(9)тебе не угодишь  (

в типовой поиск дублей делается передЗаписью

   х86

11 — 09.08.12 — 18:04

(7)создай тогда какую нить табличку и блокируй её, или блокируй всю табл справочника

   Mort

12 — 09.08.12 — 18:13

(11) Если вся эта шняга затевается для того чтобы юзеры не били контров с одинаковым ИНН и вероятность наступления одномоментного ввода элементов с одинаковым реквизитами 10 в минус ХЗ какой степени, то зачем все эти геморрои?

   zzhiraf

13 — 10.08.12 — 09:29

(11) Блокировать всю таблицу не правильно, т. к. при этом снижается производительность системы. Кроме того как это сделать?

(12) Нет, ИНН здесь ни при чем. Речь о многопотоковой параллельной работе со справочниками.

   hhhh

14 — 10.08.12 — 09:34

(13) регистр сведений заведите с двумя измерениями: элемент справочника и его реквизит.

   Godofsin

15 — 10.08.12 — 09:36

А чо, ПриИзменении не подойдет?

   Alex_MA

16 — 10.08.12 — 09:37

Перед записью запросом ГДЕ МойСправочник.ИмяРеквизита = &Реквизит

   х86

17 — 10.08.12 — 09:38

(13)>>Кроме того как это сделать?

в транзакции ДЛЯ ИЗМЕНЕНИЯ, или неробит?

   Defender aka LINN

18 — 10.08.12 — 09:41

(7) Воспроизведи.

   zzhiraf

19 — 10.08.12 — 09:46

(18) Я должен воспроизвести? Можешь мне поверить, или проверить)

(14) Почему с 2-мя измерениями? по моему измерение должно быть одно — реквизит, проверяемый на уникальность. ну и ресурс можно сделать — ссылка на элемент справочника….

   zzhiraf

20 — 10.08.12 — 09:47

(17) ДЛЯ ИЗМЕНЕНИЯ в режиме управляемых блокировок вроде не работает

   ptiz

21 — 10.08.12 — 09:49

1) первая проверка:

ПередЗаписью — пробегаемся по всему справочнику

Здесь же записываем значение реквизита (которое вводится сейчас) во временный РС «ЗначенияКоторыеВводятсяСейчас»

2) вторая проверка

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

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

Ессно, в файловой версии это работать не будет. Да и в постгри, наверное, тоже.

   hhhh

22 — 10.08.12 — 09:51

(19) да, с одним измерением круче, можно прямо в ПриИзменении реквизита на форме проверять.

   zzhiraf

23 — 10.08.12 — 09:55

(21) Хитрый алгоритм, насколько он оптимален с точки зрения производительности? Особенно такие моменты как «ПередЗаписью — пробегаемся по всему справочнику «…

(22) Меня больше интересует программная запись)

   Serg_1960

24 — 10.08.12 — 09:57

Насчет регистра сведений — это вы загнули. А с учетом многопользовательского режима работы — совсем уж лишнее. Пятое колесо в телеге :)

   zzhiraf

25 — 10.08.12 — 09:59

(24) Дело в том, что только использование регистра сведений позволяет на уровне платформы гарантированно контролировать уникальность набора измерений записи.

   hhhh

26 — 10.08.12 — 10:00

(24) почему? Зато уникальность сама по себе будет контролироваться. На уровне платформы. И как раз это для многопользовательской версии, для однопользовательской это не нужно.

   Фрэнки

27 — 10.08.12 — 10:07

(25) нужно еще учесть тип значения или у вас строка?

   zzhiraf

28 — 10.08.12 — 10:10

(27) Строка, длиной больше 254 символов…

   Фрэнки

29 — 10.08.12 — 10:17

(28) все-таки вводить регистр сведений для уникальности будет избыточно. Даже если открыто одновременно две формы у разных пользователей… Можно в код ПослеЗаписи поставить запрос по этому реквизиту, если выдаст более одного значения в результат, то вот и получишь поиск неуникального. Если же искать среди не записанных, в том числе и без самого себя, то гарантированного результата не достигнуть, имхо

   Фрэнки

30 — 10.08.12 — 10:19

+ имхо, потому что это все методы самой 1С. Если работать с транзакциями без 1С, то вполне допускаю мысль, что где-то они в решении такой задачи смогут помочь

   ptiz

31 — 10.08.12 — 10:21

(23) В любом случае понадобится таблица, хранящая все значения. Хоть тот же справочник, хоть отдельный РС (в том случае, если реквизитов в справочнике ну очень много, чтобы таблица была меньше).

Речь вообще про какие объемы? Сколько элементов в секунду будет вводиться?

   zzhiraf

32 — 10.08.12 — 10:25

(29) ПослеЗаписи, когда транзакция уже зафиксирована и данные внесены в БД, в случае не уникальности реквизита, придется удалять записанные данные, кроме того в этом случае возможна ситуация когда оба одновременно записываемых элемента (в случае 2-х конкурентных потоков) с одинаковыми реквизитами будут удалены

   Базис

33 — 10.08.12 — 10:28

Чем типовое решение, с показом возможных дублей, не годится?

   zzhiraf

34 — 10.08.12 — 10:28

+ кстати, для объекта справочник события ПослеЗаписи нет)

   zzhiraf

35 — 10.08.12 — 10:30

(33) насчет типового решения не могу ничего сказать, т к не видел его

   Serg_1960

36 — 10.08.12 — 10:40

(26) Хм… на «уровне платформы»… Это об той самойплатформе речь, где функционал распределенной информационной базы встроен. Риб-база — и все ваши «навороты» для обеспечения уникальности становятся бессмысленными.

   zzhiraf

37 — 10.08.12 — 10:45

(36) В случае распределенной базы данных, да и в общем случае распределенных систем, использующих общие данные, должна быть отдельная база с так называемыми мастер-данными, для контроля уникальности и синхронизации общих элементов со всеми системами использующими эти данные.

   mistеr

38 — 10.08.12 — 11:20

(28) Можно подробнее, что хранится в этом реквизите?

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

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

2) Ввести ограничение уникальности на уровне СУБД (unique constraint или unique index). Тут есть такие варианты:

а) хранить данные, требующие уникальности, в реквизите, для которого платформа сама создает в БД такое ограничение (например код справочника, единственное измерение РС (19));

б) создать дополнительное ограничение самостоятельно через SQL (и самому же его поддерживать, платформа о нем не знает и может его снести)

   zzhiraf

39 — 10.08.12 — 11:42

(38) Вариант 2-б мне нравится можно попробовать)

   zzhiraf

40 — 10.08.12 — 11:54

(38) Хранится строка, содержащая url-адрес.

   mistеr

41 — 10.08.12 — 11:57

(40) Похоже на самостоятельную сущность. Подумайте о 2а.

   zzhiraf

42 — 10.08.12 — 12:02

(41) Мне нужно получить некий идентификатор (ссылку) для дальнейшей нормальной работы с этими url-адресами. В случае использования справочника ссылка формируется автоматически при записи. В случае использования 2а, выходит что придется поддерживать 2 сущности справочник — для формирования ссылок и регистр сведений — для контроля уникальности. и делать 2 записи вместо одной…

   mistеr

43 — 10.08.12 — 12:17

(42) Вычислите хэш от URL и сделайте его кодом справочника (или частью кода).

   zzhiraf

44 — 10.08.12 — 12:29

(43) Он точно будет уникальным?

   Фрэнки

45 — 10.08.12 — 12:41

вот стоило бы в самом начале указать, какого характера инфу сохранять и получить совет из (43)

   zzhiraf

46 — 10.08.12 — 12:48

(45) Хэш не гарантирует уникальность

   Фрэнки

47 — 10.08.12 — 12:51

(46) md5 ?

   Defender aka LINN

48 — 10.08.12 — 12:54

(19) Ну вот я какбе и не верю.

   zzhiraf

49 — 10.08.12 — 13:00

   zzhiraf

50 — 10.08.12 — 13:01

целая дискуссия по поводу использования md5 хэшей в качестве примари кей. Тут не все так однозначно

   zzhiraf

51 — 10.08.12 — 13:01

(48) Проверь)

   Фрэнки

52 — 10.08.12 — 13:04

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

   mistеr

53 — 10.08.12 — 13:22

(44) Не точно. Добавьте проверку на коллизии. Можно еще один разряд добавить на случай коллизии, но я бы не стал.

(50) Не нашел там серьезных аргументов против. Кроме того, Код это не primary key.

   х86

54 — 10.08.12 — 15:30

(42)делай подчинённый справочник, код у которого твой уникальный реквизит, ессно должна быть уникальность кодов

   zzhiraf

55 — 10.08.12 — 15:41

(54) Длина кода ограничена

  

Defender aka LINN

56 — 11.08.12 — 10:59

(51) Вот я и говорю: воспроизведи для начала.

0 / 0 / 0

Регистрация: 19.10.2012

Сообщений: 8

1

1C 8.x

Проверка уникальности наименования

19.10.2012, 20:58. Показов 34095. Ответов 16


Здравствуйте, я новичок в программировании 1С. Напишите, пожалуйста, как выполнить пункт 1.1.3.

Разработать учебную настройку сладского учета. Разработка должна вестись «с нуля», т.е. создать новую конфигурацию.

1.Справочники
1.1.1. Основное представление в виде наименования(длина 100)
1.1.2. Реквизиты
Цена(15.2) — тут я не понял что значить 15.2?
1.1.3. Перед записью элемента справочника проверять уникальность наименования, если наименование не уникально, запись производится на должна с выдачей соответствующего сообщения



0



Модератор

Эксперт 1С

3708 / 2905 / 572

Регистрация: 10.03.2011

Сообщений: 11,442

Записей в блоге: 1

19.10.2012, 22:07

2

тип числа длинна 15 точность 2
В процедуре ПередЗаписью проверять Запросом есть ли элемент справочника с таким же наименованием если есть передавать параметру ОТКАЗ значение ИСТИНА.



1



duk337

2954 / 1766 / 82

Регистрация: 03.11.2011

Сообщений: 8,280

20.10.2012, 00:56

3

Запросом — надо приводить строки. Лучше

1C
1
Отказ=НЕ (Неопределено=Справочник.Наименования.НайтиПоНаименованию(Нименование));



1



Dethmontt

Модератор

Эксперт 1С

3708 / 2905 / 572

Регистрация: 10.03.2011

Сообщений: 11,442

Записей в блоге: 1

20.10.2012, 03:11

4

Тогда уж хотя бы так…

1C
1
Отказ=НЕ (Справочники.Наименования.ПустаяСсылка()=Справочники.Наименования.НайтиПоНаименованию(СокрЛП(Нименование),Истина));



2



0 / 0 / 0

Регистрация: 19.10.2012

Сообщений: 8

21.10.2012, 18:09

 [ТС]

5

Спасибо большое. Вы мне очень помогли. Код работает)



0



semen9

12.12.2012, 16:15

6

Всем привет, а если к этому коду еще добавить проверку по реквизиту как это реализовать?

Милагрес

0 / 0 / 0

Регистрация: 19.10.2012

Сообщений: 8

12.12.2012, 21:20

 [ТС]

7

я сделала это задание так:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Процедура ПередЗаписью(Отказ)
Запрос= Новый Запрос;
Запрос.УстановитьПараметр("Наименование",Наименование);
Запрос.Текст= "ВЫБРАТЬ 
| Товары.Наименование 
|ИЗ 
| Справочник.Товары КАК Товары 
|ГДЕ 
| Товары.Наименование = &Наименование"; 
Поиск = Запрос.Выполнить().Выбрать(); 
Пока Поиск.Следующий() Цикл 
Предупреждение("Данная наименование уже присутствует в базе!"); 
Отказ = ИСТИНА; 
Прервать; 
КонецЦикла; 
КонецПроцедуры



0



Модератор

Эксперт 1С

3708 / 2905 / 572

Регистрация: 10.03.2011

Сообщений: 11,442

Записей в блоге: 1

13.12.2012, 00:21

8

Цитата
Сообщение от Милагрес
Посмотреть сообщение

я сделала это задание так:
Процедура ПередЗаписью(Отказ)
Запрос= Новый Запрос;
Запрос.УстановитьПараметр(«Наименование»,Наименова ние);
Запрос.Текст= «ВЫБРАТЬ
| Товары.Наименование
|ИЗ
| Справочник.Товары КАК Товары
|ГДЕ
| Товары.Наименование = &Наименование»;
Поиск = Запрос.Выполнить().Выбрать();
Пока Поиск.Следующий() Цикл
Предупреждение(«Данная наименование уже присутствует в базе!»);
Отказ = ИСТИНА;
Прервать;
КонецЦикла;
КонецПроцедуры

А если потребуется что то изменить в номенклатуре (кроме наименования) то как ее потом записать? она же найдет сама себя в базе =))

Добавлено через 1 минуту
Но ваш код намного лучше

Чем этот:

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

Тогда уж хотя бы так…
Код 1C
Отказ=НЕ (Справочники.Наименования.ПустаяСсылка()=Справочни ки.Наименования.НайтиПоНаименованию(СокрЛП(Нименов ание),Истина));



0



2954 / 1766 / 82

Регистрация: 03.11.2011

Сообщений: 8,280

14.12.2012, 12:51

9

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

|ГДЕ
| Товары.Наименование = &Наименование»;

Может не сравниться. В запросе критична длина строки.



0



Модератор

Эксперт 1С

3708 / 2905 / 572

Регистрация: 10.03.2011

Сообщений: 11,442

Записей в блоге: 1

14.12.2012, 13:07

10

Это побеждается СОКРЛП()



0



ArturiosBoss

0 / 0 / 0

Регистрация: 06.12.2016

Сообщений: 2

06.12.2016, 15:27

11

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

А если потребуется что то изменить в номенклатуре (кроме наименования) то как ее потом записать? она же найдет сама себя в базе =))

Тут на самом деле всё просто если использовать запрос от уважаемой Милагрес будет и проверять уникальность и изменять запись

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Процедура ПередЗаписью(Отказ)
    // Вставить содержимое обработчика.
Если ЭтоНовый() Тогда
 
Запрос= Новый Запрос;
Запрос.УстановитьПараметр("Наименование",Наименование);
Запрос.Текст= "ВЫБРАТЬ
|   Сотрудники.Наименование
|ИЗ
|   Справочник.Сотрудники КАК Сотрудники
|ГДЕ
|   Сотрудники.Наименование = &Наименование" ;
Поиск = Запрос.Выполнить().Выбрать(); 
Пока Поиск.Следующий() Цикл 
Предупреждение("Данная наименование уже присутствует в базе!"); 
Отказ = ИСТИНА; 
Прервать; 
КонецЦикла; 
КонецЕсли;
    // если объект не новый, то сохраним изменения для потомков
    ВыборкаДоЗаписи=Неопределено;
    
    Если НЕ ЭтоНовый() Тогда
        Запрос=Новый Запрос("ВЫБРАТЬ * ИЗ Справочник.Сотрудники ГДЕ Ссылка=&Ссылка");
        Запрос.УстановитьПараметр("Ссылка",Ссылка);
        ВыборкаДоЗаписи=Запрос.Выполнить().Выбрать(); ВыборкаДоЗаписи.Следующий();
    КонецЕсли;
 
КонецПроцедуры



0



Dethmontt

06.12.2016, 17:19

Не по теме:

ArturiosBoss, с 2012 года



0



ArturiosBoss

06.12.2016, 21:02

Не по теме:

ничего страшного кому-то пригодиться, тем более ответа адекватного не было на ваш вопрос



0



Joker_vad

Эксперт 1С

476 / 413 / 93

Регистрация: 26.09.2012

Сообщений: 1,907

09.12.2016, 14:25

14

ArturiosBoss, ваш ответ более чем не адекватный. Если я поменяю наименование уже созданного элемента на то, которое уже есть в базе, то ваш код отработает не так как нужно.

1C
1
2
3
4
5
Если НЕ ЭтоНовый() Тогда Запрос=Новый Запрос("ВЫБРАТЬ * ИЗ Справочник.Сотрудники ГДЕ Ссылка=&Ссылка");
 Запрос.УстановитьПараметр("Ссылка",Ссылка);
 ВыборкаДоЗаписи=Запрос.Выполнить().Выбрать(); 
ВыборкаДоЗаписи.Следующий(); 
КонецЕсли;

А вот этот участок кода призван нагрузить систему и все!



0



Модератор

Эксперт 1С

3708 / 2905 / 572

Регистрация: 10.03.2011

Сообщений: 11,442

Записей в блоге: 1

09.12.2016, 23:48

15

Joker_vad,

ArturiosBoss,



0



0 / 0 / 0

Регистрация: 21.11.2017

Сообщений: 1

22.11.2017, 09:59

16

Объясните други то как лучше всего сделать.



0



Эксперт 1С

476 / 413 / 93

Регистрация: 26.09.2012

Сообщений: 1,907

22.11.2017, 11:44

17

Знакомое ТЗ, у нас такое же на приеме на работу, один из первых пунктов.

Перед записью, проверять есть ли такое же наименование в базе. Причем нужно проверить так чтобы, он самого себя не находил, если элемент уже записан и его нужно будет подредактировать. Никаких условий на новый объект не нужно, т.к элемент может быть перезаписан.



0



Программный код для проверки наличия дублирующегося элемента справочника до записи (8.2).
Для обычного и управляемого приложения.

При разработке своей конфигурации возникла проблема, когда пользователи от лени не просматривая справочники начинают дублировать записи. Чистить после них справочники достаточно запарно, на двойные элементы задействованы ссылки. Поэтому попробовал ограничить их при вводе новых элементов. Немного помучился с логикой, забыл двоичную арифметику. Вот что получилось. После окончательной проверки в своей конфе вставлю это и в стандартные (уже вставил). Может кому еще пригодится. Сразу оговорюсь критерий, что является дублем определен тот который подходит мне. Это пример и каждый волен доработать его по своему. Проверено на 8.2. Зараннее прошу прощения за оформление поста.

Итак для обычного приложения

В ОбщиеМодули помещаете СвойМодуль РаботаСоСправочниками и внем прописываете процедуру

// Проверяет существует элемент в справочнике или нет
// Вызывается перед записью элемента
//
// Элемент  — Объект Элемент
// Реквизит — Реквизит для поиска
// Отказ    — Отказ от записи элемента
//
Процедура ПроверитьЭлемент(Элемент, Реквизит, Отказ) Экспорт
      // Проверяем совпадение наименования
      Отбор = Реквизит;
      Найдено = Справочники[Элемент.Метаданные().Имя].НайтиПоНаименованию(Отбор, Истина);
      Если Найдено = Справочники[Элемент.Метаданные().Имя].ПустаяСсылка() Тогда
          // Такого элемента нет
          // Перезаписываем элемент справочника
          Отказ = Ложь;
      ИначеЕсли Найдено.Код = Элемент.Код Тогда
           // Это редактируемый элемент
           // Перезаписываем элемент справочника
           Отказ = Ложь;
      Иначе
           Предупреждение(«Такой элемент есть в справочнике», 10);
           Отказ = Истина;
      КонецЕсли;
КонецПроцедуры

После этого во все формы Элементов справочников, которые необходимо контролировать, помещаем процедуру для события Формы

Процедура ПередЗаписью(Отказ)
     // Проверим существование элемента с таким Наименованием
     РаботаСоСправочниками.ПроверитьЭлемент(ЭтотОбъект, Наименование, Отказ);
КонецПроцедуры


А теперь для управляемого приложения

В нем почти все также, но немного другое обращение к форме.

В ОбщиеМодули помещаем СвойМодуль РаботаСоСправочниками и в нем прописываем процедуру

// Проверяет существует элемент в справочнике или нет
// Вызывается перед записью элемента
//
// Наимен   — Реквизит для поиска
// Элемент  — Объект Элемент
// Отказ    — Отказ от записи элемента
//
Процедура ПроверитьЭлемент(Наимен, Элемент, Отказ) Экспорт
   
// Проверяем совпадение наименования
   
Отбор = Наимен;
   
Найдено = Справочники[Элемент.Метаданные().Имя].НайтиПоНаименованию(Отбор, Истина);
    Если
Найдено = Справочники[Элемент.Метаданные().Имя].ПустаяСсылка() Тогда
       
// Сообщить(«1-Такого элемента нет»);
        // Перезаписываем элемент справочника
       
Отказ = Ложь;
    ИначеЕсли
Найдено.Код = Элемент.Код Тогда
       
// Сообщить(«2-Это редактируемый элемент»);
        // Перезаписываем элемент справочника
       
Отказ = Ложь;
    Иначе
       
// Сообщить(«3-Такой элемент уже есть в справочнике»);
        // Запрещаем запись этого элемента
       
Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

После этого в формы Элементов справочников, которые необходимо контролировать, помещаем процедуру для события Формы

 &НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
   
РаботаСоСправочниками.ПроверитьЭлемент(ЭтаФорма.Объект.Наименование, ЭтаФорма.Объект.Ссылка, Отказ);
    Если
Отказ Тогда
       
Предупреждение(«Такой элемент есть в справочнике», 10);
    КонецЕсли;
КонецПроцедуры

Вот и все. Переделывайте и используйте на свое усмотрение. Удачи.

Уважаемые опытные разработчики 1С, прошу проконсультировать начинающего.
Имеется справочник «Товары», который, помимо стандартных реквизитов, имеет реквизит цена с примитивным типом «число». Необходимо чтобы перед записью элемента справочника проверялась уникальность наименования. Если наименование не уникально, запись производиться не должна с выдачей соответствующего сообщения.
Погуглив, нашел следующее решение (проверял — работает):
1) В модуле объекта пишем код:

Процедура ПередЗаписью(Отказ) 
	ИмяОбъекта = ЭтотОбъект.Метаданные().Имя;
	СтрРеквизитов = Новый Структура; //
	СтрРеквизитов.Вставить("Наименование", Наименование);
	Если Не ОбщегоНазначения.ПрошелКонтрольУникальностиСправочникаПоРеквизиту(ИмяОбъекта, СтрРеквизитов, Ссылка) Тогда
		Сообщить("Подобный элемент справочника /" + Наименование + "/ существует!
				|Модуль: Контроль уникальности элементов справочника." );
		Отказ = Истина;
	КонецЕсли;
КонецПроцедуры

2) Создаем общий модуль и там прописываем:

&НаСервере
Функция ПрошелКонтрольУникальностиСправочникаПоРеквизиту(ИмяОбъекта, СтрРеквизитов, ЗначениеСсылка) Экспорт

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

Есть ощущение, что слишком громоздкое решение задачи. Подскажите, пожалуйста, есть ли более простое / рациональное решение?

Проверка уникальности в справочнике

Автор Les Paul, 27 июл 2015, 10:21

0 Пользователей и 1 гость просматривают эту тему.

Здравствуйте.

Существует справочник «Товары», 3 поля — «наименование», «тип товара» (перечисление), «поставщик» (справочник).
Как сделать так, чтобы при попытке внесении 2х одинаковых товаров, система не давала этого сделать.
Под «одинаковыми товарами», понимаю полное соответствие по 3 реквизитам. 


Хм. Создайте регистр сведений и записывайте туда при записи номенклатуры. запись не пройдет — значит уже есть такое:)

Помог? Нажми — Спасибо :)
skype: Soprov1C


Лучше уж просто проверку ПередЗаписью сделать. ИМХО.
Раздувать базу дополнительной таблицей, фактически дублирующей справочник номенклатура лишь для проверки уникальности — сомнительная ценность.


Kironten, интересно послушать как вы будете делать проверку перед записью на уникальность трех реквизитов? в таблицу значения весь справочник запихивать? :)

Добавлено: 27 июл 2015, 21:45


И не надо боятся делать отдельные таблицы дополнительные. Это не страшно.

Помог? Нажми — Спасибо :)
skype: Soprov1C


Цитата: дфтын от 27 июл 2015, 21:44
Kironten, интересно послушать как вы будете делать проверку перед записью на уникальность трех реквизитов? в таблицу значения весь справочник запихивать? :)

Ну а в чем проблема то?
Что так запрос будет по 3 значениям измерений РС, что так будет запрос по 3 значениям реквизитов у справочника.
Что за ТЗ вы имеете ввиду?


Цитата: Kironten от 27 июл 2015, 22:56Что так запрос будет по 3 значениям измерений РС, что так будет запрос по 3 значениям реквизитов у справочника.

запроса к РС не будет (во всяком случае явно).
при записи в РС РС сам проверяет уникальность всех трех измерений и ругается при совпадении.

Получил помощь — скажи СПАСИБО.
Разобрался сам — расскажи другим.


Спасибо за ответы :ooifh:


cska-fanat-kz, +1
Kironten, Ну опишите алгоритм как вы без регистра сведений и таблиц значений будете проверять уникальность трех реквизитов. я с ходу не придумал.

Помог? Нажми — Спасибо :)
skype: Soprov1C


Цитата: дфтын от 28 июл 2015, 12:39Ну опишите алгоритм как вы без регистра сведений и таблиц значений будете проверять уникальность трех реквизитов. я с ходу не придумал

ну как бы запрос к справочнику с условием «Спр.Реквизит1 = &Реквизит1 И Спр.Реквизит2 = &Реквизит2 И Спр.Реквизит3 = &Реквизит3» — это подходит под вариант «без таблицы значений»?

Получил помощь — скажи СПАСИБО.
Разобрался сам — расскажи другим.


cska-fanat-kz, подходит:)

Помог? Нажми — Спасибо :)
skype: Soprov1C


Разработка позволяет произвольным образом настроить проверку уникальности перед записью новых элементов в ЛЮБОМ справочнике информационной базы. При этом проверка может производиться не только по реквизитам элементов, но и по значениям контактной информации.

Допустим, нам требуется обеспечить отсутствие дублей в справочнике Партнеры и Характеристики номенклатуры. Для первого справочника в качестве поля уникальности будем использовать телефон в контактных данных, а одинаковость характеристик будем проверять по сочетанию наименования и владельца.

Откроем форму настроек.

раздел НСИ  и администрирование

На форме настроек выводится список всех справочников, которые существуют в базе. При выделении строки с нужным справочником справа выводится справка по тем реквизитам, которые возможно использовать для контроля дублей. Нужный реквизит перенесем в колонку Реквизиты проверки.

настройка проверки уникальности справочника партнеров

Если реквизитов проверки несколько, перечисляем их через запятую.

несколько реквизитов проверки

Если дублями необходимо считать элементы, у которых совпадают значения всех реквизитов проверки, необходимо установить флаг Совместно. В противном случае дублями будут считаться элементы, у которых совпадает значение хотя бы одного реквизита проверки.

Теперь при записи нового (или изменении текущего) партнера программа проверяет его телефон, и если он не уникальный, то запись заканчивается ошибкой.

ошибка при записи партнера

Сохранить характеристику с неуникальной комбинацией наименования и владельца тоже не получится.

ошибка записи неуникальной характеристики

Проверка на уникальность выполняется и при интерактивной (вызванной пользователем) и при программной (когда выполняется какой-то скрипт, без непосредственного участия пользователя) записи элементов.

Проверка на уникальность не выполняется при обмене данных между конфигурациями (когда создание/изменение элемента вызвано сторонней конфигурацией).

Для корректной работы расширения необходимо отключить Безопасный режим.

отключение безопасного режима


Дмитрий Медведков

Дмитрий Медведков

Программист, консультант 1С

Начал работать с 1С в 2012-м, специализируюсь на УТ 11

Posted On 2019-03-27

Контроль уникальности Справочника 1С

Процедура ПередЗаписью(Отказ,)
Если Не Справочники.ТМЦ.НайтиПоНаименованию(Наименование) = Справочники.ТМЦ.ПустаяСсылка() Тогда    
     Текст = "ru = ""Наименование записи справочника не уникально!""";
     Предупреждение(НСтр(Текст), 10);
     Отказ = Истина;
     ЭтаФорма.Закрыть(Отказ);     
     Возврат;
КонецЕсли;            
КонецПроцедуры

Либо при изменении элемента формы

Процедура НаименованиеПриИзменении(Элемент)
Если Не Справочники.КартыИСкидки.НайтиПоНаименованию(Наименование) = Справочники.КартыИСкидки.ПустаяСсылка() Тогда 
    Наименование = "";
    Текст = "ru = ""Наименование записи справочника не уникально!""";
    Предупреждение(НСтр(Текст), 10);
    Отказ = Истина;
    // ЭтаФорма.Закрыть(Отказ); 
    Возврат;
КонецЕсли;

Понравилась статья? Поделить с друзьями:
  • Проверка роспотребнадзора строительной компании
  • Проверочная работа по новейшему времени 4 класс
  • Проверочная работа по теме время 2 класс занков
  • Проверочная работа по теме герои нашего времени
  • Проверочная работа по теме герой нашего времени