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

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

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

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

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

Поиск