GorlanovMax
23:08:2008, 16:52
Есть необходимость, чтобы при копировании элемента справочника "Номенклатура" (конфа ТиС), копировались свойства товара.
На закладке "свойства" есть таблица значений "СписокСвойств".
Собственно сам вопрос: как получить таблицу значений "СписокСвойств" из элемента, с которого был скопирован новый элемент?
Надо смотреть справочник СвойстваНоменклатуры
GorlanovMax
25:08:2008, 04:42
это понятно. в таблице значений хранятся ссылки на справочник "свойства номеклатура", вот вся проблема получить эти ссылки
Спр1 - элемент с которого копируем
Спр2 - в который
СпрСН1 - свойства ном
СпрСН2
СпрСН1.ИспользоватьВладельца(Спр1);
СпрСН2.ИспользоватьВладельца(Спр2);
СпрСН1.ВыбратьЭлементы();
Пока СпрСН1.ПолучитьЭлемент()=1 Цикл
СпрСН2.Новый();
СпрСН2.ВидСвойства = СпрСН1.ВидСвойства;
СпрСН2.ЗначениеСвойства = СпрСН1.ЗначениеСвойства;
СпрСН2.Записать();
КонецЦикла;
GorlanovMax
25:08:2008, 04:57
с этим тоже более или менее понятно. спасибо. но мне нужно чтобы свойства копировались автоматически при обычном копировании элемента справочника номенклатура
ВводНового(ПризнакКоприрования,ОбъектКопирования)
и прописывай
GorlanovMax
25:08:2008, 05:23
понял, спасибо. все было так просто, а я заптормозился на поиске элемента, с которого происходило копирование
GorlanovMax
25:08:2008, 08:36
Не все так гладко.
Процедура ВводНового(Признак,Родитель)
Если Признак=1 Тогда
СпрРодитель=СоздатьОбъект("Справочник.СвойстваНоменклатуры");
СпрКопирование=СоздатьОбъект("Справочник.СвойстваНоменклатуры");
СпрРодитель.ИспользоватьВладельца(Родитель);
СпрКопирование.ИспользоватьВладельца(ТекущийЭлемент());
СпрРодитель.ВыбратьЭлементы();
Пока СпрРодитель.ПолучитьЭлемент()=1 Цикл
СпрКопирование.Новый();
СпрКопирование.ВидСвойства=СпрРодитель.ВидСвойства;
СпрКопирование.ЗначениеСвойства=СпрРодитель.ЗначениеСвойства;
СпрКопирование.Записать();
КонецЦикла;
КонецЕсли;
Конец Процедуры
И вот такая ошибка:
Цитата
СпрКопирование.Записать();
{Справочник.Номенклатура.Форма.Модуль(1444)}: Не выбран элемент справочника-хозяина! Элемент не может быть записан!
Попробуй
СпрКопирование.Владелец = ТекущийЭлемент();
написать после
СпрКопирование.Новый();
GorlanovMax
25:08:2008, 08:49
Цитата(Hryv @ 25:08:2008 - 11:46)

Попробуй
СпрКопирование.ИспользоватьВладельца(ТекущийЭлемент());
написать после
СпрКопирование.Новый();
нет проблема не в этом.
чуть ниже в цикле есть СпрКопирование.Новый();
проблема в том, что ТекущийЭлемент() возвращает пустое значение
Цитата
проблема в том, что ТекущийЭлемент() возвращает пустое значение
Ну да, новый элемент основного справочника еще не записан
Можно его предварительно записать, но тут возникает туча нюансов
GorlanovMax
25:08:2008, 09:08
Цитата(Hryv @ 25:08:2008 - 12:06)

Ну да, новый элемент основного справочника еще не записан
Можно его предварительно записать, но тут возникает туча нюансов
В процедуре вводНового он не дает записать
А таблица значений на форме заполняется непосредственно элементами подчиненного справочника?
GorlanovMax
25:08:2008, 09:41
Цитата(Hryv @ 25:08:2008 - 12:18)

А таблица значений на форме заполняется непосредственно элементами подчиненного справочника?
Да.
Все проблема решена
Вот решение
Перем Родит
Процедура ВводНового(Признак,Родитель)
Если Признак=1 Тогда
Родит=Родитель;
КонецЕсли;
КонецПроцедуры
Процедура ПриЗакрытии()
Если ПустоеЗначение(Родит)=0 Тогда
СпрЭлемент=СоздатьОбъект("Справочник.Номенклатура");
СпрЭлемент=ТекущийЭлемент();
СпрРодитель=СоздатьОбъект("Справочник.СвойстваНоменклатуры");
СпрКопирование=СоздатьОбъект("Справочник.СвойстваНоменклатуры");
СпрРодитель.ИспользоватьВладельца(Родит);
СпрКопирование.ИспользоватьВладельца(СпрЭлемент);
СпрРодитель.ВыбратьЭлементы();
Пока СпрРодитель.ПолучитьЭлемент()=1 Цикл
СпрКопирование.Новый();
СпрКопирование.ВидСвойства=СпрРодитель.ВидСвойства;
СпрКопирование.ЗначениеСвойства=СпрРодитель.ЗначениеСвойства;
СпрКопирование.Записать();
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Может немножко коряво, но работает
Один нюанс, свойства записываются при первом закрытии скопированного элемента
Цитата
Один нюанс, свойства записываются при первом закрытии скопированного элемента
Может тогда лучше это делать в ПриОткрытии()
GorlanovMax
25:08:2008, 10:55
Цитата(Hryv @ 25:08:2008 - 13:53)

Может тогда лучше это делать в ПриОткрытии()
Так при первом вызове ПриОткрытии элемент еще не записан.
А при провторном открытии теряется связь с элементом, с которого копировали.
Понял, фишка в том, что ПриЗакрытии() вызывается после ПриЗаписи() и запись остается на совести юзера
GorlanovMax
25:08:2008, 11:22
так если юзер не запишет новый элемент, то он не сохранится вообще. так что защита от дураков включена
еще вопрос. пытаюсь таким же образом скопировать список цен, и мне выдает следующее
СпрРодительЦена=СоздатьОбъект("Справочник.Цены");
СпрКопированиеЦена=СоздатьОбъект("Справочник.Цены");
СпрРодительЦена.ИспользоватьДату(РабочаяДата());
СпрРодительЦена.ИспользоватьВладельца(Родит);
СпрКопированиеЦена=ИспользоватьВладельца(ТекущийЭлемент());
СпрРодительЦена.ВыбратьЭлементы();
Пока СпрРодительЦена.ПолучитьЭлемент()=1 Цикл
СпрКопированиеЦена.Новый();
СпрКопированиеЦена.Наименование=СпрРодительЦена.Наименование;
СпрКопированиеЦена.Записать();
КонецЦикла;
ошибка:
Цитата
СпрКопированиеЦена.Новый();
{Справочник.Номенклатура.Форма.Модуль(1822)}: Не задан вид.
НовыйЭлемент() ?
Мда -что от не то...
Цитата
так если юзер не запишет новый элемент, то он не сохранится вообще. так что защита от дураков включена
Но что будет, если юзер не зная про копирование подчиненных элементов начнет их руками вносить?
GorlanovMax
25:08:2008, 11:29
Цитата(Hryv @ 25:08:2008 - 14:27)

Но что будет, если юзер не зная про копирование подчиненных элементов начнет из руками вносить?
Сделаем предупреждение при вводе нового копированием. Что-то типа "при копировании элемента, автоматически копируются свойства (при закрытии элемента)"
СпрКопированиеЦена=ИспользоватьВладельца(ТекущийЭлемент()); неа
СпрКопированиеЦена.ИспользоватьВладельца(ТекущийЭлемент());
GorlanovMax
25:08:2008, 11:42
блин, вот я мир спасибо
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.