Непереодический регистр сведений "штрихкоды" Обычные формы. УТ 10.3

```1c
    Менеджер = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
    Менеджер.Отбор.Штрихкод.Установить(ВыбранноеЗначение);
    Менеджер.Прочитать();

    Менеджер[0].Владелец = ЭтотОбъект.Ссылка;
    Менеджер[0].Поставщик = ЭлементыФормы.МТД_Поставщики.ТекущаяСтрока.Поставщики;
    Менеджер[0].ЕдиницаИзмерения = ЭтотОбъект.БазоваяЕдиницаИзмерения;
    Менеджер[0].Качество = Справочники.Качество.Новый;

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Штрихкоды.ТипШтрихкода
    |ИЗ
    | РегистрСведений.Штрихкоды КАК Штрихкоды
    |ГДЕ
    | Штрихкоды.Штрихкод = &Штрихкод";
    Запрос.УстановитьПараметр("Штрихкод", ВыбранноеЗначение);

    Результат = Запрос.Выполнить().Выгрузить();
    Менеджер[0].ТипШтрихкода = Запрос.Выполнить().Выгрузить()[0].ТипШтрихкода;
    Менеджер[0].Штрихкод = ВыбранноеЗначение;

    Менеджер.Записать();
```

Пишет что у этого штрихкода уже есть запись. В чем ошибка?
---
Рабочий вариант

```1c
    Менеджер = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
    Менеджер.Отбор.Штрихкод.Установить(ВыбранноеЗначение);
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Штрихкоды.ТипШтрихкода
    |ИЗ
    | РегистрСведений.Штрихкоды КАК Штрихкоды
    |ГДЕ
    | Штрихкоды.Штрихкод = &Штрихкод";
    Запрос.УстановитьПараметр("Штрихкод", ВыбранноеЗначение);

    Результат = Запрос.Выполнить().Выгрузить();
    ТипШтрихкода = Запрос.Выполнить().Выгрузить()[0].ТипШтрихкода;
    Менеджер.Записать();

    НовЗапись = Менеджер.Добавить();
    НовЗапись.Владелец = ЭтотОбъект.Ссылка;
    НовЗапись.Поставщик = ЭлементыФормы.МТД_Поставщики.ТекущаяСтрока.Поставщики;
    НовЗапись.ЕдиницаИзмерения = ЭтотОбъект.БазоваяЕдиницаИзмерения;
    НовЗапись.Качество = Справочники.Качество.Новый;
    НовЗапись.ТипШтрихкода = ТипШтрихкода;
    НовЗапись.Штрихкод = ВыбранноеЗначение;
    МТД_Штрихкод = ВыбранноеЗначение;

    Менеджер.Записать();
```
---
Странный код, почему, если нужна одна запись не сделать ее менеджером записи вместо набора? Ну а если по работоспособности, то попробуйте написать Менеджер.Записать(Истина);
---
Менеджер.Записать(Истина);

Тоже не работает
---
поддерживаю (2), меняете одну запись, используйте СоздатьМенеджерЗаписи()

по ошибке, скорее всего сейчас получаете несколько записей, но меняете только первую, остальные не запишутся, т.к. уже записи с точно таким же измерениями существуют
---
А как отбор сделать? В менеджере же вроде нет отбора
---
У вас же уже сделан отбор. Вот здесь:
 Менеджер.Отбор.Штрихкод.Установить(ВыбранноеЗначение);
Если всегда может быть только одна строка, то нужно убрать Менеджер.Прочитать(); и потом добавить одну строки. тогда все старые данные автоматически сотрутся при записи. Только обязательно пробуйте на копии, потому, что при неправильном отборе можно вообще весь регистр очистить.
---
Запрос у вас вообще лишний. вместо него достаточно:
Менеджер[0].ТипШтрихкода = ВыбранноеЗначение.ТипШтрихкода;

