Как сменить родителя у товара

1. sidalexsandr 3 13.04.18 11:45 Сейчас в теме
Пытаюсь сменить родителя у уже существующего товара:
ТекТов = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Наименование, Истина);            ТекТов.Родитель = ТекРод;


Выдает ошибку: {ВнешняяОбработка.ГруппыПоОбразцу.Форма.Форма.Форма(122)}: Поле объекта недоступно для записи (Родитель)
ТекТов.Родитель = ТекРод;

Вопрос: что сделать чтобы у элемента справочника была возможность перезаписать родителя?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. catena 110 13.04.18 11:49 Сейчас в теме
Объ = ТекТов.ПолучитьОбъект();
Объ.Родитель = ТекРод; 
Объ.Записать();
3. sidalexsandr 3 13.04.18 12:08 Сейчас в теме
Выдает ошибку:
{ВнешняяОбработка.ГруппыПоОбразцу.Форма.Форма.Форма(121)}: Ошибка при вызове метода контекста (ПолучитьОбъект)
ТекТоварчик = ТекТов.ПолучитьОбъект();
по причине:
Элемент не выбран!
5. catena 110 13.04.18 12:12 Сейчас в теме
(3)Значит не нашел по наименованию. Вроде адинэс все ошибки по-русски пишет.
4. spezc 795 13.04.18 12:11 Сейчас в теме
ТекТов = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Наименование, Истина);
Если Не ТекТов = Справочники.Номенклатура.ПустаяСсылка() Тогда
   Объ = ТекТов.ПолучитьОбъект(); 
   Объ.Родитель = ТекРод; 
   Объ.Записать();
Иначе
   Сообщить("уй. нет товара с названием: "+Выборка.Наименование); 
КонецЕсли;
6. spezc 795 13.04.18 12:12 Сейчас в теме
да, тяжело с 7ки переходить...
7. sidalexsandr 3 13.04.18 12:15 Сейчас в теме
Теперь выдает ошибку:
{ВнешняяОбработка.ГруппыПоОбразцу.Форма.Форма.Форма(123)}: Ошибка при вызове метода контекста (Записать)
ТекТоварчик.Записать();
по причине:
Зацикливание уровней!
8. user623969_dusa 13.04.18 12:21 Сейчас в теме
(7)
Зацикливание уровней
еще надо проверять на группу и на присвоение родителя самому себе
9. spezc 795 13.04.18 12:48 Сейчас в теме
покажите наконец весь код
11. sidalexsandr 3 13.04.18 14:10 Сейчас в теме
(9)
Выборка = Справочники.БП_ПрейскурантНаРаботы.Выбрать();
    Пока Выборка.Следующий() Цикл
        
        
        // пропустить товар, который вне групп
        Если Выборка.Наименование = "Компенсация командировочных затрат инженера выездного ремонта" Тогда
            Продолжить;
        КонецЕсли;
        
        Если Выборка.Ссылка.ЭтоГруппа = Истина Тогда
            
            // группы уже созданы пропустить группы
            Продолжить;
        КонецЕсли;
        
                                        
        
        // Проверить, что родитель ЭтоГруппа, если найденный родитель 
        // это не группа, тогда запустить заново поиск родителя
        Пока Истина Цикл 
            ТекРод = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Родитель, Истина);
            Если ТекРод.ЭтоГруппа = Истина Тогда
                Прервать;        
            КонецЕсли;    
            Сообщить("Бесконечный цикл №1");
        КонецЦикла;            
            
        Сообщить("Выборка.Наименование = " + Выборка.Наименование);     
        Сообщить("ТекРод = " + ТекРод);
        
        // Проверить если Выборка.Работа в справочнике номенклатура нашлась
        // как группа, то искать дальше
        Пока Истина Цикл 
            ТекТов = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Работа, Истина);
            Если ТекТов.ЭтоГруппа = Ложь Тогда                
                Прервать;        
            КонецЕсли;    
            Сообщить("Бесконечный цикл №2 = " + Выборка.Работа);
        КонецЦикла;            
        
        
        
        ТекТоварчик = ТекТов.ПолучитьОбъект();
        ТекТоварчик.Родитель = ТекРод;
        ТекТоварчик.Записать();                       
                
            
    КонецЦикла;

Показать


Теперь получается Бесконечный цикл №2
13. vovan_victory 65 13.04.18 14:23 Сейчас в теме
(11)

// Проверить, что родитель ЭтоГруппа, если найденный родитель 
// это не группа, тогда запустить заново поиск родителя 
Пока Истина Цикл 
ТекРод = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Родитель, Истина); 
Если ТекРод.ЭтоГруппа = Истина 


Не понятно - это зачем?
1) Выборка.Родитель - есть ощущение, что это ссылочный тип , а не строка
2) Наверно так
Если Выборка.Родитель.ЭтоГруппа Тогда
КонецЕсли

