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

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

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

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

Golickoff

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

k_aleks80

Если у тебя обычная обработка (не на управляемых формах):
тогда не:
ЦитироватьНоменклатура = ЭтаФорма.Номенклатура; ...
, а все-таки, скорее всего:
Номенклатура = ОбработкаОбъект.Номенклатура; ну и соответственно у обработки должен быть реквизит Номенклатура с соответствующим типом

cska-fanat-kz

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

Golickoff

Цитата: cska-fanat-kz от 24 мар 2015, 18:26
1) полный текст ошибки как ругается конфигуратор
2) справочник КлассификаторЕдиницИзмерения обычно никому не подчинен, из-за этого может и ругаться - вы пытаетесь назначить владельца справочнику у которого его нет
3) НайтиПоНаименованию() возвращает только ссылку. после этого надо объект получить чтобы иметь возможность изменять реквизиты найденной ЕдИзм.
1) {Форма.Форма.Форма(17)}: Поле объекта недоступно для записи (Владелец)
ЕдиницаИзмерения.Владелец = Номенклатура;

2) Если не пытаться записать владельца, тогда эта ошибка {Форма.Форма.Форма(18)}: Ошибка при вызове метода контекста (Записать)
Номенклатура2.Записать();
по причине:
Не удалось записать "Банан (Номенклатура)"!
Банан -- это тестовый элемент номенклатуры. При этом внизу экрана появляется сообщение с текстом У базовой единицы номенклатуры "Банан" неверно указан владелец!
, но табло говорит что владельца там нет и никогда не было, да и справочник Номенклатура ни кому не подчинён.
Добавлено: 25 мар 2015, 03:19


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

Добавлено: 25 мар 2015, 03:23


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

cska-fanat-kz

1) по идее у вас схема с УТ, только реквизиты по другому названы...
т.е. есть номенклатура и у нее 2 реквизита на тему единиц измерения: базоваяединицаизмерения (тип спрссылка.классификаторедизм) и мераизмерения (типа спрссылка.МерыИзмерения). первый спр-к (классификатор...) - не подчинен, второй - подчинен. соответственно владельца надо у второго реквизита менять а не у первого.
2) "Если ЭтаФорма.ЭлементыФормы.МераИзмерения.Значение = "Штуки" Тогда" - объясните ЭТО. "МераИзмерения" на форме что имеет тип Строка?
судя по названию - тип спрссылка.МерыИзмерения
3)
Цитата: Golickoff от 25 мар 2015, 02:44Объект.МераИзмерения = Справочники.МерыИзмерения.НайтиПоНаименованию("Штуки");
по идее надо искать в пределах владельца - номенклатуры, 3ий или 4ый параметр НайтиПоНаименованию()

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

Golickoff

Цитата: cska-fanat-kz от 25 мар 2015, 03:54
по идее надо искать в пределах владельца - номенклатуры, 3ий или 4ый параметр НайтиПоНаименованию()
На форме ВО есть табло с перечислением, которое не является ссылкой на объекты конфигурации. Т.е. там находятся только "Штуки" и "Вес" и хранятся эти значения в самой ВО. Да, это строка.
Добавлено: 25 мар 2015, 04:32


В оригинальной конфигурации на форме элемента есть три поля выбора: Мера измерения (СправочникСсылка.МерыИзмерения), Базовая единица (СправочникСсылка.КлассификаторЕдиницИзмерения) и Единица отчётов (я его не трогаю). При выборе на форме ВО меры измерения, устанавливается мера измерения из справочника меры измерения (прошу прощения за масляное масло). После в зависимости от выбранной меры меняется базовая единица, родителя которой я и пытаюсь изменить. Если отключить изменение базовой единицы, она естественно не меняется, но и ошибок никаких не возникает.
Добавлено: 25 мар 2015, 05:26


*На форме ВО есть поле с перечислением. Поле, а не табло.
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

cska-fanat-kz

стандартная УТшная схема.
у базовой единицы (вернее у элемента справочника КлассификаторЕдиницИзмерения) нет никакого владельца.
а вот у меры измерения (вернее у элемента справочника МерыИзмерения) - есть.
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Golickoff

Хорошо, я нашёл кусок кода, вызывающий сообщение об ошибке. Вот он Если БазоваяЕдиницаИзмерения.Владелец <> Ссылка Тогда
    Сообщить("У базовой единицы номенклатуры """ + СокрЛП(Ссылка) + """ неверно указан владелец!",    СтатусСообщения.Важное);
    Отказ = Истина;
КонецЕсли;

А вот кусок моего кода: Номенклатура = ЭтаФорма.Номенклатура;
Объект = Номенклатура.ПолучитьОбъект();
БазаОбъект = Объект.БазоваяЕдиницаИзмерения.ПолучитьОбъект();
БазаОбъект.Владелец = Номенклатура;
При этом табло показывает, что БазаОбъект.Владелец = Банан и имеет тип СправочникСсылка.Номенклатура, ну а конфигурация выдаёт сообщение
ЦитироватьУ базовой единицы номенклатуры "Банан" неверно указан владелец!
Я так понимаю, на месте БазаОбъект.Владелец должно быть что-то другое?
Добавлено: 25 мар 2015, 11:52


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

cska-fanat-kz

значит НЕстандартная УТшная схема )
надо конфигу смотреть, как именно справочники настроены.
а то модуль ясновидения сломался.
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Golickoff

Я могу скинуть конфигурацию, но конфигурация может попросить ключ. Кидать?
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

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

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

Рейтинг@Mail.ru

Поиск