8.х УПП. Как заменить Владельца ШК

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Sherry Djeanna, 12 июл 2015.

  1. TopicStarter Overlay
    Sherry Djeanna
    Offline

    Sherry Djeanna Опытный в 1С

    Регистрация:
    12 июл 2015
    Сообщения:
    70
    Симпатии:
    0
    Баллы:
    26
    Есть две базы. 1Основная, 2приемник.
    В обеих базах заводили номенклатуру и создавали штрихкоды.

    Из базы 1 перебрасывается номенклатура в базу 2.
    В 2приемник - нужно отследить штрихкоды, для которых не совпадают владельцы в базах и заменить на владельца из 1Основной, плюс - дополнить недостающими кодами из 1Основной.
    Не получается заменить владельца для уже существующего ШК. Там, где я хочу заменить Владельца в уже имеющейся записи, оказывается Менеджер после команды Прочитать - выдает пустую строку ((( т.е. реально запись не находится.
    СтрТекШК - строка ТЗ, по Выгрузке из Запроса к Регистру

    Пожалуйста, помогите разобраться, в чем ошибка?

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

    МенеджерЗаписи.Штрихкод = СтрТекШК.Штрихкод;
    МенеджерЗаписи.Владелец = СтрТекШК.Владелец;
    МенеджерЗаписи.ЕдиницаИзмерения = СтрТекШК.ЕдИзм;
    МенеджерЗаписи.Качество = СтрТекШК.Качество;

    Если СтрТекШК.Владелец.ВестиУчетПоХарактеристикам Тогда
    МенеджерЗаписи.ХарактеристикаНоменклатуры = СтрТекШК.Характеристика;
    КонецЕсли;

    Если СтрТекШК.Владелец.ВестиУчетПоСериям Тогда
    МенеджерЗаписи.СерияНоменклатуры = СтрТекШК.СерияНоменклатуры;
    КонецЕсли;
    МенеджерЗаписи.ТипШтрихкода = СтрТекШК.ТипШтрихкода;
    //(поля заполняются)
    МенеджерЗаписи.Прочитать();

    Если МенеджерЗаписи.Выбран() Тогда
    МенеджерЗаписи.Владелец= Владелец;
    Попытка
    МенеджерЗаписи.Записать();
    Сообщить ("Изменен ШК "+СтрокаШК.ШтрихКод+" к номенкл.код = "+Владелец.Код);
    Исключение
    Сообщить("Владелец не изменен");
    Сообщить(""+ОписаниеОшибки());
    КонецПопытки;

    КонецЕсли;
  2. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Здравствуйте!
    Код:
    //Попробуйте так
    Набор = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
    Набор.Отбор.Владелец.Установить(Номенклатура);
    Набор.Прочитать();
    // выгружаем набор в ТЗ для изменения реквизита по которому читался набор
    ТЗНабора = Набор.Выгрузить();
    Для каждого стр из ТЗНабора Цикл
        стр.Владелец = Номенклатура2;
    КонецЦикла;
    // создаем новый набор
    Набор = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
    Набор.Отбор.Владелец.Установить(Номенклатура2);
    Набор.Прочитать();
    // загружаем в набор измененную таблицу
    Набор.Загрузить(ТЗНабора);
    Попытка
        Набор.Записать();
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
  3. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.554
    Симпатии:
    716
    Баллы:
    204
    Вы замену владельца в 2ой базе напрямую выполняете(подключение через COM) или с помощью выгрузки/загрузки данных в/из файл(а)?
  4. TopicStarter Overlay
    Sherry Djeanna
    Offline

    Sherry Djeanna Опытный в 1С

    Регистрация:
    12 июл 2015
    Сообщения:
    70
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте, mialord.
    К сожалению, не сработало. Выдает ошибку :
    Владелец не изменен
    {Форма.Форма.Форма(88)}: Ошибка при вызове метода контекста (Записать): Не удалось записать: "Штрихкоды"!
    Штрихкод: 2000001029299 уже имеет владельца "РЕМЕНЬ".
    --- Объединение сообщений, 13 июл 2015 ---
    Здравствуйте, nomad_irk. Я делаю изменение в текущей 2й базе. Ч/з Оле я подключаюсь к 1Основной.
  5. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Я так понимаю значит у Вас включён контроль уникальности ШК в программе, значит сначала найдите запись с этим ШК и удалите её, либо отключите контроль ШК. Все зависит от того что есть норма. Если контроль ШК нужен значит сначала ищем записи с данным штрихкодом и удаляем. Так же можно для начала вывести всю информацию о пересеченных ШК и разобраться в них, но если наша задача просто свести ШК в двух базах, значит сначала ищем, убиваем, потом создаем
  6. TopicStarter Overlay
    Sherry Djeanna
    Offline

    Sherry Djeanna Опытный в 1С

    Регистрация:
    12 июл 2015
    Сообщения:
    70
    Симпатии:
    0
    Баллы:
    26
    Да, включен контроль уникальности. А почему же не получается поменять владельца? И как удалить этот ШК, если я не могу Менеджером спозиционироваться на нем? Ведь у Владельца2Базы может быть несколько ШК, а совпадать с 1Базой может только один.
  7. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Я обычно когда надо полностью синхронизировать ШК баз сначала регистры одной зачищал потом регистр второй загружал. В Вашем случае не знаю можно зачищать или нет.
    Спозиционироваться и удалить можно сначала считав запросом записи и найдя владельца у которого ШК уже используется, потом в цикле перебрать все ШК и удалить которое нужно. Ну а потом записать ШК для другого товара
  8. TopicStarter Overlay
    Sherry Djeanna
    Offline

    Sherry Djeanna Опытный в 1С

    Регистрация:
    12 июл 2015
    Сообщения:
    70
    Симпатии:
    0
    Баллы:
    26
    Понимаете, ситуация получилась такая. Вели продажу с одной базы. потом образовали 2-ю. Параллельно вводили товар и в одну и в другую, но некоторый товар перебрасывали вместе со ШК с помощью универсальной обработки. Потом решили, что 1ю базу закрывают и весь товар перебрасывают на 2ю. А тут программист увольняется, а я поступаю на работу )) И вот как эти базы синхронизировать - просто голова кругом )) Т.к. во 2й базе разрешено вводить коды номенклатуры самим работникам! Т.к. коды там пляшут от 000000000005 до 999910000238...

    Сейчас попробую с удалением записи.
  9. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Пример для одного товара на УТ 10.3
    Код:
    Процедура КнопкаВыполнитьНажатие(Кнопка)
       
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
                       |    Штрихкоды.Владелец,
                       |    Штрихкоды.Штрихкод,
                       |    Штрихкоды.ТипШтрихкода,
                       |    Штрихкоды.ЕдиницаИзмерения,
                       |    Штрихкоды.ХарактеристикаНоменклатуры,
                       |    Штрихкоды.СерияНоменклатуры,
                       |    Штрихкоды.Качество,
                       |    Штрихкоды.УдалитьКод,
                       |    Штрихкоды.УдалитьТипШтрихкода,
                       |    Штрихкоды.УдалитьШтрихкод,
                       |    Штрихкоды.УдалитьВладелец,
                       |    Штрихкоды.УдалитьЕдиницаИзмерения,
                       |    Штрихкоды.УдалитьХарактеристикаНоменклатуры,
                       |    Штрихкоды.УдалитьСерияНоменклатуры,
                       |    Штрихкоды.УдалитьКачество,
                       |    Штрихкоды.ПредставлениеШтрихкода
                       |ИЗ
                       |    РегистрСведений.Штрихкоды КАК Штрихкоды
                       |ГДЕ
                       |    Штрихкоды.Штрихкод = &Штрихкод
                       |
                       |СГРУППИРОВАТЬ ПО
                       |    Штрихкоды.Владелец,
                       |    Штрихкоды.Штрихкод,
                       |    Штрихкоды.ТипШтрихкода,
                       |    Штрихкоды.ЕдиницаИзмерения,
                       |    Штрихкоды.ХарактеристикаНоменклатуры,
                       |    Штрихкоды.СерияНоменклатуры,
                       |    Штрихкоды.Качество,
                       |    Штрихкоды.УдалитьКод,
                       |    Штрихкоды.УдалитьТипШтрихкода,
                       |    Штрихкоды.УдалитьШтрихкод,
                       |    Штрихкоды.УдалитьВладелец,
                       |    Штрихкоды.УдалитьЕдиницаИзмерения,
                       |    Штрихкоды.УдалитьХарактеристикаНоменклатуры,
                       |    Штрихкоды.УдалитьСерияНоменклатуры,
                       |    Штрихкоды.УдалитьКачество,
                       |    Штрихкоды.ПредставлениеШтрихкода";
        Запрос.УстановитьПараметр("Штрихкод", ШК);
       
        Выборка = Запрос.Выполнить().Выбрать();
        Пока Выборка.Следующий() Цикл
            Набор = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
            Набор.Отбор.Владелец.Установить(Выборка.Владелец);
            Набор.Прочитать();
            Итератор = Набор.Количество();
            Пока Итератор > 0 Цикл
                Если СокрП(Набор[Итератор-1].Штрихкод) = СокрП(ШК) Тогда
                    Набор.Удалить(Итератор-1);
                КонецЕсли;
                Итератор = Итератор - 1;
            КонецЦикла;
            Набор.Записать();
        КонецЦикла;
        НовыйТовар = Справочники.Номенклатура.ПустаяСсылка();
        ~Переход: ВвестиЗначение(НовыйТовар, "Укажите товар на который пишем ШК");
        Если НовыйТовар.Пустая() Тогда
            Сообщить("Не выбран товар");
            Перейти ~Переход;
        КонецЕсли;
       
        Набор = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
        Набор.Отбор.Владелец.Установить(НовыйТовар);
        Набор.Прочитать();
        Запись = Набор.Добавить();
        // у меня нет новых параметров пишу из запроса
        ЗаполнитьЗначенияСвойств(Запись, Выборка);
        Запись.Владелец = НовыйТовар;
        Набор.Записать();
       
    КонецПроцедуры
    

    Вложения:

    Sherry Djeanna нравится это.
  10. TopicStarter Overlay
    Sherry Djeanna
    Offline

    Sherry Djeanna Опытный в 1С

    Регистрация:
    12 июл 2015
    Сообщения:
    70
    Симпатии:
    0
    Баллы:
    26
    Не выходит каменный цветок (((( Выдает "
    Штрихкод: 2000001029244 уже имеет владельца "РЕМЕНЬ"." Хоть с Записью Набора, хоть без оного...

    Если НЕ СтрТекШК.Владелец = Владелец Тогда

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

    Исключение
    Сообщить("Владелец не изменен");

    Сообщить(ОписаниеОшибки());
    КонецПопытки;

    Прервать;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
  11. TopicStarter Overlay
    Sherry Djeanna
    Offline

    Sherry Djeanna Опытный в 1С

    Регистрация:
    12 июл 2015
    Сообщения:
    70
    Симпатии:
    0
    Баллы:
    26
    Я поняла, почему у меня нельзя было поменять Владельца. Потому что я делала отбор по владельцу!))) Когда поменяла отбор по ШК, удалять получилось. Но... Каким-то макаром, в базе оказались задвоенные ШК, т.е. две записи с одним ШК у разных владельцев.
    Большое спасибо за помощь!!! Все получилось! Я даже не знала, как этот Итератор использовать, только гадала ))
    Вот что получилось :

    Если НЕ СтрТекШК.Владелец = Владелец Тогда

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

    Итератор = Набор.Количество();
    Пока Итератор > 0 Цикл
    Набор.Удалить(Итератор-1);
    Итератор = Итератор - 1;
    КонецЦикла;
    Попытка
    Набор.Записать();
    Сообщить ("Удален ШК "+ СтрокаШК.Штрихкод+" у владельца "+ СтрТекШК.Владелец.Код);
    нашли=0;
    Исключение
    Сообщить("Владелец не изменен");
    Сообщить(ОписаниеОшибки());
    КонецПопытки;
    --- Объединение сообщений, 13 июл 2015 ---
    Вот только с Записать (ложь) я не поняла - правильно ли делаю, что пишу просто Набор.Записать() ? Или нужно Записать(ложь)?
  12. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    В синтаксис-помощнике описано. Записать() это тоже самое что Записать(Истина), параметр указывающий что надо заместить старые записи, если параметр Ложь, то данные до изменения не будут стерты а будут добавлены новые.
  13. TopicStarter Overlay
    Sherry Djeanna
    Offline

    Sherry Djeanna Опытный в 1С

    Регистрация:
    12 июл 2015
    Сообщения:
    70
    Симпатии:
    0
    Баллы:
    26
    Приветик. Да, я прочитала )) Просто вдруг там скрытый от меня смысл )) : если НЗ(МЗ) по отбору 2 записи, а меняю только 1 и поставлю Записать() - то останется две записи?
  14. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Да, если поставите Ложь то будет 4 записи или ошибка регистра если регистр исключает пересечение измерений
  15. TopicStarter Overlay
    Sherry Djeanna
    Offline

    Sherry Djeanna Опытный в 1С

    Регистрация:
    12 июл 2015
    Сообщения:
    70
    Симпатии:
    0
    Баллы:
    26
    О, как! Спасибо! Теперь понятна эта функция ))

    Еще раз спасибо за помощь!!!

Поделиться этой страницей