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

```1c
    Запись = РегистрыСведений.<ИмяНужногоРегистра>.СоздатьМенеджерЗаписи();
    Запись.<Измерение1>= Значение1;
    Запись.<Измерение2>= Значение2;
    ..................
    Запись.<ИзмерениеN>= ЗначениеN;

    Запись.Прочитать();

    Если Запись.Выбран() Тогда
    ЗаписьСущесвует = Истина;
    Иначе
    ЗаписьСуществует = Ложь;
    КонецЕсли;
```
---
как-то так:

```1c
    Запись = РегистрыСведений.<ИмяНужногоРегистра>.СоздатьМенеджерЗаписи();
    Запись.<Измерение1>= Значение1;
    Запись.<Измерение2>= Значение2;
    ..................
    Запись.<ИзмерениеN>= ЗначениеN;

    Запись.Прочитать();

    Если Запись.Выбран() Тогда
    ЗаписьСущесвует = Истина;
    Иначе
    ЗаписьСуществует = Ложь;
    КонецЕсли;
```
---
Проще сразу записать не проверяя на наличие данных
---
проще, но мне нужно изменять имеющиеся.
---
У регистра сведений есть метод Выбрать

Вариант синтаксиса: Для непериодического регистра
Синтаксис:
Выбрать(<Отбор>, <Порядок>)
---
Я правильно понимаю вы утверждаете что записать нельзя, а перезаписать можно )

(3) Если для вас таки перезапись принципиально, то запрос будет в любом случаи предпочтительнее для поиска т.к. можно заранее выгрузить регистр в таб и потом проверять данную таблицу на наличие данных
---
да, добавить такую же запись нельзя, а перезаписать существующую можно ¯\_(ツ)_/¯
---
я правильно понимаю, что я сломал 1с т.к. у меня все записывается поверх текущих данных. Вот я молодец.
---
каким примерно кодом записываете?
---
справку хоть открывали
РегистрСведенийМенеджерЗаписи.<Имя регистра сведений> (InformationRegisterRecordManager.<Information register name>)
Записать (Write)
Синтаксис:
Записать(<Замещать>)
Параметры:
<Замещать> (необязательный)
Тип: Булево.
Определяет режим замещения существующей записи с тем же набором значений измерений регистра и с тем же периодом (для периодических регистров). Истина - если запись регистра сведений с таким набором существует, то выполняется замещение; Ложь - запись будет дописана к уже существующим в информационной базе записям.
Значение по умолчанию: Истина.
---
действительно можно записать без чтения. Спасибо
---
Из праздного любопытства интересуюсь, извините за назойливость. Но как Вам пришла такая идея о необходимости предварительного чтения данных из регистра? Вы такой подход где-то подчерпнули?
---
думаю это из-за неопытности.

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

Как говорится "Век живи - век учись".

Мне еще интересно, как это отрабатывает при интерактивном добавлении записи
---
исходя из того, что в регистре не может быть записей с одинаковыми регистрами, предполагал, что необходима проверка.Тут фишка в том, что запись с точки зрения платформы одинаковая - что с предварительным чтением, что без него. Т.е. не смотря на то, что Вы читаете запись из базы, для платформы этот факт ничего не значит. Она не ассоциирует данные в переменной с данными в ИБ, при чтении Вы получаете по сути копию значений. Соответственно при записи платформа не полагается на то, читались ли только что данные и не модифицировались ли они относительно записанных в БД. Для нее это всегда новые данные.

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

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

а для того чтобы перезаписать надо же сперва найти запись?

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

Но мне неизвестен остальной контекст выполнения вашего кода, поэтому могут быть нюансы.
---
У меня такое в процедуре после записи

```1c
    набЗаписей = РегистрыСведений.КадровыеДвижения.СоздатьНаборЗаписей();
    Сотр=ЭтотОбъект.Ссылка;
    набЗаписей.Отбор.Сотрудник.Установить(Сотр);
    набЗаписей.Отбор.СтатусСотрудника.Установить(Справочники.СтатусыСотрудников.Принят);
    набЗаписей.Отбор.ТекМагазин.Установить(ПараметрыСеанса.ТекущийМагазин);

    набЗаписей.Прочитать();
    Если набЗаписей.Количество() = 0 Тогда
    Запись = набЗаписей.Добавить();
    Запись.Период =ТекущаяДата();
    ЭтотОбъект.Магазин=ПараметрыСеанса.ТекущийМагазин;
    ЭтотОбъект.СтатусСотрудника=Справочники.СтатусыСотрудников.Принят;

    Иначе
    Запись = набЗаписей[0];
    // Запись.Период = набЗаписей.период;
    КонецЕсли;
    Запись.Сотрудник=ЭтотОбъект.Ссылка;
    Запись.ТекМагазин = ПараметрыСеанса.ТекущийМагазин;

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

Записываем новую запись
Товар - Зубочистка
Кол1 - 5
Кол2 - 3
Кол3 - 0

Потом хотим добавить Кол 3

```1c
    НаборЗаписей = СоздатьНаборЗаписей()
    НаборЗаписей.Товар = Зубочистка;
    НаборЗаписей.Кол3 = 10;
    НАборЗаписей.Записать(Истина)
```

И получаем
Товар - Зубочистка
Кол1 - 0
Кол2 - 0
Кол3 - 10

А вот если бы сделали

```1c
    НаборЗаписей = СоздатьНаборЗаписей()
    НаборЗаписей.Отбор.Товар.Установить(Зубочистка);
    НаборЗаписей.Прочитать();
    НаборЗаписей.Кол3 = 10;
    НаборЗаписей.Записать()
```

То получили бы нормальную запись
Товар - Зубочистка
Кол1 - 5
Кол2 - 3
Кол3 - 10

А истоки... Истоки они из первых версий платформы, когда СоздатьНаборЗаписей().Записать() - полностью очищал регистр (столько программистов было уволено!!!). Всегда надо было использовать Прочитать() ;-)
---
СоздатьНаборЗаписей().Записать() - полностью очищал регистр
Оно и сейчас так для независимых регистров.
---
Ок, уточню - при любой записи в БД набора без предварительного Прочитать() записывался только новый набор, очищая все остальные.
---
Не-не, я исключительно про ситуацию, когда данные регистра читаются перед тем, как полностью обновляются без сохранения прежних значений полей, либо читаются перед удалением.