Пытаюсь сменить родителя у уже существующего товара:
Выдает ошибку: {ВнешняяОбработка.ГруппыПоОбразцу.Форма.Форма.Форма(122)}: Поле объекта недоступно для записи (Родитель)
ТекТов.Родитель = ТекРод;
Вопрос: что сделать чтобы у элемента справочника была возможность перезаписать родителя?
ТекТов = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Наименование, Истина); ТекТов.Родитель = ТекРод;
Выдает ошибку: {ВнешняяОбработка.ГруппыПоОбразцу.Форма.Форма.Форма(122)}: Поле объекта недоступно для записи (Родитель)
ТекТов.Родитель = ТекРод;
Вопрос: что сделать чтобы у элемента справочника была возможность перезаписать родителя?
По теме из базы знаний
- Всякие полезности
- Товарный чек с логотипом организации (поддержка старых релизов начиная с УТ 11.1.2, где нет такой возможности) для документа Реализация товаров и услуг (РТУ) без использования ККТ. Редакции с 11.1.2 по 11.2
- Перенос данных из ERP 2 / КА 2 / УТ 11 в БП 3.0. Переносятся документы, начальные остатки и справочники
- Обработка загрузки из Excel через буфер обмена
- Повышение качества разработки. Статья 4. Почему код становится плохим, и как с этим бороться
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
ТекТов = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Наименование, Истина);
Если Не ТекТов = Справочники.Номенклатура.ПустаяСсылка() Тогда
Объ = ТекТов.ПолучитьОбъект();
Объ.Родитель = ТекРод;
Объ.Записать();
Иначе
Сообщить("уй. нет товара с названием: "+Выборка.Наименование);
КонецЕсли;
(9)
Теперь получается Бесконечный цикл №2
Выборка = Справочники.БП_ПрейскурантНаРаботы.Выбрать();
Пока Выборка.Следующий() Цикл
// пропустить товар, который вне групп
Если Выборка.Наименование = "Компенсация командировочных затрат инженера выездного ремонта" Тогда
Продолжить;
КонецЕсли;
Если Выборка.Ссылка.ЭтоГруппа = Истина Тогда
// группы уже созданы пропустить группы
Продолжить;
КонецЕсли;
// Проверить, что родитель ЭтоГруппа, если найденный родитель
// это не группа, тогда запустить заново поиск родителя
Пока Истина Цикл
ТекРод = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Родитель, Истина);
Если ТекРод.ЭтоГруппа = Истина Тогда
Прервать;
КонецЕсли;
Сообщить("Бесконечный цикл №1");
КонецЦикла;
Сообщить("Выборка.Наименование = " + Выборка.Наименование);
Сообщить("ТекРод = " + ТекРод);
// Проверить если Выборка.Работа в справочнике номенклатура нашлась
// как группа, то искать дальше
Пока Истина Цикл
ТекТов = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Работа, Истина);
Если ТекТов.ЭтоГруппа = Ложь Тогда
Прервать;
КонецЕсли;
Сообщить("Бесконечный цикл №2 = " + Выборка.Работа);
КонецЦикла;
ТекТоварчик = ТекТов.ПолучитьОбъект();
ТекТоварчик.Родитель = ТекРод;
ТекТоварчик.Записать();
КонецЦикла;
ПоказатьТеперь получается Бесконечный цикл №2
(11)
Не понятно - это зачем?
1) Выборка.Родитель - есть ощущение, что это ссылочный тип , а не строка
2) Наверно так
3) Не понятно зачем там цикл?
4) Да и оптимальнее данные получить запросом, а не через немеренно количество если.. тогда.. иначе
// Проверить, что родитель ЭтоГруппа, если найденный родитель
// это не группа, тогда запустить заново поиск родителя
Пока Истина Цикл
ТекРод = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Родитель, Истина);
Если ТекРод.ЭтоГруппа = Истина
Не понятно - это зачем?
1) Выборка.Родитель - есть ощущение, что это ссылочный тип , а не строка
2) Наверно так
Если Выборка.Родитель.ЭтоГруппа Тогда
КонецЕсли
3) Не понятно зачем там цикл?
4) Да и оптимальнее данные получить запросом, а не через немеренно количество если.. тогда.. иначе
Запрос = Новый Запрос("Выбрать _.Ссылка Из Справочники.Номенклатура КАК _
|Где
|НЕ _.ЭтоГруппа");
(12)Еще раз
Какой тип данных?
Из СП
Если уже дело на то пошло, то быстрее всего вместо
Надо
Выборка.Работа
Какой тип данных?
Из СП
СправочникМенеджер.<Имя справочника> (CatalogManager.<Имя справочника>)
НайтиПоНаименованию (FindByDescription)
Синтаксис:
НайтиПоНаименованию(<Наименование>, <ТочноеСоответствие>, <Родитель>, <Владелец>)
Параметры:
<Наименование> (обязательный)
Тип: Строка.
Строка, содержащая искомое наименование.
<ТочноеСоответствие> (необязательный)
Тип: Булево.
ПоказатьНайтиПоНаименованию (FindByDescription)
Синтаксис:
НайтиПоНаименованию(<Наименование>, <ТочноеСоответствие>, <Родитель>, <Владелец>)
Параметры:
<Наименование> (обязательный)
Тип: Строка.
Строка, содержащая искомое наименование.
<ТочноеСоответствие> (необязательный)
Тип: Булево.
Если уже дело на то пошло, то быстрее всего вместо
ТекТов = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Работа, Истина)
Надо
ТекТов = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Работа.Наименование, Истина)
(18) посмотрите как использовать ПринадлежитЭлементу ВыборкаДет.Номенклатура.ПринадлежитЭлементу(ПапкаНоменклатурыЦБ004096)
и почитать в СП про найти по наименованию тоже не лишне
<Родитель> (необязательный)
Тип: СправочникСсылка.<Имя справочника>.
Родитель, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
и почитать в СП про найти по наименованию тоже не лишне
<Родитель> (необязательный)
Тип: СправочникСсылка.<Имя справочника>.
Родитель, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
(18) Такая задача решается одним запросом, получаются все необходимые данные, потом только меняем родителя. Код "Пока Истина Цикл" нужно вообще исключить из своего лексикона. Если очень хочется поизвращаться, используй метод Выбрать(), как в первой строке твоего кода. У этого метода есть параметр "Отбор". Укажи там Наименование и ЭтаГруппа, получишь выборку всех групп с нужным наименованием, потом можно взять первый по порядку элемент и указать его в качестве родителя. Так же можно получить все элементы с указанным наименованием, если в отборе указать ЭтаГруппа в Ложь. Код "Если ТекРод.ЭтоГруппа = Истина Тогда" можно писать "Если ТекРод.ЭтоГруппа Тогда", и "Если НЕ ТекРод.ЭтоГруппа Тогда".
Вот если твоими словами, то как то так:
Вот если твоими словами, то как то так:
Выборка = Справочники.БП_ПрейскурантНаРаботы.Выбрать();
Пока Выборка.Следующий() Цикл
// пропустить товар, который вне групп
Если Выборка.Наименование = "Компенсация командировочных затрат инженера выездного ремонта" Тогда
Продолжить;
КонецЕсли;
Если Выборка.ЭтоГруппа Тогда
// группы уже созданы пропустить группы
Продолжить;
КонецЕсли;
// Выбираем все группы с нужным наименованием
Отбор = Новый Структура;
Отбор.Вставить("Наименование", СокрЛП(Выборка.Родитель.Наименование));
Отбор.Вставить("ЭтаГруппа", Истина);
ВыборкаРодителя = Справочники.Номенклатура.Выбрать(,,Отбор);
ТекРод = ВыборкаРодителя.Следующий();
Если НЕ ТекРод = Неопределено Тогда // если хотя бы одна группа найдена тогда продолжаем
Отбор = Новый Структура;
Отбор.Вставить("Наименование", СокрЛП(Выборка.Работа.Наименование));
Отбор.Вставить("ЭтаГруппа", Ложь);
ВыборкаТовара = Справочники.Номенклатура.Выбрать(,,Отбор);
Пока ВыборкаТовара.Следующий() Цикл // все найденные элементы помещаем в нужную группу
ТекТоварчик = ВыборкаТовара.ПолучитьОбъект();
ТекТоварчик.Родитель = ТекРод;
ТекТоварчик.Записать();
КонецЦикла;
КонецЕсли;
КонецЦикла;
Показать
(22) Ошибочку поправил:
........
ВыборкаРодителя = Справочники.Номенклатура.Выбрать(,,Отбор);
Если ВыборкаРодителя.Следующий() Тогда // если хотя бы одна группа найдена тогда продолжаем
ТекРод = ВыборкаРодителя;
Отбор = Новый Структура;
Отбор.Вставить("Наименование", СокрЛП(Выборка.Работа.Наименование));
........
Показать
Вспомнил, что в структуре отбора, можно только один элемент указывать, значит вот так вот получается:
Выборка = Справочники.БП_ПрейскурантНаРаботы.Выбрать();
Пока Выборка.Следующий() Цикл
// пропустить товар, который вне групп
Если Выборка.Наименование = "Компенсация командировочных затрат инженера выездного ремонта" Тогда
Продолжить;
КонецЕсли;
Если Выборка.ЭтоГруппа Тогда
// группы уже созданы пропустить группы
Продолжить;
КонецЕсли;
// Выбираем все группы с нужным наименованием
Отбор = Новый Структура;
Отбор.Вставить("Наименование", СокрЛП(Выборка.Родитель.Наименование));
ВыборкаРодителя = Справочники.Номенклатура.Выбрать(,,Отбор);
Если ВыборкаРодителя.Следующий() Тогда // если хотя бы одна группа найдена тогда продолжаем
Если НЕ ВыборкаРодителя.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
ТекРод = ВыборкаРодителя;
Отбор = Новый Структура;
Отбор.Вставить("Наименование", СокрЛП(Выборка.Работа.Наименование));
ВыборкаТовара = Справочники.Номенклатура.Выбрать(,,Отбор);
Пока ВыборкаТовара.Следующий() Цикл // все найденные элементы помещаем в нужную группу
Если ВыборкаТовара.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
ТекТоварчик = ВыборкаТовара.ПолучитьОбъект();
ТекТоварчик.Родитель = ТекРод;
ТекТоварчик.Записать();
КонецЦикла;
КонецЕсли;
КонецЦикла;
Показать
В поиске необходимость отпала, так как переименовали группу.
Теперь написано:
ТекРод = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Родитель, Истина);
Сообщить("Выборка.Наименование = " + Выборка.Наименование);
Сообщить("ТекРод = " + ТекРод);
// Найти по Артикул
ТекТов = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Выборка.Работа.Артикул);
ТекТоварчик = ТекТов.ПолучитьОбъект();
ТекТоварчик.Родитель = ТекРод.Ссылка;
ТекТоварчик.Записать();
Вопрос: почему не меняется родитель?
Теперь написано:
ТекРод = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Родитель, Истина);
Сообщить("Выборка.Наименование = " + Выборка.Наименование);
Сообщить("ТекРод = " + ТекРод);
// Найти по Артикул
ТекТов = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Выборка.Работа.Артикул);
ТекТоварчик = ТекТов.ПолучитьОбъект();
ТекТоварчик.Родитель = ТекРод.Ссылка;
ТекТоварчик.Записать();
Вопрос: почему не меняется родитель?
(26) Какую ошибку выдаёт? ТекРод находит перед ошибкой? ТекТов по Артикулу находит перед ошибкой? ТекРод является группой? ТекТов является элементом? Отладкой посмотри и всё увидишь. Нужно всегда проверять найденное, для последующей работы с ним. Код, который выше написал, попробуй.
(26)
ТекРод = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Родитель.Наименование, Истина);
Если (НЕ ТекРод = Справочники.Номенклатура.ПустаяСсылка()) И (ТекРод.ЭтоГруппа()) Тогда
Сообщить("Выборка.Наименование = " + Выборка.Наименование);
Сообщить("ТекРод = " + ТекРод);
// Найти по Артикул
ТекТов = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Выборка.Работа.Артикул);
Если (НЕ ТекТов = Справочники.Номенклатура.ПустаяСсылка()) И (НЕ ТекТов.ЭтоГруппа()) Тогда
ТекТоварчик = ТекТов.ПолучитьОбъект();
ТекТоварчик.Родитель = ТекРод;
ТекТоварчик.Записать();
Иначе
Сообщить("Не найден товар по артикулу - "+Выборка.Работа.Артикул);
КонецЕсли;
Иначе
Сообщить("Не найдена группа по наименованию - "+Выборка.Родитель);
КонецЕсли;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот