Имя: Пароль:
1C
1С v8
Изменить подчиненную запись в непериодического независимого.регистр сведений.
,
0 bizon2008
 
04.06.14
10:55
Доброго дня. Есть регистр сведений Штрихкоды, владелец справочник Номенклатуры. При загрузке данным проспали выбор единицы измерений.
То есть поучился шрихкод без единицы измерений.
Тут нашел вариант.

&НаСервере
Процедура ШрихкодУстановкаЕдиницыИзмерения()
    cпрТовар = Справочники.Номенклатура;
    
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    Номенклатура.Код,
    |    Номенклатура.Наименование,
    |    Штрихкоды.Штрихкод,
    |    Штрихкоды.ЕдиницаИзмерения
    |ИЗ
    |    РегистрСведений.Штрихкоды КАК Штрихкоды
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
    |        ПО Штрихкоды.Владелец = Номенклатура.Ссылка
    |ГДЕ
    |    Штрихкоды.ЕдиницаИзмерения.Ссылка ЕСТЬ NULL";
    РезультатЗапроса = Запрос.Выполнить();
    тзТовар = РезультатЗапроса.Выгрузить();
    ЭлементыФормы.Товар.СоздатьКолонки();

    Для каждого Строка Из тзТовар Цикл
        ТекТовар = cпрТовар.НайтиПоКоду(Строка.Код).ПолучитьОбъект();
        Сообщить(ТекТовар);
        НаборЗаписей = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
        НаборЗаписей.Отбор.Владелец.Установить(ТекТовар.Ссылка);
        НаборЗаписей.Прочитать();
        тзШтрихкод = НаборЗаписей.Выгрузить();
                
        Для Каждого Строка из тзШтрихкод Цикл
            Сообщить("- " + Строка.Владелец + " - " +Строка.ТипШтрихкода + " - " + Строка.Штрихкод);
            Строка.ЕдиницаИзмерения = ТекТовар.ЕдиницаХраненияОстатков;
        КонецЦикла;  
        
        НаборЗаписей.Загрузить(тзШтрихкод);
        НаборЗаписей.Записать()

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

Но ошибка, при НаборЗаписей.Записать()
Текст ошибки.
Штрихкод: 2000000000046 уже имеет владельца "Товара 20".

Хелп плиз.
1 Maxus43
 
04.06.14
10:59
из регистра ШтрихКоды и тяни номенклатуру, поле Владелец. Без соединений со справочником и без кода ерисиархов типа        ТекТовар = cпрТовар.НайтиПоКоду(Строка.Код).ПолучитьОбъект();
2 Maxus43
 
04.06.14
11:09
что-то типа
   Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    Штрихкоды.Владелец,
    |    Штрихкоды.Штрихкод,
    |    Штрихкоды.ЕдиницаИзмерения
    |ИЗ
    |    РегистрСведений.Штрихкоды КАК Штрихкоды
    |ГДЕ
    |    Штрихкоды.ЕдиницаИзмерения = Значение(Справочник.ЕдиницыИзмерения.ПустаяСсылка) ";
    РезультатЗапроса = Запрос.Выполнить();
    тзТовар = РезультатЗапроса.Выгрузить();
    ЭлементыФормы.Товар.СоздатьКолонки();

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

на тестовой погоняй конечно
3 bizon2008
 
04.06.14
11:19
Угуй. Такое наколякал.
&НаСервере
Процедура ШрихкодУстановкаЕдиницыИзмерения()
    Запрос = Новый Запрос;
    Запрос.Текст = "
        |ВЫБРАТЬ
        |    Штрихкоды.Владелец,
        |    Штрихкоды.Штрихкод,
        |    Штрихкоды.ЕдиницаИзмерения,
        |    Штрихкоды.ТипШтрихкода
        |ИЗ
        |    РегистрСведений.Штрихкоды КАК Штрихкоды
        |";
        
    тзШтрихкод = Запрос.Выполнить().Выгрузить();
    НаборЗаписей = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
    НаборЗаписей.Записать();
    рсШтрихкоды=РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
    НомерСтроки=1;
    
    Для каждого Строка из тзШтрихкод Цикл
        НоваяЗапись=рсШтрихкоды.Добавить();
        НоваяЗапись.Активность=Истина;
        НоваяЗапись.Владелец=Строка.Владелец;
        НоваяЗапись.Штрихкод=Строка.Штрихкод;
        Если ТипЗнч(Строка.Владелец)=Тип("СправочникСсылка.Номенклатура") Тогда
            НоваяЗапись.ЕдиницаИзмерения=Строка.Владелец.ЕдиницаХраненияОстатков;
        Иначе
            НоваяЗапись.ЕдиницаИзмерения=Справочники.ЕдиницыИзмерения.ПустаяСсылка();
        КонецЕсли;
        НоваяЗапись.ТипШтрихкода=Строка.ТипШтрихкода;
        НомерСтроки=НомерСтроки+1;
    КонецЦикла;
    Попытка
        рсШтрихкоды.Записать();
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    Сообщить("Запись закончена");    
    
КонецПроцедуры

Но блин, некузяво как регистр туда сюда гонять.
4 bizon2008
 
04.06.14
11:21
(2) Не, не работает, там проверка на уникальность отрабатывает.
5 acsent
 
04.06.14
11:26
делай через менеджер записи а не через набор
6 Maxus43
 
04.06.14
11:36
(4) на какую уникальность?
7 bizon2008
 
04.06.14
11:45
(6) В регистре сведение такой код.

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

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

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

                    Сообщить("Штрихкод: " + Выборка.ШтрихКод + " уже имеет владельца """ + СокрЛП(Выборка.Владелец) + """.");
                    Отказ = Истина;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
8 Maxus43
 
04.06.14
11:54
(7) это перед записью стоит, принудительная проверка. У тебя не будет задвоений поидее после этого кода, делай НаборЗаписей.ОбменДанными.Загрузка = Истина;
9 bizon2008
 
04.06.14
11:56
(8) И куда это воткнуть?
10 Maxus43
 
04.06.14
11:57
НаборЗаписей.ОбменДанными.Загрузка = Истина;        
НаборЗаписей.Записать();
11 bizon2008
 
04.06.14
12:02
(10) Не. Таже ошибка.
Ладно, хрень с ним, буду реестр целиком перезаписывать.
Спасибо.