3) Не понятно зачем там цикл?
4) Да и оптимальнее данные получить запросом, а не через немеренно количество если.. тогда.. иначе
Запрос = Новый Запрос("Выбрать _.Ссылка Из Справочники.Номенклатура КАК _
|Где
|НЕ _.ЭтоГруппа");
14. sidalexsandr 3 13.04.18 14:32 Сейчас в теме
(13) В этом цикле все впорядке. Вопрос про цикл Бесконечный цикл №2
10. spezc 795 13.04.18 12:48 Сейчас в теме
не удивлюсь если в Выборка сидит Справочники.Номенклатура.Выбрать...
12. sidalexsandr 3 13.04.18 14:16 Сейчас в теме
Не понятно почему Бесконечный цикл №2. Цикл зацикливается на товаре который есть и как группа и как товар. Следовательно должно сработать прерывание цикла по условию ТекТов.ЭтоГруппа = Ложь.

Вопрос: почему не срабатывает условие ТекТов.ЭтоГруппа = Ложь?
15. vovan_victory 65 13.04.18 14:39 Сейчас в теме
(12)Еще раз
Выборка.Работа

Какой тип данных?

Из СП
СправочникМенеджер.<Имя справочника> (CatalogManager.<Имя справочника>)
НайтиПоНаименованию (FindByDescription)
Синтаксис:

НайтиПоНаименованию(<Наименование>, <ТочноеСоответствие>, <Родитель>, <Владелец>)
Параметры:

<Наименование> (обязательный)

Тип: Строка.
Строка, содержащая искомое наименование.
<ТочноеСоответствие> (необязательный)

Тип: Булево.
Показать


Если уже дело на то пошло, то быстрее всего вместо
ТекТов = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Работа, Истина)


Надо
ТекТов = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Работа.Наименование, Истина)
16. kasper076 112 13.04.18 14:41 Сейчас в теме
(12) А номенклатура с наименованием Выборка.РАБОТА непременно должна быть группой?
17. sidalexsandr 3 13.04.18 14:43 Сейчас в теме
(16) Нет. Она есть так же как элемент.
18. sidalexsandr 3 13.04.18 14:45 Сейчас в теме
Переформулирую вопрос: как запустить поиск элемента справочника повторный. Надо чтобы если поиск нашел группу, то продолжать искать дальше пока не найдет элемент.
19. kasper076 112 13.04.18 14:47 Сейчас в теме
20. vovan_victory 65 13.04.18 14:48 Сейчас в теме
(18)А чем Вам выборка данных запросом не понравилась?(13) В результате запроса будут только элементы .. без групп
21. user623969_dusa 13.04.18 14:58 Сейчас в теме
(18) посмотрите как использовать ПринадлежитЭлементу ВыборкаДет.Номенклатура.ПринадлежитЭлементу(ПапкаНоменклатурыЦБ004096)
и почитать в СП про найти по наименованию тоже не лишне

<Родитель> (необязательный)
Тип: СправочникСсылка.<Имя справочника>.
Родитель, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
25. sidalexsandr 3 13.04.18 17:33 Сейчас в теме
22. imispb 5 13.04.18 16:02 Сейчас в теме
(18) Такая задача решается одним запросом, получаются все необходимые данные, потом только меняем родителя. Код "Пока Истина Цикл" нужно вообще исключить из своего лексикона. Если очень хочется поизвращаться, используй метод Выбрать(), как в первой строке твоего кода. У этого метода есть параметр "Отбор". Укажи там Наименование и ЭтаГруппа, получишь выборку всех групп с нужным наименованием, потом можно взять первый по порядку элемент и указать его в качестве родителя. Так же можно получить все элементы с указанным наименованием, если в отборе указать ЭтаГруппа в Ложь. Код "Если ТекРод.ЭтоГруппа = Истина Тогда" можно писать "Если ТекРод.ЭтоГруппа Тогда", и "Если НЕ ТекРод.ЭтоГруппа Тогда".
Вот если твоими словами, то как то так:
            Выборка = Справочники.БП_ПрейскурантНаРаботы.Выбрать();
    Пока Выборка.Следующий() Цикл
        
        // пропустить товар, который вне групп
        Если Выборка.Наименование = "Компенсация командировочных затрат инженера выездного ремонта" Тогда
            Продолжить;
        КонецЕсли;
        
        Если Выборка.ЭтоГруппа Тогда
            // группы уже созданы пропустить группы
            Продолжить;
        КонецЕсли;
        
        // Выбираем все группы с нужным наименованием
        Отбор = Новый Структура;
        Отбор.Вставить("Наименование",  СокрЛП(Выборка.Родитель.Наименование));
        Отбор.Вставить("ЭтаГруппа",  Истина);
        ВыборкаРодителя = Справочники.Номенклатура.Выбрать(,,Отбор);
        ТекРод = ВыборкаРодителя.Следующий();
        
        Если НЕ ТекРод = Неопределено Тогда // если хотя бы одна группа найдена тогда продолжаем
            Отбор = Новый Структура;
            Отбор.Вставить("Наименование",  СокрЛП(Выборка.Работа.Наименование));
            Отбор.Вставить("ЭтаГруппа",  Ложь);
            ВыборкаТовара = Справочники.Номенклатура.Выбрать(,,Отбор);
            Пока ВыборкаТовара.Следующий() Цикл // все найденные элементы помещаем в нужную группу
                
                ТекТоварчик = ВыборкаТовара.ПолучитьОбъект();
                ТекТоварчик.Родитель = ТекРод;
                ТекТоварчик.Записать();                       
                
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;



Показать
23. imispb 5 13.04.18 16:42 Сейчас в теме
(22) Ошибочку поправил:
     ........
   ВыборкаРодителя = Справочники.Номенклатура.Выбрать(,,Отбор);
        
        Если ВыборкаРодителя.Следующий() Тогда // если хотя бы одна группа найдена тогда продолжаем
            
            ТекРод = ВыборкаРодителя;
            
            Отбор = Новый Структура;
            Отбор.Вставить("Наименование",  СокрЛП(Выборка.Работа.Наименование));
........

Показать
24. imispb 5 13.04.18 16:52 Сейчас в теме
Вспомнил, что в структуре отбора, можно только один элемент указывать, значит вот так вот получается:
    Выборка = Справочники.БП_ПрейскурантНаРаботы.Выбрать();
    Пока Выборка.Следующий() Цикл
        
        // пропустить товар, который вне групп
        Если Выборка.Наименование = "Компенсация командировочных затрат инженера выездного ремонта" Тогда
            Продолжить;
        КонецЕсли;
        
        Если Выборка.ЭтоГруппа Тогда
            // группы уже созданы пропустить группы
            Продолжить;
        КонецЕсли;
        
        // Выбираем все группы с нужным наименованием
        Отбор = Новый Структура;
        Отбор.Вставить("Наименование",  СокрЛП(Выборка.Родитель.Наименование));
        ВыборкаРодителя = Справочники.Номенклатура.Выбрать(,,Отбор);
        
        Если ВыборкаРодителя.Следующий() Тогда // если хотя бы одна группа найдена тогда продолжаем
            
            Если НЕ ВыборкаРодителя.ЭтоГруппа Тогда
                Продолжить;
            КонецЕсли;
            
            ТекРод = ВыборкаРодителя;
            
            Отбор = Новый Структура;
            Отбор.Вставить("Наименование",  СокрЛП(Выборка.Работа.Наименование));
            ВыборкаТовара = Справочники.Номенклатура.Выбрать(,,Отбор);
            Пока ВыборкаТовара.Следующий() Цикл // все найденные элементы помещаем в нужную группу
                
                Если ВыборкаТовара.ЭтоГруппа Тогда
                    Продолжить;
                КонецЕсли;
                
                ТекТоварчик = ВыборкаТовара.ПолучитьОбъект();
                ТекТоварчик.Родитель = ТекРод;
                ТекТоварчик.Записать();                       
                
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;

Показать
26. sidalexsandr 3 13.04.18 17:35 Сейчас в теме
В поиске необходимость отпала, так как переименовали группу.
Теперь написано:
ТекРод = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Родитель, Истина);

Сообщить("Выборка.Наименование = " + Выборка.Наименование);
Сообщить("ТекРод = " + ТекРод);
// Найти по Артикул
ТекТов = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Выборка.Работа.Артикул);
ТекТоварчик = ТекТов.ПолучитьОбъект();
ТекТоварчик.Родитель = ТекРод.Ссылка;
ТекТоварчик.Записать();

Вопрос: почему не меняется родитель?
27. imispb 5 13.04.18 17:43 Сейчас в теме
(26) Какую ошибку выдаёт? ТекРод находит перед ошибкой? ТекТов по Артикулу находит перед ошибкой? ТекРод является группой? ТекТов является элементом? Отладкой посмотри и всё увидишь. Нужно всегда проверять найденное, для последующей работы с ним. Код, который выше написал, попробуй.
28. imispb 5 13.04.18 17:49 Сейчас в теме
(26)
ТекРод = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Родитель.Наименование, Истина);

Если (НЕ ТекРод = Справочники.Номенклатура.ПустаяСсылка()) И (ТекРод.ЭтоГруппа()) Тогда
    Сообщить("Выборка.Наименование = " + Выборка.Наименование);
    Сообщить("ТекРод = " + ТекРод);
    // Найти по Артикул
    ТекТов = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Выборка.Работа.Артикул);
    Если (НЕ ТекТов = Справочники.Номенклатура.ПустаяСсылка()) И (НЕ ТекТов.ЭтоГруппа()) Тогда
        ТекТоварчик = ТекТов.ПолучитьОбъект();
        ТекТоварчик.Родитель = ТекРод;
        ТекТоварчик.Записать();
    Иначе
        Сообщить("Не найден товар по артикулу - "+Выборка.Работа.Артикул);
    КонецЕсли;
Иначе
    Сообщить("Не найдена группа по наименованию - "+Выборка.Родитель);
КонецЕсли;
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот