Имя: Пароль:
1C
1С v8
Регистр сведений проверка на уникальность
,
0 Vladislava-smile
 
29.09.15
03:57
Есть регистр сведений с 3-мя измерениями, Код(строка), номенклатура, строка. Сейчас идет проверка уникальности только по номенклатуре и по коду, надо сделать уникальной и строку. В свойствах что-то не нашла ничего ... Или перед записью нового элемента надо перебирать весь набор записей и проверять на соответствие?
1 krunm
 
29.09.15
05:11
2 Vladislava-smile
 
29.09.15
05:17
(1) Спасибо, сделала уже так:
Процедура ПередЗаписью(Отказ, Замещение)
Для Каждого Запись из ЭтотОбъект Цикл
    
// Проверка на уникальность кодаИНСТАЛЛ и КодаКНР
Запрос = Новый Запрос("ВЫБРАТЬ
                      |    СоответствиеНоменклатурыИнсталлКНР.КодИНСТАЛЛ,
                      |    СоответствиеНоменклатурыИнсталлКНР.КодКНР
                      |ИЗ
                      |    РегистрСведений.СоответствиеНоменклатурыИнсталлКНР КАК СоответствиеНоменклатурыИнсталлКНР");
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
    Если Запись.КодИНСТАЛЛ=Результат.КодИНСТАЛЛ тогда
        Сообщить("Номенклатура Инсталл с кодом Инсталл "+Запись.КодИНСТАЛЛ+" уже записана!!!");
        Отказ=Истина;
    ИначеЕсли Запись.КодКНР=Результат.КодКНР тогда
        Сообщить("Номенклатура Инсталл с кодом КНР "+Запись.КодКНР+" уже записана!!!");
        Отказ=Истина;
    КонецЕсли;    
КонецЦикла;    
КонецЦикла;
КонецПроцедуры
3 Альбатрос
 
29.09.15
05:22
(2) =)
4 Vladislava-smile
 
29.09.15
05:32
(3) И что это значит "=)"?
5 jurassic
 
29.09.15
05:34
вот бы придумали такой механизм, который сам бы контролировал уникальность записей в таблице по какому-то набору полей...
6 Vladislava-smile
 
29.09.15
05:38
(5) - это намек, что такой способ есть или просто мысли в слух? ) Потому что я искала, ничего похожего не нашла ...
7 Альбатрос
 
29.09.15
05:38
(4) Для начала запрос в цикле без "ГДЕ". Затем ты говоришь, что у тебя 3 измерения регистра. Платформа не даст сама тебе сделать запись с одинаоквыми ключевыми полями.
8 Альбатрос
 
29.09.15
05:39
(6) именно намек.
9 Vladislava-smile
 
29.09.15
05:46
(7) - это понятно, что не даст, но мне нужно чтобы не было во всем регистре одинаковых значений по измерению. (8) - окей, еще поищу. Спасибо.
10 Vladislava-smile
 
29.09.15
05:49
(5) Может ссылочкой кто поделится ...
11 Альбатрос
 
29.09.15
05:51
(9) Ну так сделай его единственным измерением и все
12 jurassic
 
29.09.15
05:52
(9) тогда у тебя одно измерение
13 Vladislava-smile
 
29.09.15
05:53
(11) не вариант, так как уникальными должны быть 2 кода. Это делается для обмена. Код в первой базе и код во второй соответственно.
14 jurassic
 
29.09.15
05:55
(13) выходит, у тебя два измерения. что за строка?
15 mehfk
 
29.09.15
05:56
(13) Два измерения дают тебе отношение многие ко многим. Одно измерение и один ресурс дадут тебе отношение один к одному.
16 jurassic
 
29.09.15
05:58
(15) щито? (изм1 - рес1, изм1 - рес2) - это один к одному?
17 Альбатрос
 
29.09.15
06:07
(16) этот вариант невозможен, он правильно говорит
18 Vladislava-smile
 
29.09.15
06:20
И итог то какой в ваших дебатах, господа? ))
19 Альбатрос
 
29.09.15
06:35
(18) Ну ищи запросом, только переделай. Можно еще разделить на 2 регистра
20 Vladislava-smile
 
29.09.15
06:46
(19) Не, лучше запрос, а чем этот не вариант? У меня сначала так было:
Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
    СоответствиеНоменклатурыИнсталлКНР.КодИНСТАЛЛ
ИЗ
    РегистрСведений.СоответствиеНоменклатурыИнсталлКНР КАК СоответствиеНоменклатурыИнсталлКНР
ГДЕ
    СоответствиеНоменклатурыИнсталлКНР.КодИНСТАЛЛ = &КодИНСТАЛЛ");
Запрос.УстановитьПараметр("КодИНСТАЛЛ", Запись.КодИНСТАЛЛ);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда //Есть такая запись

И второй, только к другому. Это лучше?
21 Альбатрос
 
29.09.15
06:51
(20) В ГДЕ просто добавь ИЛИ и второго запроса не нужно.
И все равно не комильфо, ибо запрос в цикле. Тем более запрос, который шерстит все записи по регистру.
22 magicSan
 
29.09.15
06:55
не проще срез последнеих в объектной модели по нужному измирению смотреть?
23 Альбатрос
 
29.09.15
06:58
(22) вангую, что РС не периодический
24 ВедущийП
 
29.09.15
07:01
Процедура ПередЗаписью(Отказ, Замещение)
Запрос = Новый Запрос("ВЫБРАТЬ
                      |    СоответствиеНоменклатурыИнсталлКНР.КодИНСТАЛЛ,
                      |    СоответствиеНоменклатурыИнсталлКНР.КодКНР
                      |ИЗ
                      |    РегистрСведений.СоответствиеНоменклатурыИнсталлКНР КАК СоответствиеНоменклатурыИнсталлКНР");
Таб = Запрос.Выполнить().Выбрать().Выгрузить();
Таб.Индексы.Добавить("КодИНСТАЛЛ");
Таб.Индексы.Добавить("КодКНР");

Для Каждого Запись из ЭтотОбъект Цикл
// Проверка на уникальность кодаИНСТАЛЛ и КодаКНР
    Если Таб.Найти(Запись.КодИНСТАЛЛ,"КодИНСТАЛЛ") <> НЕОПРЕДЕЛЕНО тогда
        Сообщить("Номенклатура Инсталл с кодом Инсталл "+Запись.КодИНСТАЛЛ+" уже записана!!!");
        Отказ=Истина;
    ИначеЕсли Таб.Найти(Запись.КодКНР,"КодКНР") <> НЕОПРЕДЕЛЕНО тогда
        Сообщить("Номенклатура Инсталл с кодом КНР "+Запись.КодКНР+" уже записана!!!");
        Отказ=Истина;
    КонецЕсли;    
КонецЦикла;
КонецПроцедуры
25 ВедущийП
 
29.09.15
07:01
Таб = Запрос.Выполнить().Выбрать().Выгрузить();

меняем на

Таб = Запрос.Выполнить().Выгрузить();
26 ВедущийП
 
29.09.15
07:02
Идея (24) в том, что мы не дергаем базу в цикле.
27 ВедущийП
 
29.09.15
07:06
Можно дальше оптимизировать, например передавать в запрос список реквизитов и смотреть на результат.
28 magicSan
 
29.09.15
07:07
(23) тогда просто получить
29 magicSan
 
29.09.15
07:07
Вариант синтаксиса: Для непериодического регистра

Синтаксис:

Получить(<Отбор>)
Параметры:

<Отбор> (необязательный)

Тип: Структура.
Структура, содержащая отбор по измерениям регистра.
В переданной структуре должны содержаться те измерения, по которым должны быть отфильтрованы записи. В элементе структуры задается имя и значение отбора. Должны указываться значения для всех измерений.
Параметр обязателен для регистров, имеющих измерения.
Структура дополнительно может иметь элементы, соответствующие разделителям регистра с уровнем разделения НезависимоИСовместно, в состав которых входит регистр. Если такой элемент структуры задан для используемого в сеансе разделителя, значение для этого элемента должно совпадать со значением разделителя, иначе будет вызвано исключение.
Неиспользуемым в сеансе разделителям регистра в структуре должен соответствовать элемент с указанным значением отбора, так же, как для всех измерений, иначе будет вызвано исключение.
Если параметр не указан, то отбор не используется.
Возвращаемое значение:

Тип: Структура.
Структура, содержащая значения ресурсов.
Описание:

Получает ресурсы регистра сведений по указанным ключевым полям.
30 ВедущийП
 
29.09.15
07:08
(29) В цикле это будет аналогично запросу.
31 magicSan
 
29.09.15
07:14
(30)Только тут две строчки а с запросом 10ок
32 Альбатрос
 
29.09.15
07:15
(31) не в строчках дело, а в оптимизации
33 Альбатрос
 
29.09.15
07:15
(24) норм вармант
34 magicSan
 
29.09.15
07:17
(32) смешно.
35 Альбатрос
 
29.09.15
07:20
(34) И что же тебя рассмешило?
36 magicSan
 
29.09.15
07:25
(35) гумно партянку выложили и рассуждаете о высоких материях оптимизации.
37 Альбатрос
 
29.09.15
07:31
(36) Ну мы-то можем рассуждать, а вот тебе до понятия оптимзации по ходу далеко еще
38 magicSan
 
29.09.15
07:36
(37) Я может чего не понял - нафига весь регистр перебирать? создавать таблицы значений искать в них - дурь какая-то.
39 Альбатрос
 
29.09.15
07:49
(38) Как думаешь, в какой запрос трансформируется метод .Получить() при обращении к БД?
40 magicSan
 
29.09.15
07:52
(39) как думаешь что проще получить результат или индексировать создавать тзх и исктаь в ней?
41 Альбатрос
 
29.09.15
07:55
(40) Если твой результат получается путем запроса как в (24) в цикле, то нахрен он нужен. В (24) нужно только отбор в запросе наложить и все
42 itlikbez
 
29.09.15
07:56
Забавно. Два уникальных ключа. Получается, нужно два справочника создавать. Или слепить два кода в один, что будет лучше.
43 itlikbez
 
29.09.15
08:01
А нет, слепить не получится. Только два справочника.
44 itlikbez
 
29.09.15
08:04
А и два справочника не нужно. Один индексированный реквизит в дополнение к коду решает проблему.
45 Vladislava-smile
 
29.09.15
08:13
Всем спасибо за такую отзывчивость, выберу что-нибудь, главное, что сейчас вариантов много )), (44) доп. реквизиты плодить не хочется только ...
46 ЧеловекДуши
 
29.09.15
08:31
Все бред. Так и непонятно, для каких таких обменов нужна такая головомойка? :)
47 Krolik Bezobraznik
 
29.09.15
08:42
Вообще не понял из за чего сыр бор. Чем набор записей РС не угодил?
48 magicSan
 
29.09.15
09:04
(41) Перед записью делаешь отбор по текущим данным - какой накуй цикл???
49 itlikbez
 
29.09.15
10:11
(45) А это никакой не доп. реквизит. Самый что ни на есть основной. У тебя, как  понимаю, два кода и каждый должен быть уникальным. Первый код хранишь в коде, а второй в индексированном реквизите. Перед записью делаешь поиск по реквизиту. Вот собственно и все.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший