Уникальность записей в РС

1. Metabos 29 18.10.19 12:11 Сейчас в теме
Добрый день!
Есть независимый, непериодический РС.
Записываю туда записи с отбором. Сейчас получается так, что можно записывать туда 2 записи с одинаковыми измерениями, причем записывает только последнюю строку. Если я записываю 2 строки, с разными ресурсами, то записывается ресурс последнего.
Как сделать, чтобы не давало записывать 2 строки с одинаковыми измерениями и перезаписывалась та которая есть в регистре?
По теме из базы знаний
Найденные решения
52. nomad_irk 72 19.10.19 10:06 Сейчас в теме
(51) Так это решается подчинением регистра регистратору.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 72 18.10.19 12:15 Сейчас в теме
(1) с одинаковыми значениями измерений - нельзя записать две записи.
3. dhurricane 18.10.19 12:16 Сейчас в теме
(1)
Как сделать, чтобы не давало записывать 2 строки с одинаковыми измерениями и перезаписывалась та которая есть в регистре
Судя по Вашему же описанию, именно так и работает сейчас запись в регистр. При последовательной записи в регистре оказывается именно та запись, что была последней. Т.е. первая перезаписывается.

Если я что-то неверно понял, то уточните, пожалуйста, как Вы видите одновременное выполнение двух условий:
- не дает записывать 2 строи с одинаковыми измерениями;
- перезаписывается существующая запись с теми же измерениями.
4. Metabos 29 18.10.19 12:24 Сейчас в теме
(3) Сначала перезаписывается первая строка, потом на второй возникает ошибка, что уже есть такая запись.
5. nomad_irk 72 18.10.19 12:26 Сейчас в теме
(4)Так вы делайте запись с замещением, а не добавлением, т.е. НаборЗаписей.Записать(), вместо НаборЗаписей.Записать(Ложь)
6. Metabos 29 18.10.19 12:50 Сейчас в теме
(5)У меня НаборЗаписей.Записать(Истина);
11. dhurricane 18.10.19 13:13 Сейчас в теме
(6) Как я понимаю, у Вас идет последовательная запись с замещением условно говоря 5 наборов с одной запись. Если нужно видеть сообщение об ошибке, то:
- либо записывайте, если это возможно, сразу все несколько записей одним набором (с замещением);
- либо записывайте без замещения, т.е. параметр метода "Записать" должен быть "Ложь".
15. Metabos 29 18.10.19 13:38 Сейчас в теме
(11) У меня наверное идет перезапись одной записи в регистре последовательно каждой записью из документа.
Т.е. в документе 5 записей, а в РС одна.
либо записывайте, если это возможно, сразу все несколько записей одним набором (с замещением);

Как это можно сделать?
Я записываю так:
                НаборЗаписей = РегистрыСведений.Регистр.СоздатьНаборЗаписей();		
		НаборЗаписей.Отбор.Измерение1.Установить(Измерение1);
		НаборЗаписей.Отбор.Измерение2.Установить(Измерение2);
		НаборЗаписей.Отбор.Измерение3.Установить(Измерение3);
		НаборЗаписей.Отбор.Измерение4.Установить(Измерение4);
		НаборЗаписей.Прочитать();
		Для Каждого СтрокаДанных Из НаборЗаписей Цикл 
			НовЗапись = НаборЗаписей.Добавить();		
			НовЗапись.Измерение1= Измерение1;
			НовЗапись.Измерение2= Измерение2;
			НовЗапись.Измерение3= Измерение3;
			НовЗапись.Измерение4= Измерение4;
			НовЗапись.Статус = Статус; 
			НовЗапись.Комментарий = Комментарий ;
		КонецЦикла; 
		НаборЗаписей.Записать(Истина);
Показать
16. dhurricane 18.10.19 13:48 Сейчас в теме
(15) Все верно. Вы записываете одним набором. В таком случае, если хотите получить сообщение об ошибке, воспользуйтесь вторым советом.
17. Metabos 29 18.10.19 14:01 Сейчас в теме
(16) А как сделать первым советом? Я этот код переделала именно для того, чтобы не писать при записи ложь. До этого у меня не одним набором была запись, а последовательно каждую запись и все равно не было ошибки..
18. dhurricane 18.10.19 14:09 Сейчас в теме
(17) Извините, я не понимаю, чего Вы добиваетесь, и как выбираете для этого средства.

1. Если Вы хотите, чтобы при записи любого набора данных в регистре контролировалось наличие уже ранее записанных данных, то нужно ставить "Ложь".

2. Если ставите "Истина", то записи в регистре не контролируются. Контролируются только записи в самом наборе.

3. Если Вам необходимо осуществлять запись в регистр по одной строчке за проход, нужно также учитывать пункты выше: каждая последующая запись - новая, каждая предыдущая - старая, записанная в регистр ранее.

P.S. В конце концов всегда можно написать проверку самому и выдать нужное сообщение об ошибке.
19. Metabos 29 18.10.19 14:27 Сейчас в теме
(18)
Если ставите "Истина", то записи в регистре не контролируются. Контролируются только записи в самом наборе.

Так я и записываю одинаковые данные по измерениям в одном наборе, меняю только ресурс.
Я посмотрела во всей конфигурации у меня только 1 раз с Ложь идет запись. Поэтому и усомнилась, что это хороший вариант..
Как то же без этого следят за актуальностью данных.
21. dhurricane 18.10.19 14:32 Сейчас в теме
(19) Правильно ли я понял Ваше сообщение? В одном наборе записей у Вас есть несколько строк с одинаковым сочетанием значений измерений? И запись осуществляется без сообщения об ошибке?
34. Metabos 29 18.10.19 15:16 Сейчас в теме
36. dhurricane 18.10.19 15:18 Сейчас в теме
(34) Это невозможно. Вы что-то упускаете.
37. Metabos 29 18.10.19 15:21 Сейчас в теме
(36)Записывается последняя запись, ошибки при этом не возникает.. Может быть я не правильно записываю? Потому что если я в регистр самостоятельно хочу записать дубль, то не дает такого сделать.
Потому что тот код, который я ниже написала он тоже не правильный :-( Потому что если нет записей в регистре, то вообще ничего в него не пишется..
39. dhurricane 18.10.19 15:22 Сейчас в теме
(37) Зачем Вы обходите коллекцию записей, которые только что прочитали из регистра? Зачем вообще ее читаете перед записью?
22. dhurricane 18.10.19 14:33 Сейчас в теме
(15) Кстати, что касается кода. Вы обходите набор записей и добавляете записи в него же. Тут какая-то ошибка.
35. Metabos 29 18.10.19 15:17 Сейчас в теме
(22)Да, не совсем верно написала, внизу есть исправленный текст.
7. nomad_irk 72 18.10.19 12:53 Сейчас в теме
(6) в одном наборе записей несколько строк с одинаковыми значениями измерений не может быть, о чем вам 1С и сообщает :)
8. Metabos 29 18.10.19 12:57 Сейчас в теме
(7)
записей двух строк с одинаковыми значениям

Мне ничего не сообщает, в том то и дело, просто перезаписывает и все. Должен ругнуться, а то получается, что в предприятии 5 строк одинаковых, а в регистре одна последняя..
10. nomad_irk 72 18.10.19 13:06 Сейчас в теме
(8) не может быть такого, если запись не производится разными наборами записей.
Разные наборы перезаписывают данные и вы видите значения последнего записанного.
12. Metabos 29 18.10.19 13:17 Сейчас в теме
(10) А как тогда сделать, чтобы было более правильно, чтобы данные в регистре и в данном случае в документе совпадали?
13. nomad_irk 72 18.10.19 13:19 Сейчас в теме
(12)Подчинить регистр документу - это самое простое и действенное в данном случае.
Либо отказаться от записи в регистр данных из документа.
9. AlexandrSmith 69 18.10.19 13:05 Сейчас в теме
Возможно нарушение индексов, не пробовали тестирование и исправление сделать?
14. LifeRock 18.10.19 13:21 Сейчас в теме
Код бы показали, как запись идет
20. Metabos 29 18.10.19 14:27 Сейчас в теме
(14)Посмотрите выше. Почему то не получилось оформить в теги кода.
23. nomad_irk 72 18.10.19 14:37 Сейчас в теме
(20)Вы добавляете записи в НаборЗаписей, из-за этого получаются дубли строк с одинаковыми значениями измерений.

Еще раз: подчините регистр документу.
24. Metabos 29 18.10.19 14:48 Сейчас в теме
(23)
Еще раз: подчините регистр документу.

Подчинить документу тоже не очень. Т.к данные для записи берутся из ТЧ этого документа. А строк может быть много.
28. nomad_irk 72 18.10.19 15:05 Сейчас в теме
(24) Проверяйте ТЧ документа на наличие дублей по комбинациям измерений перед проведением.
30. Metabos 29 18.10.19 15:09 Сейчас в теме
(28)Да там абсолютные дубли. Я копированием создаю вторую строку.
31. nomad_irk 72 18.10.19 15:12 Сейчас в теме
(30) Тогда лично я логики этого документа не понимаю.
Вы уже не стесняйтесь рассказать, какую задачу вы пытаетесь решить, а там мож кто чего посоветует....
33. Metabos 29 18.10.19 15:16 Сейчас в теме
(31)
Тогда лично я логики этого документа не понимаю.
Вы уже не стесняйтесь рассказать, какую задачу вы пытаетесь решить, а там мож кто чего посоветует....

Логика не в том, чтобы дубли добавлять. А в том, чтобы пользователь не мог этого сделать. Пока получается что может. А это не правильно.
38. nomad_irk 72 18.10.19 15:21 Сейчас в теме
(33)В чем сложности выполнять проверку на дубли перед записью в регистр, отказываться от записи и выводить пользователю сообщение о наличии дублей?
40. Metabos 29 18.10.19 15:23 Сейчас в теме
(38)Нет сложности, но разве нельзя это сделать средствами платформы? Я думала это часть функционала РС - ругаться при попытке записать одинаковые записи..
25. LifeRock 18.10.19 14:53 Сейчас в теме
Вообще код предоставленный выше в принципе должен привести к зацикливанию.
Если конечно после НаборЗаписей.Прочитать(); набор записей не пустой.

НаборЗаписей = РегистрыСведений.Регистр.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Измерение1.Установить(Измерение1);
НаборЗаписей.Отбор.Измерение2.Установить(Измерение2);
НаборЗаписей.Отбор.Измерение3.Установить(Измерение3);
НаборЗаписей.Отбор.Измерение4.Установить(Измерение4);
НаборЗаписей.Прочитать();
Для Каждого СтрокаДанных Из НаборЗаписей Цикл
НовЗапись = НаборЗаписей.Добавить();
НовЗапись.Измерение1= Измерение1;
НовЗапись.Измерение2= Измерение2;
НовЗапись.Измерение3= Измерение3;
НовЗапись.Измерение4= Измерение4;
НовЗапись.Статус = Статус;
НовЗапись.Комментарий = Комментарий ;
КонецЦикла;
НаборЗаписей.Записать(Истина);
Показать
nomad_irk; +1 Ответить
27. Metabos 29 18.10.19 15:04 Сейчас в теме
(25)
Вообще код предоставленный выше в принципе должен привести к зацикливанию.
Если конечно после НаборЗаписей.Прочитать(); набор записей не пустой.

Да, точно. Что же делать, вроде такая простая задача, но вот кроме как программно проверять наличие дублей перед записью в регистр ничего не могу придумать.
26. LifeRock 18.10.19 14:54 Сейчас в теме
в отладке посмотрите какой набор записей вы пытаетесь записать и что в нем есть
29. Metabos 29 18.10.19 15:07 Сейчас в теме
(26)
в отладке посмотрите какой набор записей вы пытаетесь записать и что в нем есть

Это по какому варианту? Запись набором всех записей?
32. Metabos 29 18.10.19 15:14 Сейчас в теме
Переделала, чтобы не было зацикливания
Для каждого Строка Из Таблица Цикл
		НаборЗаписей = РегистрыСведений.Регистр.СоздатьНаборЗаписей();		
		НаборЗаписей.Отбор.Измерение1.Установить(Измерение1);
		НаборЗаписей.Отбор.Измерение2.Установить(Измерение2);
		НаборЗаписей.Отбор.Измерение3.Установить(Измерение3);
		НаборЗаписей.Отбор.Измерение4.Установить(Измерение4);
		НаборЗаписей.Прочитать();
		Для каждого ЗаписьНабора из НаборЗаписей Цикл
			ЗаписьНабора.Измерение1= Измерение1;
			ЗаписьНабора.Измерение4=Измерение4;
			ЗаписьНабора.Измерение2= Измерение2;
			ЗаписьНабора.Измерение3= Измерение3;
			ЗаписьНабора.Статус = СтатусСценария; 
			ЗаписьНабора.Статус= Статус;	
		КонецЦикла;	
	КонецЦикла;
Показать
41. LifeRock 18.10.19 15:24 Сейчас в теме
(32)
НаборЗаписей.Прочитать();

Что это?
если Вы хотите понять если записи ранее, то просто если после НаборЗаписей.Прочитать(); набор записей уже не пустой, то значит записи уже есть ранее.
Либо не надо читать набор записей, заполните его и попытайтесь записать. Только Замещать = ложь. И отругается он Вам что такие записи уже есть.
42. Metabos 29 18.10.19 16:19 Сейчас в теме
(41) А есть у вас пример такой записи? Я уже несколько раз все меняла, а воз и ныне там.. Желательно без НаборЗаписей.Записать(Ложь)
43. nomad_irk 72 18.10.19 18:03 Сейчас в теме
Да вы прикалываетесь что ли? Зачем вы обходите полученный набор записей и переприсваиваете измерениям их же значения, а потом удивляетесь, что проверка не работает и записывается последнее значение?

Делаете:

НаборЗаписей.Прочитать();
Для каждого Стр Из ТЧДокумента Цикл
запись = НаборЗаписей.Добавить();
запись.Измерение1 = Измерение1;
.....
КонецЦикла;
НаборЗаписей.Записать();
44. Metabos 29 18.10.19 20:16 Сейчас в теме
(43)
Да вы прикалываетесь что ли

Нет, не прикалываюсь. Я правильно поняла, что надо 2 раза обойти ТЧ документа?Потому что у меня одно измерение содержится в строках ТЧ.
Для каждого Строка Из ТЧ Цикл
		НаборЗаписей = РегистрыСведений.Регистр.СоздатьНаборЗаписей();		
		НаборЗаписей.Отбор.Измерение1 .Установить(Измерение1 );
		НаборЗаписей.Отбор.Измерение2 .Установить(Измерение2 );
		НаборЗаписей.Отбор.Измерение3 .Установить(Измерение3 );
		НаборЗаписей.Прочитать();
		Для каждого Стр Из ТЧ Цикл
			ЗаписьНабора = НаборЗаписей.Добавить();
			ЗаписьНабора.Измерение1 = Измерение1 ;
			ЗаписьНабора.Измерение2 = Измерение2 ;
			ЗаписьНабора.Измерение3 = Измерение3 ;
		КонецЦикла;
		НаборЗаписей.Записать();
	КонецЦикла;
Показать
45. nomad_irk 72 18.10.19 22:34 Сейчас в теме
(44) если в тч хранится только одно из 4-х измерений, то значит 3 раза, чтобы получились все возможные комбинации из 4-х измерений.
46. Metabos 29 18.10.19 23:09 Сейчас в теме
(45)Нет, два раза я имела в ввиду что сначала надо делать цикл - Для каждого Строка Из ТЧ Цикл. И потом еще в этом цикле второй раз цикл опять по табличной части дока Для каждого Стр Из ТЧ Цикл.
Если так, то мне вообще только 1 раз дает записать.. А если пользователь зашел еще раз, что то поменял в документе, то все. Уже ругается.
47. nomad_irk 72 19.10.19 06:09 Сейчас в теме
(46) на сколько понял, нет необходимости обходить два раза, тем более в таком виде, в котором вы собираетесь это делать, т.е. без установки значения 4-го измерения.
Если значение измерение4 содержится в ТЧ, то должно быть достаточно:

НаборЗаписей = РегистрыСведений.Регистр.СоздатьНаборЗаписей();        
НаборЗаписей.Отбор.Измерение1 .Установить(Измерение1 );
НаборЗаписей.Отбор.Измерение2 .Установить(Измерение2 );
НаборЗаписей.Отбор.Измерение3 .Установить(Измерение3 );
Для каждого Стр Из ТЧ Цикл
     НаборЗаписей.Отбор.Измерение4 .Установить(Измерение4 );
     НаборЗаписей.Прочитать();

     ЗаписьНабора = НаборЗаписей.Добавить();
     ЗаписьНабора.Измерение1 = Измерение1 ;
     ЗаписьНабора.Измерение2 = Измерение2 ;
     ЗаписьНабора.Измерение3 = Измерение3 ;
     ЗаписьНабора.Измерение4 = Измерение4 ;
     НаборЗаписей.Записать();
КонецЦикла;
Показать
48. nomad_irk 72 19.10.19 08:29 Сейчас в теме
(46) Возможно, хватит и такого варианта:

НаборЗаписей = РегистрыСведений.Регистр.СоздатьНаборЗаписей();        
НаборЗаписей.Отбор.Измерение1 .Установить(Измерение1 );
НаборЗаписей.Отбор.Измерение2 .Установить(Измерение2 );
НаборЗаписей.Отбор.Измерение3 .Установить(Измерение3 );
НаборЗаписей.Прочитать();
Для каждого Стр Из ТЧ Цикл
     ЗаписьНабора = НаборЗаписей.Добавить();
     ЗаписьНабора.Измерение1 = Измерение1 ;
     ЗаписьНабора.Измерение2 = Измерение2 ;
     ЗаписьНабора.Измерение3 = Измерение3 ;
     ЗаписьНабора.Измерение4 = Измерение4 ;
КонецЦикла;
НаборЗаписей.Записать();
Показать
49. Metabos 29 19.10.19 09:42 Сейчас в теме
(48) нет, не дает перезаписать одну единственную запись. Я убрала НаборЗаписей.Прочитать(); и вроде как заработало. Надеюсь не будет внештатных ситуаций например когда я все записи по другим докам буду перезатирать последним.
50. nomad_irk 72 19.10.19 09:46 Сейчас в теме
(49) Лично мне до сих пор остается не понятным, как вы потом разберетесь, какой из документов изменил записи в регистре на последнее их состояние?
51. Metabos 29 19.10.19 09:54 Сейчас в теме
(50)У меня ссылка на документ одно из измерений.
52. nomad_irk 72 19.10.19 10:06 Сейчас в теме
(51) Так это решается подчинением регистра регистратору.
53. Metabos 29 19.10.19 10:42 Сейчас в теме
54. nomad_irk 72 19.10.19 10:45 Сейчас в теме
(53) В таком случае, перестаньте изобретать велосипед с квадратными колесами и сделайте по аналогии кадровых документов и отражения кадровой истории с помощью регистра сведений.
55. Metabos 29 19.10.19 10:51 Сейчас в теме
(54)
ументов и отражения кадровой истории с помощью регистра с

Это в каком то типовом решении? Надо будет поискать, спасибо!
56. nomad_irk 72 19.10.19 10:52 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот