Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
09 апр 2025, 16:45

Программное изменение родителя элемента справочника

Автор Golickoff, 24 мар 2015, 16:28

0 Пользователей и 2 гостей просматривают эту тему.

cska-fanat-kz

ключ для режима предприятие
а смотреть надо будет в конфигураторе
так что подойдет и без ключа
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Golickoff

Гружу на файлообменник по удалёнке с компа с медленным соединением. Это займёт какое-то время.
Добавлено: 26 мар 2015, 02:46


Готово. Вот ссылка на архив с конфигурацией и обработкой. Конфигурация коммерческая, поэтому выгрузить в файл не мог. Весит 122 Мб.
Добавлено: 26 мар 2015, 03:27


Проклятье, я вспомнил только сейчас. В порыве гнева я добавил в код переменные с нецензурными именами. Прошу прощения за данный казус.
Добавлено: 26 мар 2015, 03:50


Просто замените не глядя весь код внешней обработки на этот:
Процедура КнопкаВыполнитьНажатие(Кнопка) Если ЭтаФорма.ЭлементыФормы.МераИзмерения.Значение = Справочники.МерыИзмерения.НайтиПоНаименованию("Штуки") Тогда Номенклатура = ЭтаФорма.Номенклатура; Объект = Номенклатура.ПолучитьОбъект(); Объект.МераИзмерения = Справочники.МерыИзмерения.НайтиПоНаименованию("Штуки"); ЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("796"); Иначе Номенклатура = ЭтаФорма.Номенклатура; Объект = Номенклатура.ПолучитьОбъект(); Объект.МераИзмерения = Справочники.МерыИзмерения.НайтиПоНаименованию("Вес"); ЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("166"); КонецЕсли; ЗаписьВладельца = Объект.БазоваяЕдиницаИзмерения.ПолучитьОбъект(); ОбъектИзмерения = ЕдиницаИзмерения.ПолучитьОбъект(); БазоваяЕдиница = Объект.БазоваяЕдиницаИзмерения.ПолучитьОбъект(); Объект.БазоваяЕдиницаИзмерения = БазоваяЕдиница; Объект.БазоваяЕдиницаИзмерения = Объект.МераИзмерения.БазоваяЕдиницаИзмерения; ЗаписьВладельца.Владелец = Номенклатура; БазоваяЕдиница = ОбъектИзмерения; Объект.Записать(); КонецПроцедуры
Добавлено: 26 мар 2015, 05:11


Сейчас код обработки выглядит следующим образом:
Процедура КнопкаВыполнитьНажатие(Кнопка) Номенклатура = ЭтаФорма.Номенклатура; Объект = Номенклатура.ПолучитьОбъект(); Владелец = Объект.БазоваяЕдиницаИзмерения.Владелец; Если ЭтаФорма.ЭлементыФормы.МераИзмерения.Значение = Справочники.МерыИзмерения.НайтиПоНаименованию("Штуки") Тогда Объект.МераИзмерения = Справочники.МерыИзмерения.НайтиПоНаименованию("Штуки"); ЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("796"); Иначе Объект.МераИзмерения = Справочники.МерыИзмерения.НайтиПоНаименованию("Вес"); ЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("166"); КонецЕсли; ЗаписьВладельца = Объект.БазоваяЕдиницаИзмерения.ПолучитьОбъект(); ОбъектИзмерения = ЕдиницаИзмерения.ПолучитьОбъект(); БазоваяЕдиница = Объект.БазоваяЕдиницаИзмерения.ПолучитьОбъект(); Объект.БазоваяЕдиницаИзмерения = БазоваяЕдиница; Объект.БазоваяЕдиницаИзмерения = Объект.МераИзмерения.БазоваяЕдиницаИзмерения; БазоваяЕдиница = ОбъектИзмерения; ЗаписьВладельца.Владелец = Владелец; Объект.Записать(); КонецПроцедуры
А вот выдержка из табло. Точка остановы стоит на последней строке кода.
ВыражениеЗначениеТип
ВладелецБананСправочникСсылка.Номенклатура
Объект.БазоваяЕдиницаИзмерения.ВладелецШтукиСправочникСсылка.МерыИзмерения
ЗаписьВладельца.ВладелецБананСправочникСсылка.Номенклатура
Как же так получилось?
Добавлено: 26 мар 2015, 07:25


Поменял последнюю часть кода на
БазоваяЕдиницаСсылка = Объект.БазоваяЕдиницаИзмерения; БазоваяЕдиницаОбъект = БазоваяЕдиницаСсылка.ПолучитьОбъект(); Объект.БазоваяЕдиницаИзмерения = Объект.МераИзмерения.БазоваяЕдиницаИзмерения; БазоваяЕдиницаОбъект.Владелец = Владелец; БазоваяЕдиницаОбъект.Записать(); Объект.Записать();
но владелец не меняется.
Добавлено: 26 мар 2015, 07:44


Табло говорит, что владелец меняется. Только не там
ЦитироватьОбъект.БазоваяЕдиницаИзмерения.Владелец = Штуки (СправочникСсылка.МерыИзмерения)
ЦитироватьБазоваяЕдиницаОбъект.Владелец = Банан (СправочникСсылка.Номенклатура)
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

cska-fanat-kz

Приложена ваша схема единиц измерения.
Что по ней видно применительно к коду обработки:
1. Нельзя присваивать "Номенклатура2.БазоваяЕдиницаИзмерения = Номенклатура2.МераИзмерения.БазоваяЕдиницаИзмерения;" ибо это должны быть разные элементы справочника ЕдиницыИзмерения, с разными владельцами
2. "Номенклатура = ЭтаФорма.Номенклатура;" не имеет смысла потому что это и так одно и то же
3. "ЕдиницаИзмерения.Владелец = Номенклатура;" у вас ЕдиницаИзмерения - ссылка на справочник КлассификаторЕдиницИзмерения, у него НЕТ владельца!
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Golickoff

Цитата: cska-fanat-kz от 26 мар 2015, 08:16
Приложена ваша схема единиц измерения.
Большое спасибо за подсказку. Сделал исправления и код выглядит следующим образом
Процедура КнопкаВыполнитьНажатие(Кнопка) Объект = Номенклатура.ПолучитьОбъект(); Владелец = Объект.БазоваяЕдиницаИзмерения.Владелец; Если ЭтаФорма.ЭлементыФормы.МераИзмерения.Значение = Справочники.МерыИзмерения.НайтиПоНаименованию("Штуки") Тогда Объект.МераИзмерения = Справочники.МерыИзмерения.НайтиПоНаименованию("Штуки"); ЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("796"); Иначе Объект.МераИзмерения = Справочники.МерыИзмерения.НайтиПоНаименованию("Вес"); ЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("166"); КонецЕсли; БазоваяЕдиницаСсылка = Объект.БазоваяЕдиницаИзмерения; БазоваяЕдиницаОбъект = БазоваяЕдиницаСсылка.ПолучитьОбъект(); Объект.БазоваяЕдиницаИзмерения = ЕдиницаИзмерения; БазоваяЕдиницаОбъект.Владелец = Владелец; БазоваяЕдиницаОбъект.Записать(); Объект.Записать(); КонецПроцедуры
Не совсем уверен в исправлении третьего пункта, ошибка с изменением владельца по-прежнему актуальна.
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

blackmoon89

надо не ЕдиницаОбъект.Владелец = Объект;
а нужно  ЕдиницаОбъект.Владелец = Объект.ссылка;

вы пытаетесь впихнуть невпихуемое

cska-fanat-kz

Цитата: Golickoff от 26 мар 2015, 08:28Объект.БазоваяЕдиницаИзмерения = ЕдиницаИзмерения;

вы забываете про справочник ЕдиницыИзмерения!!!
реквизит БазоваяЕдиницаИзмерения - это ссылка на справочник ЕДИНИЦЫИЗМЕРЕНИЯ!!!!!!!!!
а вы ему пытаетесь присвоить ссылку на справочник КлассификаторЕдиницИзмерения
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

cska-fanat-kz

если я вообще правильно понял задачу...

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

Golickoff

Цитата: cska-fanat-kz от 26 мар 2015, 08:39
вы забываете про справочник ЕдиницыИзмерения!!!
Исправил:
Процедура КнопкаВыполнитьНажатие(Кнопка)     Объект = Номенклатура.ПолучитьОбъект();     Владелец = Объект.БазоваяЕдиницаИзмерения.Владелец;     Если ЭтаФорма.ЭлементыФормы.МераИзмерения.Значение = Справочники.МерыИзмерения.НайтиПоНаименованию("Штуки") Тогда         Объект.МераИзмерения = Справочники.МерыИзмерения.НайтиПоНаименованию("Штуки");         ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("шт");     Иначе         Объект.МераИзмерения = Справочники.МерыИзмерения.НайтиПоНаименованию("Вес");         ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("кг");     КонецЕсли;     БазоваяЕдиницаСсылка = Объект.БазоваяЕдиницаИзмерения;     БазоваяЕдиницаОбъект = БазоваяЕдиницаСсылка.ПолучитьОбъект();     Объект.БазоваяЕдиницаИзмерения = ЕдиницаИзмерения;     БазоваяЕдиницаОбъект.Владелец = Объект.Ссылка;     БазоваяЕдиницаОбъект.Записать();     Объект.Записать(); КонецПроцедуры
Теперь ситуация выглядит так: если в номенклатуре сейчас стоит вес и кг и я выбираю в форме ВО вес, то всё проходит спокойно. Если же я выбираю Штуки, то Объект.БазоваяЕдиницаИзмерения.Владелец принимает значение Штуки. И наоборот, если перед изменением у меня стоят Штуки и шт, а я выбираю Штуки, то всё проходит спокойно. А при выборе веса, Объект.БазоваяЕдиницаИзмерения.Владелец принимает значение Вес.
В общем, если я оставляю те же значения, обработка проходит по коду без ошибок. Если я их меняю, то Объект.БазоваяЕдиницаИзмерения.Владелец принимает некорректное значение.
Добавлено: 26 мар 2015, 09:00


cska-fanat-kz, ваша обработка создаёт новые единицы измерения. Мне же необходимо отредактировать текущую, ничего не добавляя.
Добавлено: 26 мар 2015, 09:17


cska-fanat-kz, приношу свои извинения. Оказывается, так и должно было быть. Ваша обработка работает корректно. Моя работает точно так же, только код выглядит иначе. Теперь он такой: Процедура КнопкаВыполнитьНажатие(Кнопка)     Объект = Номенклатура.ПолучитьОбъект();     Владелец = Объект.БазоваяЕдиницаИзмерения.Владелец;     Если ЭтаФорма.ЭлементыФормы.МераИзмерения.Значение = Справочники.МерыИзмерения.НайтиПоНаименованию("Штуки") Тогда         Объект.МераИзмерения = Справочники.МерыИзмерения.НайтиПоНаименованию("Штуки");         ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("шт");     Иначе         Объект.МераИзмерения = Справочники.МерыИзмерения.НайтиПоНаименованию("Вес");         ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("кг");     КонецЕсли; Объект.БазоваяЕдиницаИзмерения = ЕдиницаИзмерения; БазоваяЕдиницаСсылка = Объект.БазоваяЕдиницаИзмерения;     БазоваяЕдиницаОбъект = БазоваяЕдиницаСсылка.ПолучитьОбъект();     БазоваяЕдиницаОбъект.Владелец = Владелец.Ссылка;     БазоваяЕдиницаОбъект.Записать();     Объект.Записать(); КонецПроцедуры
Всем большое спасибо за помощь. Осталось добавить возможность групповой обработки. Надеюсь, с этим у меня не возникнет проблем.
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

cska-fanat-kz

Цитата: Golickoff от 26 мар 2015, 08:55Ваша обработка работает корректно. Моя работает точно так же, только код выглядит иначе

не стал бы так громко заявлять конечно...
1) Владелец = Объект.БазоваяЕдиницаИзмерения.Владелец;
и  Владелец = Объект.Ссылка;
- не одно и то же? или у номенклатуры может быть "чужая" базовая единица измерения?
2) ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("шт");
вы ищете только по наименованию, без учета владельца (3ий или 4ый параметр этого же метода) при как раз групповой загрузке
вы "отберете" у одной номенклатуры базовую единицу измерения и присвоите ее другой
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Golickoff

У меня возникла проблема после добавления нового элемента справочника. Во-первых, пришлось избавиться от переменной Владелец в пользу Номенклатура.Ссылка. А вот с единицами измерения я как раз решаю вопрос.
Добавлено: 26 мар 2015, 10:55


С редактированием группы справочника всё оказалось не так просто, как я ожидал. Перестала меняться мера измерения, хотя код тот же:
Процедура КнопкаВыполнитьНажатие(Кнопка) Если Номенклатура.ЭтоГруппа = Ложь Тогда Объект = Номенклатура.ПолучитьОбъект();     Если ЭтаФорма.ЭлементыФормы.МераИзмерения.Значение = Справочники.МерыИзмерения.НайтиПоНаименованию("Штуки") Тогда          Объект.МераИзмерения = Справочники.МерыИзмерения.НайтиПоНаименованию("Штуки");          ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("шт",,,Объект);     Иначе       Объект.МераИзмерения = Справочники.МерыИзмерения.НайтиПоНаименованию("Вес");       ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("кг",,,Объект);     КонецЕсли; Объект.БазоваяЕдиницаИзмерения = ЕдиницаИзмерения; БазоваяЕдиницаСсылка = Объект.БазоваяЕдиницаИзмерения;     БазоваяЕдиницаОбъект = БазоваяЕдиницаСсылка.ПолучитьОбъект();     БазоваяЕдиницаОбъект.Владелец = Номенклатура.Ссылка;     БазоваяЕдиницаОбъект.Записать();     Объект.Записать(); Иначе Выборка = Справочники.Номенклатура.Выбрать(Номенклатура); Пока Выборка.Следующий() Цикл   Объект = Выборка.Ссылка;     Если ЭтаФорма.ЭлементыФормы.МераИзмерения.Значение = Справочники.МерыИзмерения.НайтиПоНаименованию("Штуки") Тогда Мера = Объект.МераИзмерения.ПолучитьОбъект(); Мера = Справочники.МерыИзмерения.НайтиПоНаименованию("Штуки");          ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("шт",,,Объект);     Иначе Мера = Объект.МераИзмерения.ПолучитьОбъект(); Мера = Справочники.МерыИзмерения.НайтиПоНаименованию("Вес");       ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("кг",,,Объект);     КонецЕсли; БазоваяЕдиница = Объект.БазоваяЕдиницаИзмерения.ПолучитьОбъект(); БазоваяЕдиница = ЕдиницаИзмерения; БазоваяЕдиницаСсылка = Объект.БазоваяЕдиницаИзмерения;     БазоваяЕдиницаОбъект = БазоваяЕдиницаСсылка.ПолучитьОбъект();     БазоваяЕдиницаОбъект.Владелец = Объект.Ссылка;     БазоваяЕдиницаОбъект.Записать(); Результат = Объект.ПолучитьОбъект(); Результат.Записать(); КонецЦикла; КонецЕсли; КонецПроцедуры
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

Теги: родитель 

Похожие темы (5)

Рейтинг@Mail.ru

Поиск