Добрый день!
Есть независимый, непериодический РС.
Записываю туда записи с отбором. Сейчас получается так, что можно записывать туда 2 записи с одинаковыми измерениями, причем записывает только последнюю строку. Если я записываю 2 строки, с разными ресурсами, то записывается ресурс последнего.
Как сделать, чтобы не давало записывать 2 строки с одинаковыми измерениями и перезаписывалась та которая есть в регистре?
---
Так это решается подчинением регистра регистратору.
---
с одинаковыми значениями измерений - нельзя записать две записи.
---
Как сделать, чтобы не давало записывать 2 строки с одинаковыми измерениями и перезаписывалась та которая есть в регистреСудя по Вашему же описанию, именно так и работает сейчас запись в регистр. При последовательной записи в регистре оказывается именно та запись, что была последней. Т.е. первая перезаписывается.

Если я что-то неверно понял, то уточните, пожалуйста, как Вы видите одновременное выполнение двух условий:
- не дает записывать 2 строи с одинаковыми измерениями;
- перезаписывается существующая запись с теми же измерениями.
---
Сначала перезаписывается первая строка, потом на второй возникает ошибка, что уже есть такая запись.
---
Так вы делайте запись с замещением, а не добавлением, т.е. НаборЗаписей.Записать(), вместо НаборЗаписей.Записать(Ложь)
---
У меня НаборЗаписей.Записать(Истина);
---
Как я понимаю, у Вас идет последовательная запись с замещением условно говоря 5 наборов с одной запись. Если нужно видеть сообщение об ошибке, то:
- либо записывайте, если это возможно, сразу все несколько записей одним набором (с замещением);
- либо записывайте без замещения, т.е. параметр метода "Записать" должен быть "Ложь".
---
У меня наверное идет перезапись одной записи в регистре последовательно каждой записью из документа.
Т.е. в документе 5 записей, а в РС одна.
либо записывайте, если это возможно, сразу все несколько записей одним набором (с замещением);
Как это можно сделать?

```1c
    Я записываю так:
    НаборЗаписей = РегистрыСведений.Регистр.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Измерение1.Установить(Измерение1);
    НаборЗаписей.Отбор.Измерение2.Установить(Измерение2);
    НаборЗаписей.Отбор.Измерение3.Установить(Измерение3);
    НаборЗаписей.Отбор.Измерение4.Установить(Измерение4);
    НаборЗаписей.Прочитать();
    Для Каждого СтрокаДанных Из НаборЗаписей Цикл
    НовЗапись = НаборЗаписей.Добавить();
    НовЗапись.Измерение1= Измерение1;
    НовЗапись.Измерение2= Измерение2;
    НовЗапись.Измерение3= Измерение3;
    НовЗапись.Измерение4= Измерение4;
    НовЗапись.Статус = Статус;
    НовЗапись.Комментарий = Комментарий ;
    КонецЦикла;
    НаборЗаписей.Записать(Истина);
```
---
Все верно. Вы записываете одним набором. В таком случае, если хотите получить сообщение об ошибке, воспользуйтесь вторым советом.
---
А как сделать первым советом? Я этот код переделала именно для того, чтобы не писать при записи ложь. До этого у меня не одним набором была запись, а последовательно каждую запись и все равно не было ошибки..
---
Извините, я не понимаю, чего Вы добиваетесь, и как выбираете для этого средства.

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

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

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

P.S. В конце концов всегда можно написать проверку самому и выдать нужное сообщение об ошибке.
---
Если ставите "Истина", то записи в регистре не контролируются. Контролируются только записи в самом наборе.
Так я и записываю одинаковые данные по измерениям в одном наборе, меняю только ресурс.
Я посмотрела во всей конфигурации у меня только 1 раз с Ложь идет запись. Поэтому и усомнилась, что это хороший вариант..
Как то же без этого следят за актуальностью данных.
---
Правильно ли я понял Ваше сообщение? В одном наборе записей у Вас есть несколько строк с одинаковым сочетанием значений измерений? И запись осуществляется без сообщения об ошибке?
---
Да, все так.
---
Это невозможно. Вы что-то упускаете.
---
Записывается последняя запись, ошибки при этом не возникает.. Может быть я не правильно записываю? Потому что если я в регистр самостоятельно хочу записать дубль, то не дает такого сделать.
Потому что тот код, который я ниже написала он тоже не правильный :-( Потому что если нет записей в регистре, то вообще ничего в него не пишется..
---
Зачем Вы обходите коллекцию записей, которые только что прочитали из регистра? Зачем вообще ее читаете перед записью?
---
Кстати, что касается кода. Вы обходите набор записей и добавляете записи в него же. Тут какая-то ошибка.
---
Да, не совсем верно написала, внизу есть исправленный текст.
---
в одном наборе записей несколько строк с одинаковыми значениями измерений не может быть, о чем вам 1С и сообщает :)
---
записей двух строк с одинаковыми значениям
Мне ничего не сообщает, в том то и дело, просто перезаписывает и все. Должен ругнуться, а то получается, что в предприятии 5 строк одинаковых, а в регистре одна последняя..
---
не может быть такого, если запись не производится разными наборами записей.
Разные наборы перезаписывают данные и вы видите значения последнего записанного.
---
А как тогда сделать, чтобы было более правильно, чтобы данные в регистре и в данном случае в документе совпадали?
---
Подчинить регистр документу - это самое простое и действенное в данном случае.
Либо отказаться от записи в регистр данных из документа.
---
Возможно нарушение индексов, не пробовали тестирование и исправление сделать?
---
Код бы показали, как запись идет
---
Посмотрите выше. Почему то не получилось оформить в теги кода.
---
Вы добавляете записи в НаборЗаписей, из-за этого получаются дубли строк с одинаковыми значениями измерений.

Еще раз: подчините регистр документу.
---
Еще раз: подчините регистр документу.
Подчинить документу тоже не очень. Т.к данные для записи берутся из ТЧ этого документа. А строк может быть много.
---
Проверяйте ТЧ документа на наличие дублей по комбинациям измерений перед проведением.
---
Да там абсолютные дубли. Я копированием создаю вторую строку.
---
Тогда лично я логики этого документа не понимаю.
Вы уже не стесняйтесь рассказать, какую задачу вы пытаетесь решить, а там мож кто чего посоветует....
---
Тогда лично я логики этого документа не понимаю.
Вы уже не стесняйтесь рассказать, какую задачу вы пытаетесь решить, а там мож кто чего посоветует....

Логика не в том, чтобы дубли добавлять. А в том, чтобы пользователь не мог этого сделать. Пока получается что может. А это не правильно.
---
В чем сложности выполнять проверку на дубли перед записью в регистр, отказываться от записи и выводить пользователю сообщение о наличии дублей?
---
Нет сложности, но разве нельзя это сделать средствами платформы? Я думала это часть функционала РС - ругаться при попытке записать одинаковые записи..
---
Вообще код предоставленный выше в принципе должен привести к зацикливанию.
Если конечно после НаборЗаписей.Прочитать(); набор записей не пустой.

```1c
    НаборЗаписей = РегистрыСведений.Регистр.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Измерение1.Установить(Измерение1);
    НаборЗаписей.Отбор.Измерение2.Установить(Измерение2);
    НаборЗаписей.Отбор.Измерение3.Установить(Измерение3);
    НаборЗаписей.Отбор.Измерение4.Установить(Измерение4);
    НаборЗаписей.Прочитать();
    Для Каждого СтрокаДанных Из НаборЗаписей Цикл
    НовЗапись = НаборЗаписей.Добавить();
    НовЗапись.Измерение1= Измерение1;
    НовЗапись.Измерение2= Измерение2;
    НовЗапись.Измерение3= Измерение3;
    НовЗапись.Измерение4= Измерение4;
    НовЗапись.Статус = Статус;
    НовЗапись.Комментарий = Комментарий ;
    КонецЦикла;
    НаборЗаписей.Записать(Истина);
```
---
Вообще код предоставленный выше в принципе должен привести к зацикливанию.
Если конечно после НаборЗаписей.Прочитать(); набор записей не пустой.
Да, точно. Что же делать, вроде такая простая задача, но вот кроме как программно проверять наличие дублей перед записью в регистр ничего не могу придумать.
---
в отладке посмотрите какой набор записей вы пытаетесь записать и что в нем есть
---
в отладке посмотрите какой набор записей вы пытаетесь записать и что в нем есть
Это по какому варианту? Запись набором всех записей?
---
Переделала, чтобы не было зацикливания

```1c
    Для каждого Строка Из Таблица Цикл
    НаборЗаписей = РегистрыСведений.Регистр.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Измерение1.Установить(Измерение1);
    НаборЗаписей.Отбор.Измерение2.Установить(Измерение2);
    НаборЗаписей.Отбор.Измерение3.Установить(Измерение3);
    НаборЗаписей.Отбор.Измерение4.Установить(Измерение4);
    НаборЗаписей.Прочитать();
    Для каждого ЗаписьНабора из НаборЗаписей Цикл
    ЗаписьНабора.Измерение1= Измерение1;
    ЗаписьНабора.Измерение4=Измерение4;
    ЗаписьНабора.Измерение2= Измерение2;
    ЗаписьНабора.Измерение3= Измерение3;
    ЗаписьНабора.Статус = СтатусСценария;
    ЗаписьНабора.Статус= Статус;
    КонецЦикла;
    КонецЦикла;
```
---
НаборЗаписей.Прочитать();
Что это?
если Вы хотите понять если записи ранее, то просто если после НаборЗаписей.Прочитать(); набор записей уже не пустой, то значит записи уже есть ранее.
Либо не надо читать набор записей, заполните его и попытайтесь записать. Только Замещать = ложь. И отругается он Вам что такие записи уже есть.
---
А есть у вас пример такой записи? Я уже несколько раз все меняла, а воз и ныне там.. Желательно без НаборЗаписей.Записать(Ложь)
---
Да вы прикалываетесь что ли? Зачем вы обходите полученный набор записей и переприсваиваете измерениям их же значения, а потом удивляетесь, что проверка не работает и записывается последнее значение?

Делаете:

НаборЗаписей.Прочитать();
Для каждого Стр Из ТЧДокумента Цикл
запись = НаборЗаписей.Добавить();
запись.Измерение1 = Измерение1;
.....
КонецЦикла;
НаборЗаписей.Записать();
---
Да вы прикалываетесь что ли
Нет, не прикалываюсь. Я правильно поняла, что надо 2 раза обойти ТЧ документа?Потому что у меня одно измерение содержится в строках ТЧ.

```1c
    Для каждого Строка Из ТЧ Цикл
    НаборЗаписей = РегистрыСведений.Регистр.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Измерение1 .Установить(Измерение1 );
    НаборЗаписей.Отбор.Измерение2 .Установить(Измерение2 );
    НаборЗаписей.Отбор.Измерение3 .Установить(Измерение3 );
    НаборЗаписей.Прочитать();
    Для каждого Стр Из ТЧ Цикл
    ЗаписьНабора = НаборЗаписей.Добавить();
    ЗаписьНабора.Измерение1 = Измерение1 ;
    ЗаписьНабора.Измерение2 = Измерение2 ;
    ЗаписьНабора.Измерение3 = Измерение3 ;
    КонецЦикла;
    НаборЗаписей.Записать();
    КонецЦикла;
```
---
если в тч хранится только одно из 4-х измерений, то значит 3 раза, чтобы получились все возможные комбинации из 4-х измерений.
---
Нет, два раза я имела в ввиду что сначала надо делать цикл - Для каждого Строка Из ТЧ Цикл. И потом еще в этом цикле второй раз цикл опять по табличной части дока Для каждого Стр Из ТЧ Цикл.
Если так, то мне вообще только 1 раз дает записать.. А если пользователь зашел еще раз, что то поменял в документе, то все. Уже ругается.
---
на сколько понял, нет необходимости обходить два раза, тем более в таком виде, в котором вы собираетесь это делать, т.е. без установки значения 4-го измерения.
Если значение измерение4 содержится в ТЧ, то должно быть достаточно:

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

    ЗаписьНабора = НаборЗаписей.Добавить();
    ЗаписьНабора.Измерение1 = Измерение1 ;
    ЗаписьНабора.Измерение2 = Измерение2 ;
    ЗаписьНабора.Измерение3 = Измерение3 ;
    ЗаписьНабора.Измерение4 = Измерение4 ;
    НаборЗаписей.Записать();
    КонецЦикла;
```
---
Возможно, хватит и такого варианта:

```1c
    НаборЗаписей = РегистрыСведений.Регистр.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Измерение1 .Установить(Измерение1 );
    НаборЗаписей.Отбор.Измерение2 .Установить(Измерение2 );
    НаборЗаписей.Отбор.Измерение3 .Установить(Измерение3 );
    НаборЗаписей.Прочитать();
    Для каждого Стр Из ТЧ Цикл
    ЗаписьНабора = НаборЗаписей.Добавить();
    ЗаписьНабора.Измерение1 = Измерение1 ;
    ЗаписьНабора.Измерение2 = Измерение2 ;
    ЗаписьНабора.Измерение3 = Измерение3 ;
    ЗаписьНабора.Измерение4 = Измерение4 ;
    КонецЦикла;
    НаборЗаписей.Записать();
```
---
нет, не дает перезаписать одну единственную запись. Я убрала НаборЗаписей.Прочитать(); и вроде как заработало. Надеюсь не будет внештатных ситуаций например когда я все записи по другим докам буду перезатирать последним.
---
Лично мне до сих пор остается не понятным, как вы потом разберетесь, какой из документов изменил записи в регистре на последнее их состояние?
---
У меня ссылка на документ одно из измерений.
---
Так это решается подчинением регистра регистратору.
---
Получается что да :-)
---
В таком случае, перестаньте изобретать велосипед с квадратными колесами и сделайте по аналогии кадровых документов и отражения кадровой истории с помощью регистра сведений.
---
ументов и отражения кадровой истории с помощью регистра с
Это в каком то типовом решении? Надо будет поискать, спасибо!
---
ЗУП, вестимо.