• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Вопрос: О копировании элемента справочника

  • Автор темы gorlanovmax
  • Дата начала
G

gorlanovmax

Есть необходимость, чтобы при копировании элемента справочника "Номенклатура" (конфа ТиС), копировались свойства товара.
На закладке "свойства" есть таблица значений "СписокСвойств".
Собственно сам вопрос: как получить таблицу значений "СписокСвойств" из элемента, с которого был скопирован новый элемент?
 
K

kaa

Надо смотреть справочник СвойстваНоменклатуры
 
G

gorlanovmax

это понятно. в таблице значений хранятся ссылки на справочник "свойства номеклатура", вот вся проблема получить эти ссылки
 
K

kaa

Спр1 - элемент с которого копируем
Спр2 - в который
СпрСН1 - свойства ном
СпрСН2

СпрСН1.ИспользоватьВладельца(Спр1);
СпрСН2.ИспользоватьВладельца(Спр2);
СпрСН1.ВыбратьЭлементы();
Пока СпрСН1.ПолучитьЭлемент()=1 Цикл
СпрСН2.Новый();
СпрСН2.ВидСвойства = СпрСН1.ВидСвойства;
СпрСН2.ЗначениеСвойства = СпрСН1.ЗначениеСвойства;
СпрСН2.Записать();
КонецЦикла;
 
G

gorlanovmax

с этим тоже более или менее понятно. спасибо. но мне нужно чтобы свойства копировались автоматически при обычном копировании элемента справочника номенклатура
 
K

kaa

ВводНового(ПризнакКоприрования,ОбъектКопирования)
и прописывай
 
G

gorlanovmax

понял, спасибо. все было так просто, а я заптормозился на поиске элемента, с которого происходило копирование
 
G

gorlanovmax

Не все так гладко.

Код:
Процедура ВводНового(Признак,Родитель)
Если Признак=1 Тогда
СпрРодитель=СоздатьОбъект("Справочник.СвойстваНоменклатуры");
СпрКопирование=СоздатьОбъект("Справочник.СвойстваНоменклатуры");
СпрРодитель.ИспользоватьВладельца(Родитель);
СпрКопирование.ИспользоватьВладельца(ТекущийЭлемент());
СпрРодитель.ВыбратьЭлементы();
Пока СпрРодитель.ПолучитьЭлемент()=1 Цикл
СпрКопирование.Новый();
СпрКопирование.ВидСвойства=СпрРодитель.ВидСвойства;
СпрКопирование.ЗначениеСвойства=СпрРодитель.ЗначениеСвойства;
СпрКопирование.Записать();
КонецЦикла;
КонецЕсли;
Конец Процедуры

И вот такая ошибка:
СпрКопирование.Записать();
{Справочник.Номенклатура.Форма.Модуль(1444)}: Не выбран элемент справочника-хозяина! Элемент не может быть записан!
 
H

Hryv

Попробуй
СпрКопирование.Владелец = ТекущийЭлемент();

написать после
СпрКопирование.Новый();
 
G

gorlanovmax

Попробуй
СпрКопирование.ИспользоватьВладельца(ТекущийЭлемент());

написать после
СпрКопирование.Новый();

нет проблема не в этом.
чуть ниже в цикле есть СпрКопирование.Новый();

проблема в том, что ТекущийЭлемент() возвращает пустое значение
 
H

Hryv

проблема в том, что ТекущийЭлемент() возвращает пустое значение

Ну да, новый элемент основного справочника еще не записан
Можно его предварительно записать, но тут возникает туча нюансов
 
H

Hryv

А таблица значений на форме заполняется непосредственно элементами подчиненного справочника?
 
G

gorlanovmax

А таблица значений на форме заполняется непосредственно элементами подчиненного справочника?
Да.

Все проблема решена
Вот решение

Код:
Перем Родит

Процедура ВводНового(Признак,Родитель)
Если Признак=1 Тогда
Родит=Родитель;
КонецЕсли;
КонецПроцедуры

Процедура ПриЗакрытии()
Если ПустоеЗначение(Родит)=0 Тогда
СпрЭлемент=СоздатьОбъект("Справочник.Номенклатура");
СпрЭлемент=ТекущийЭлемент();
СпрРодитель=СоздатьОбъект("Справочник.СвойстваНоменклатуры");
СпрКопирование=СоздатьОбъект("Справочник.СвойстваНоменклатуры");
СпрРодитель.ИспользоватьВладельца(Родит);
СпрКопирование.ИспользоватьВладельца(СпрЭлемент);
СпрРодитель.ВыбратьЭлементы();
Пока СпрРодитель.ПолучитьЭлемент()=1 Цикл
СпрКопирование.Новый();
СпрКопирование.ВидСвойства=СпрРодитель.ВидСвойства;
СпрКопирование.ЗначениеСвойства=СпрРодитель.ЗначениеСвойства;
СпрКопирование.Записать();
КонецЦикла;
КонецЕсли;
КонецПроцедуры

Может немножко коряво, но работает
Один нюанс, свойства записываются при первом закрытии скопированного элемента
 
G

gorlanovmax

Может тогда лучше это делать в ПриОткрытии()

Так при первом вызове ПриОткрытии элемент еще не записан.
А при провторном открытии теряется связь с элементом, с которого копировали.
 
H

Hryv

Понял, фишка в том, что ПриЗакрытии() вызывается после ПриЗаписи() и запись остается на совести юзера
 
G

gorlanovmax

так если юзер не запишет новый элемент, то он не сохранится вообще. так что защита от дураков включена

еще вопрос. пытаюсь таким же образом скопировать список цен, и мне выдает следующее

Код:
СпрРодительЦена=СоздатьОбъект("Справочник.Цены");
СпрКопированиеЦена=СоздатьОбъект("Справочник.Цены");
СпрРодительЦена.ИспользоватьДату(РабочаяДата());		
СпрРодительЦена.ИспользоватьВладельца(Родит);
СпрКопированиеЦена=ИспользоватьВладельца(ТекущийЭлемент());
СпрРодительЦена.ВыбратьЭлементы();
Пока СпрРодительЦена.ПолучитьЭлемент()=1 Цикл
СпрКопированиеЦена.Новый();
СпрКопированиеЦена.Наименование=СпрРодительЦена.Наименование;
СпрКопированиеЦена.Записать();
КонецЦикла;

ошибка:
СпрКопированиеЦена.Новый();
{Справочник.Номенклатура.Форма.Модуль(1822)}: Не задан вид.
 
H

Hryv

так если юзер не запишет новый элемент, то он не сохранится вообще. так что защита от дураков включена

Но что будет, если юзер не зная про копирование подчиненных элементов начнет их руками вносить?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!