Нет, так нельзя)
---
Да я уже заметил и исправил комментарий.
Но у вас тут совсем как-то все странно. вы делаете отбор по полю Штрихкод, потом из этого же самого регистра выбираете тип штрихкода по этому же отбору. у вас либо при первом отборе это значение уже будет заполнено, либо оно будет пусто (если такой записи нет в регистра).
В общем, что-то тут с логикой работы неправильно, либо я что-то не так понимаю)))
---
Вот здесь:
Менеджер.Отбор.Штрихкод.Установить(ВыбранноеЗначение);

Он же только у набора записей работает
---
Из синтекс-помощника по менеджеру записи:

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

То есть без отбора. просто устанавливаем значения.
---
```1c
    Менеджер = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
    Менеджер.Штрихкод = ВыбранноеЗначение;
    Менеджер.Прочитать();

    Менеджер.Владелец = ЭтотОбъект.Ссылка;
    Менеджер.Поставщик = ЭлементыФормы.МТД_Поставщики.ТекущаяСтрока.Поставщики;
    Менеджер.ЕдиницаИзмерения = ЭтотОбъект.БазоваяЕдиницаИзмерения;
    Менеджер.Качество = Справочники.Качество.Новый;

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Штрихкоды.ТипШтрихкода
    |ИЗ
    | РегистрСведений.Штрихкоды КАК Штрихкоды
    |ГДЕ
    | Штрихкоды.Штрихкод = &Штрихкод";
    Запрос.УстановитьПараметр("Штрихкод", ВыбранноеЗначение);

    Результат = Запрос.Выполнить().Выгрузить();
    Менеджер.Прочитать();

    Менеджер.ТипШтрихкода = Результат[0].ТипШтрихкода;
    Менеджер.Штрихкод = ВыбранноеЗначение;

    Менеджер.Записать();
```

Все равно ошибка
---
Ошибка те же (Есть такая запись)?
Зачем Прочитать() 2 раза?
Сделайте скриншот что в переменой "Менеджер" (чтобы все поля видно было).
---
Какие поля являются измерениями?
---
(19) Ошибка те же (Есть такая запись)?
Штрихкод: MAG99912352 уже имеет владельца "АНКЕР ЛАТУННЫЙ (ЦАНГА) LAZ М6 /8х25/".
---
Так... тут уже другая ошибка... может где-то владелец проверяется?
Соответственно, есть запись, у которой владелец такой. из-за этого не записывает.
Вернее, получается, что всётаки уже есть такая запись
---
Как другая? Та же...
---
практически точно также как и для набора записей

```1c
    Менеджер = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписей();

    Менеджер.Владелец = ЭтотОбъект.Ссылка;
    Менеджер.Поставщик = ЭлементыФормы.МТД_Поставщики.ТекущаяСтрока.Поставщики;
    Менеджер.ЕдиницаИзмерения = ЭтотОбъект.БазоваяЕдиницаИзмерения;
    Менеджер.Качество = Справочники.Качество.Новый;
    Менеджер.Штрихкод = ВыбранноеЗначение;

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Штрихкоды.ТипШтрихкода
    |ИЗ
    | РегистрСведений.Штрихкоды КАК Штрихкоды
    |ГДЕ
    | Штрихкоды.Штрихкод = &Штрихкод";
    Запрос.УстановитьПараметр("Штрихкод", ВыбранноеЗначение);

    Результат = Запрос.Выполнить().Выгрузить();

    Менеджер.Прочитать();

    Если Менеджер.Выбран() Тогда
    Менеджер.ТипШтрихкода = Результат[0].ТипШтрихкода;

    Менеджер.Записать();
    КонецЕсли;
```
---
Менеджер.Выбран()
Что это обозначает?
---
Менеджер.Выбран() = Истина - запись существует
Менеджер.Выбран() = Ложь - записи нет
---
Сделайте точку останова на Менеджер.Записать(); и посмотрите, что у вас в переменной "Менеджер". Сколько строк.
И запрос у вас зачем-то 2 раза выполняется (но это не имеет отношения к вопросу)
---
одна строка
---
в ней все поля заполнены?
в регистре точно больше нет записей с такими измерениями?
---
точно
---
Не все. Точно нет.
---
Тогда делайте как нормальные люди, когда перезаписывают набором. Получаете набор, очищаете его, и после этого начинаете добавлять туда нужные строки (строку)
---
```1c
    Если мНеРазрешитьНеуникальныеШтрихкоды Тогда
    Для Каждого ТекущаяЗапись Из ЭтотОбъект Цикл
    Если ЗначениеЗаполнено(ТекущаяЗапись.ШтрихКод) Тогда
    Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1
    | РегШтрихкоды.Владелец КАК Владелец,
    | РегШтрихкоды.Штрихкод КАК Штрихкод
    |ИЗ
    | РегистрСведений.Штрихкоды КАК РегШтрихкоды
    |ГДЕ
    | РегШтрихкоды.Штрихкод = &ШтрихКод
    | И РегШтрихкоды.Владелец <> &Владелец");

    Запрос.УстановитьПараметр("ШтрихКод", ТекущаяЗапись.ШтрихКод);
    Запрос.УстановитьПараметр("Владелец", ТекущаяЗапись.Владелец);

    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();

    Сообщить("Штрихкод: " + Выборка.ШтрихКод + " уже имеет владельца "" + СокрЛП(Выборка.Владелец) + "".");
    Отказ = Истина;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
```

Нашел обход ошибки, добавил в запрос (он проверяет есть ли запись) строку

```1c
    | И РегШтрихкоды.Владелец <> &Владелец
```

В итоге у меня создается еще одна запись и с двумя одинаковыми штрихкодами, но это шляпа, надо чтобы перезаписывалось)
---
Ну так всетаки получается, что есть уже неуникальные записи.
Тот запрос, который в вопросе. Нужно убрать Менеджер.Прочитать(); и сделать через добавление новой записи в этот набор.
Тогда данные будут перезаписываться и всегда будет одна строка. Но если до записи был один владелец, а после записи стал другой, то старые данные затрутся.
Очень сложно отвечать. я даже не знаю структуру вашего регистра. какие поля являются измерениями, какие ресурсами?
---
Не понял... Если сделать набор со старой забисью, добавить еще одну запись, то старая затрется? Владелец меняться не будет. Будет добавляться измерение Поставщик и все
---
Если не делать Менеджер.Прочитать(), то старые данные затрутся. посмотрите в синтакс-помощнике.
Вы создаете набор, устанавливаете отбор, потом просто добавляете новую запись без чтения. При записи все старые данные сотрутся. останется только одна новая.
Главное не накосячить, иначе можно стереть вообще все данные из регистра.
---
```1c
    Менеджер = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
    Менеджер.Отбор.Штрихкод.Установить(ВыбранноеЗначение);

    НовЗапись = Менеджер.Добавить();
    НовЗапись.Владелец = ЭтотОбъект.Ссылка;
    НовЗапись.Поставщик = ЭлементыФормы.МТД_Поставщики.ТекущаяСтрока.Поставщики;
    НовЗапись.ЕдиницаИзмерения = ЭтотОбъект.БазоваяЕдиницаИзмерения;
    НовЗапись.Качество = Справочники.Качество.Новый;

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Штрихкоды.ТипШтрихкода
    |ИЗ
    | РегистрСведений.Штрихкоды КАК Штрихкоды
    |ГДЕ
    | Штрихкоды.Штрихкод = &Штрихкод";
    Запрос.УстановитьПараметр("Штрихкод", ВыбранноеЗначение);

    Результат = Запрос.Выполнить().Выгрузить();
    НовЗапись.ТипШтрихкода = Запрос.Выполнить().Выгрузить()[0].ТипШтрихкода;
    НовЗапись.Штрихкод = ВыбранноеЗначение;

    Менеджер.Записать();
```

Вот код. Ошибка та же...
---
Штрихкод (в регистре) это измерение или ресурс?
---
Измерение
---
Сделайте так:

```1c
    ПОПЫТКА
    Менеджер = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
    ...
    Менеджер.Записать();
    ИСКЛЮЧЕНИЕ
    Сообщить(ОписаниеОшибки());
    КОНЕЦПОПЫТКИ;
```

И сюда полный текст ошибки.
---
Рабочий вариант

```1c
    Менеджер = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
    Менеджер.Отбор.Штрихкод.Установить(ВыбранноеЗначение);
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Штрихкоды.ТипШтрихкода
    |ИЗ
    | РегистрСведений.Штрихкоды КАК Штрихкоды
    |ГДЕ
    | Штрихкоды.Штрихкод = &Штрихкод";
    Запрос.УстановитьПараметр("Штрихкод", ВыбранноеЗначение);

    Результат = Запрос.Выполнить().Выгрузить();
    ТипШтрихкода = Запрос.Выполнить().Выгрузить()[0].ТипШтрихкода;
    Менеджер.Записать();

    НовЗапись = Менеджер.Добавить();
    НовЗапись.Владелец = ЭтотОбъект.Ссылка;
    НовЗапись.Поставщик = ЭлементыФормы.МТД_Поставщики.ТекущаяСтрока.Поставщики;
    НовЗапись.ЕдиницаИзмерения = ЭтотОбъект.БазоваяЕдиницаИзмерения;
    НовЗапись.Качество = Справочники.Качество.Новый;
    НовЗапись.ТипШтрихкода = ТипШтрихкода;
    НовЗапись.Штрихкод = ВыбранноеЗначение;
    МТД_Штрихкод = ВыбранноеЗначение;

    Менеджер.Записать();
```
---
Не вижу принципиальных отличий от (31). В чем всё же была проблема?
---
Менеджер = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
    Менеджер.Отбор.Штрихкод.Установить(ВыбранноеЗначение);
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Штрихкоды.ТипШтрихкода
    |ИЗ
    | РегистрСведений.Штрихкоды КАК Штрихкоды
    |ГДЕ
    | Штрихкоды.Штрихкод = &Штрихкод";
    Запрос.УстановитьПараметр("Штрихкод", ВыбранноеЗначение);

    Результат = Запрос.Выполнить().Выгрузить();
    ТипШтрихкода = Запрос.Выполнить().Выгрузить()[0].ТипШтрихкода;
 Менеджер.Записать(); //Эта строка стирает старую

    НовЗапись = Менеджер.Добавить();
    НовЗапись.Владелец = ЭтотОбъект.Ссылка;
    НовЗапись.Поставщик = ЭлементыФормы.МТД_Поставщики.ТекущаяСтрока.Поставщики;
    НовЗапись.ЕдиницаИзмерения = ЭтотОбъект.БазоваяЕдиницаИзмерения;
    НовЗапись.Качество = Справочники.Качество.Новый;
    НовЗапись.ТипШтрихкода = ТипШтрихкода;
    НовЗапись.Штрихкод = ВыбранноеЗначение;
    МТД_Штрихкод = ВыбранноеЗначение;

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

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

Мой алгоритм дополнения существующей записи в регистр был следующий:
1. Запрос в Регистр по Штрихкоду
2. Буфферизация данных запроса запроса в переменные
3. Далее СоздатьНаборЗаписей
4. Отбор
5. Менеджер.Записать(Истина) или Менеджер.Записать()
6. Процедура Добавить() для нашего набора записей
7. Вставляем все полученные ранее в запросе значения в Добавленную запись при этом инициализируем необходимое измерение регистра (реквизит)
8. Менеджер.Записать()
9. Радуемся жизни
---
Вау!!! Народ открыл для себя тот факт, что независимый и непериодический регистр сведений желательно писать только менеджером записи, а не менеджером набора записей...