Здравствуйте.
Работаю в 1С:Предприятие 8.3 (8.3.13.1644), Розница 8. Аптека, редакция 2.2 (2.2.7.32).

Имеется проблема: у штрихкодов есть несколько владельцев.

Метод исправления данной проблемы: создана внешняя обработка, в которой показывается список таких проблемных штрихкодов с несколькими владельцами и создана команда по созданию номенклатуры (для создания номенклатуры скопирована форма Справочники.Номенклатура.Формы.ФормаЭлемента).

После создания номенклатуры необходимо автоматически привязать к ней текущий выбранный штрихкод, далее пройтись по регистру сведений ор_ПрайсЛистыКонтрагентов и там, где штрихкоды совпадают с изначальным, тоже перезаписать на новую, только что созданную номенклатуру.

В основной форме внешней обработки написал вот это:

Код
```1c
    &НаКлиенте
    Процедура СоздатьНоменклатуру(Команда)

    Если Элементы.ШтрихкодыДС.ТекущаяСтрока <> Неопределено Тогда
    ПараметрПередачиВФорму = Новый Структура("ПараметрШК",Элементы.ШтрихкодыДС.ТекущиеДанные.Штрихкод);
    ОткрытьФорму ("ВнешняяОбработка.РаботаСНоменклатурой.Форма.ФормаЭлемента",,ЭтаФорма,,,,Новый ОписаниеОповещения("ПослеЗаписиНоменклатуры", ЭтаФорма, ПараметрПередачиВФорму), РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
    Иначе
    Сообщить("Ошибка. Выберите штрихкод!");
    КонецЕсли;

    КонецПроцедуры

    &НаСервере
    Процедура ПослеЗаписиНоменклатуры(Результат, допПараметры) Экспорт

    Если Результат <> Неопределено И Результат <> NULL Тогда

    //ТУТ МЕНЯЕМ ВЛАДЕЛЬЦА У ТЕКУЩЕГО ШТРИХКОДА

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

    Запрос.УстановитьПараметр("ПараметрШК", Элементы.ШтрихкодыДС.ТекущиеДанные.Штрихкод);
    РезультатЗапроса = Запрос.Выполнить().Выбрать();
    РезультатЗапроса.Владелец.Ссылка = Результат;

    Попытка
    РезультатЗапроса.Записать();
    Исключение
    Отказ = Истина;
    Сообщить("Ошибка при попытке записи владельца исходного штрихкода!");
    КонецПопытки;

    // Меняем владельца у штрихкодов в прайм-листе
    Запрос = Новый Запрос("ВЫБРАТЬ
    | ор_ПрайсЛистыКонтрагентов.Номенклатура КАК Номенклатура,
    | ор_ПрайсЛистыКонтрагентов.ШтрихКод КАК ШтрихКод
    |ИЗ
    | РегистрСведений.ор_ПрайсЛистыКонтрагентов КАК ор_ПрайсЛистыКонтрагентов
    |ГДЕ
    | ор_ПрайсЛистыКонтрагентов.ШтрихКод = &ПараметрШК");

    Запрос.УстановитьПараметр("ПараметрШК", ПараметрПередачиВФорму);
    Выборка = Запрос.Выполнить().Выбрать();

    Пока Выборка.Следующий() Цикл

    Выборка.Владелец.Ссылка = Результат;

    Попытка
    Выборка.Записать();
    Исключение
    Отказ = Истина;
    Сообщить("Ошибка при попытке записи владельца в прайс-листе контрагентов!");
    КонецПопытки;

    КонецЦикла;

    КонецЕсли;

    КонецПроцедуры
```

В форме записи номенклатуры код менял только вот тут:

Код
```1c
    &НаКлиенте
    Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)

    Если ЗначениеЗаполнено(Объект.Ссылка)
    И НЕ ДействияПослеЗаписиИЗакрытии = Неопределено
    И ДействияПослеЗаписиИЗакрытии.Свойство("СозданиеНовогоШтрихКода")
    И ДействияПослеЗаписиИЗакрытии.СозданиеНовогоШтрихКода.Свойство("ОткрытьФормуСозданияШтрихКодаПриЗакрытии") Тогда

    Если ЗавершениеРаботы Тогда
    Отказ = Истина;
    Иначе

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

    ОткрытьФорму("РегистрСведений.Штрихкоды.Форма.ФормаЗаписи", ПараметрыФормы,,,,,,РежимОткрытияОкнаФормы.Независимый);

    КонецЕсли;
    ОповеститьОВыборе(Объект.Ссылка);
    КонецЕсли;

    КонецПроцедуры

    &НаКлиенте
    Процедура ПриЗакрытии(ЗавершениеРаботы)

    // ПодключаемоеОборудование
    Если ИсползованиеВебКамеы Тогда
    Описание = Новый ОписаниеОповещения("ОтключениеВидеокамерыЗавершение", ЭтотОбъект);
    МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПоИдентификатору(Описание, ЭтаФорма.УникальныйИдентификатор, ВебКамера);
    КонецЕсли;

    МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПриЗакрытииФормы(Неопределено, ЭтотОбъект);
    // Конец ПодключаемоеОборудование

    ОповеститьОВыборе(Объект.Ссылка);

    КонецПроцедуры
```

Проблемы у меня такие:
1) Я не уверен, что корректно достал ссылку на только что созданную номенклатуру. Ссылка эта нужна для последующей привязке штрихкодов к данной номенклатуре.

2) Ругается при попытке привязки штрихкода к новой номенклатуре, как это исправить?

```1c
    РезультатЗапроса = Запрос.Выполнить().Выбрать();
    РезультатЗапроса.Владелец.Ссылка = Результат;
```

3) Как в данной ситуации сделать всю эту процедуру перепривязки в транзакции, дабы не плодить кучу номенклатур при сбое при перезаписи штрихкода?
---
```1c
    РезультатЗапроса = Запрос.Выполнить().Выбрать();
    РезультатЗапроса.Следующий();
    ОбъектШК = РезультатЗапроса.ШтрихКод.ПолучитьОбъект();
    ОбъектШК.Владелец = Результат;
    ОбъектШК.Записать()
```
---
Какая у Вас ошибка выдается, когда Вы пытаетесь привязать штрихкод к новой номенклатуре?
---
{ВнешняяОбработка.РаботаСНоменклатурой.Форма.Форма.Форма(299)}: Ошибка при получении значения атрибута контекста (ТекущиеДанные)
  Запрос.УстановитьПараметр("ПараметрШК", Элементы.ШтрихкодыДС.ТекущиеДанные.Штрихкод);
по причине:
Текущие данные таблицы недоступны на сервере

После этого работа прекращается, номенклатура создается, но штрихкоды к ней не привязываются
---
По-русски вроде написано)
Недоступны текущие данные на сервере, передавайте ШК с клиента параметром при вызове серверной процедуры.
---
Исправил. Передаю данный параметр как реквизит формы, он все равно много где используется

Теперь ругается вот так:

{ВнешняяОбработка.РаботаСНоменклатурой.Форма.Форма.Форма(301)}: Поле объекта не обнаружено (Владелец)
  РезультатЗапроса.Владелец.Ссылка = Результат;

Пробовал вот так:

РезультатЗапроса.Владелец (Результат);

Теперь ругается вот так:

{ВнешняяОбработка.РаботаСНоменклатурой.Форма.Форма.Форма(302)}: Слишком много фактических параметров
  РезультатЗапроса.Владелец (Результат);

Полагаю, это из-за этой строки:

ПараметрПередачиВФорму = Новый Структура("ПараметрШК",Элементы.ШтрихкодыДС.ТекущиеДанные.Штрихкод);

Заменил ее на:

ПараметрПередачиВФорму = ШтрихкодыДС.ТекущиеДанные.Штрихкод;

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

Можете подсказать, с чем это может быть связано и как добиться перезаписи?
---
Какие именно ошибки?
---
которые я ручками прописал:

```1c
    Исключение
    Отказ = Истина;
    Сообщить("Ошибка при попытке записи владельца исходного штрихкода!");
    КонецПопытки;
```

P.S. Мне тут подсказали, что я пытаюсь изменить регистр сведений, и там нужен менеджер записи. Ушел в google.
---
Так вам нужно было написать РезультатЗапроса.Следующий(), после того как Вы выполнили запрос

РезультатЗапроса = Запрос.Выполнить().Выбрать();
РезультатЗапроса.Следующий();
Штрихкод = РезультатЗапроса.Штрихкод;
---
Вам нужно передать параметр Элементы.ШтрихкодыДС.ТекущиеДанные.Штрихкод с клиента, так как элементы формы недоступны для чтения на сервере
---
см (8)
---
2) Ругается при попытке привязки штрихкода к новой номенклатуре, как это исправить?

РезультатЗапроса = Запрос.Выполнить().Выбрать();
РезультатЗапроса.Владелец.Ссылка = Результат;

Запрос.выполнить().Выбрать() выдаст вам Выборку, то есть множество записей. Чтобы получить конкретную запись используйте РезультатЗапроса.Следующий
---
Даже если я уверен, что штрихкод уникален (см. текст запроса) т.е. в результате запроса будет выдана единственная строка? Но, на всякий, подправил, спасибо
---
Да, одна строка - это частный случай множества (кстати, как и ноль строк, на этот случай можно использовать конструкцию "Если РезультатЗапроса.Следующий() Тогда")
---
и выше вам подсказывают правильно в (12), что нужно получить объект, а не пытаться присваивать значение выборке
---
По результату запроса наложить фильтр на набора записей регистра. Прочитать набор записей. Заполнить строки набора записей перебором. Записать набор записей регистра сведений.
---
Если выборка по справочнику То Знаениевыборки.ПолучитьОбъект(). После этого можно записывать.
---
достаточно в наборе записей переписать владельца.