|
v7: Копирование элемента справочника со значениями подчиненного справочника. | ☑ | ||
---|---|---|---|---|
0
saslentochka
24.09.21
✎
11:32
|
Добрый день. Прошу помощи.
Уже всю голову сломала. Есть справочник Материалы. у него подчиненный справочник МатериалыОперации. Строки справочника МатериалыОперации, также справочник ВидРабот. Заполняется МатериалыОперации из карточки элемента (вставлена таблица с вызовом функции). Задача в том, что при копировании материала, должны копироваться МатериалыОперации. |
|||
1
ДенисЧ
24.09.21
✎
11:37
|
В чём проблема? В конфигуратор не пускают?
|
|||
2
saslentochka
24.09.21
✎
11:52
|
Проблема в том, что никак не могу получить значения при копировании.
|
|||
3
ДенисЧ
24.09.21
✎
11:52
|
А как получаешь?
|
|||
4
saslentochka
24.09.21
✎
12:00
|
При закрытии.
Если ПустоеЗначение(Родит)=0 Тогда Спр=СоздатьОбъект("Справочник.Материалы"); Спр=ТекущийЭлемент(); СпрР=СоздатьОбъект("Справочник.МатериалыОперации"); СпрК=СоздатьОбъект("Справочник.МатериалыОперации"); СпрР.ИспользоватьВладельца(Родит); СпрК.ИспользоватьВладельца(Спр); СпрР.ВыбратьЭлементы(); Пока СпрР.ПолучитьЭлемент()=1 Цикл СпрК.Новый(); СпрК.ВидРабот=СпрР.ВидРабот; СпрК.Записать(); КонецЦикла; КонецЕсли; |
|||
5
Lazy Stranger
24.09.21
✎
12:09
|
что находится в Родит и откуда оно там берётся?
должно быть что-то такое Перем Родит Процедура ВводНового(флагКопирования, ОбъектКопирования) Если ФлагКопирования=1 тогда Родит = ОбъектКопирования; КонецЕсли; КонецПроцедуры ну и записывать это дело лучше при записи, а не при закрытии Процедура ПриЗаписи() Если ПустоеЗначение(Родит)=0 тогда //элемент скопировали Записать(); //дальше тот код что в (4), только там 2 строки лишние //можно сразу СпрК.ИспользоватьВладельца(ТекущийЭлемент()); |
|||
6
ДенисЧ
24.09.21
✎
12:10
|
А владельца для СпрК Кужегетыч будет прописывать?
|
|||
7
Lazy Stranger
24.09.21
✎
12:36
|
(6) там же есть СпрК.ИспользоватьВладельца(), что ты ещё предлагаешь прописать?
|
|||
8
ChMikle
24.09.21
✎
12:39
|
СпрК.Владелец= ЗначениеВладельца;
|
|||
9
Злопчинский
24.09.21
✎
12:43
|
Блин, откуда же вы такие вылазиие. Давит вас снеговик, давит, а все никак...
|
|||
10
ChMikle
24.09.21
✎
12:49
|
(9) это вы сейчас в чей адрес ?
|
|||
11
серый КТУЛХУ
24.09.21
✎
12:54
|
вопрос из разряда "никак не могу составить сложноподчиненное предложение, вот пытаюсь - "ыдловтдо тфывдло лоыфтавдлофтывлдофдлы" - и не получается... помогите!"
|
|||
12
Злопчинский
24.09.21
✎
14:59
|
(10) я - бубнист, бубню...
|
|||
13
saslentochka
27.09.21
✎
14:29
|
(5) Добрый день!
Спасибо большое. Получилось вот так: Если ПустоеЗначение(Родит)=0 Тогда Сообщить("Привет"); СпрМатериал = СоздатьОбъект("Справочник.Материалы"); СпрВл = СоздатьОбъект("Справочник.МатериалыОперации"); СпрКоп = СоздатьОбъект("Справочник.МатериалыОперации"); СпрВл.ИспользоватьВладельца(Родит); СпрКоп.ИспользоватьВладельца(ТекущийЭлемент()); СпрВл.ВыбратьЭлементы(); Пока СпрВл.ПолучитьЭлемент()=1 Цикл Сообщить (СпрВл.ВидРабот); СпрКоп.Новый(); Сообщить("Создал"); СпрКоп.ВидРабот = СпрВл.ВидРабот; Сообщить("Записал"); КонецЦикла; КонецЕсли; Сейчас ошибок не выдает, видит все операции, но в подчиненном справочнике - пустота... |
|||
14
saslentochka
27.09.21
✎
14:32
|
В подчиненном справочнике, вид работ - это тоже справочник.
Может нужно находить по реквизиту в нем значение и уже присваивать? |
|||
15
Злопчинский
27.09.21
✎
14:38
|
Спраоп. Записать() - гиде????
|
|||
16
saslentochka
27.09.21
✎
14:56
|
(15) Да, забыла.
Зато теперь ошибка. После первого прохода цикла. Привет Получение металла со склада Создал Записал Получение металла со склада СпрКоп.Записать(); {Справочник.Материалы.Форма.Модуль(313)}: Не выбран элемент справочника-хозяина! Элемент не может быть записан! |
|||
17
Mikeware
27.09.21
✎
15:10
|
(16) ну вроде русским языком пишет... Или вам нужно в стихотворной форме?
|
|||
18
Volodja
27.09.21
✎
15:19
|
(16) вот здесь:
СпрКоп.ИспользоватьВладельца(ТекущийЭлемент()); У вас еще Владелец не существует |
|||
19
Volodja
27.09.21
✎
15:20
|
(18) Проверьте
Сообщить(ТекущийЭлемент().Выбран()) |
|||
20
Volodja
27.09.21
✎
15:22
|
(16) Ловите:
Функция глСоздатьКопиюЭлементаСправочника(_ЭлементИсточник,_НовыйВладелец=0,_СоздатьПодчиненные=1) Экспорт Если ПустоеЗначение(_ЭлементИсточник)=1 Тогда Возврат ПустоеЗначение("Справочник"); КонецЕсли; _НовыйЭлемент=СоздатьОбъект("Справочник."+_ЭлементИсточник.Вид()); _Родитель=_ЭлементИсточник.Родитель; Если ПустоеЗначение(_Родитель)=0 Тогда _НовыйЭлемент.ИспользоватьРодителя(_Родитель); КонецЕсли; _Владелец=?(_НовыйВладелец=0,_ЭлементИсточник.Владелец,_НовыйВладелец); Если ПустоеЗначение(_Владелец)=0 Тогда _НовыйЭлемент.ИспользоватьВладельца(_Владелец); КонецЕсли; _НовыйЭлемент.Новый(); спрМД=Метаданные.Справочник(_ЭлементИсточник.Вид()); Для Инд = 1 По спрМД.Реквизит() Цикл ИД=СокрЛП(спрМД.Реквизит(Инд).Идентификатор); _НовыйЭлемент.УстановитьАтрибут(ИД,_ЭлементИсточник.ПолучитьАтрибут(ИД)); КонецЦикла; _НовыйЭлемент.Наименование=_ЭлементИсточник.Наименование; _НовыйЭлемент.Записать(); Если _ЭлементИсточник.ПометкаУдаления()=1 Тогда _НовыйЭлемент.Удалить(0); КонецЕсли; Если _СоздатьПодчиненные=1 Тогда Для _ИндПодч=1 по Метаданные.Справочник() Цикл _СпрПодч=Метаданные.Справочник(_ИндПодч); Если (ПустаяСтрока(_СпрПодч.Владелец)=0) и (СокрЛП(_СпрПодч.Владелец)<>"Метаданные") Тогда Если _НовыйЭлемент.Вид()=_СпрПодч.Владелец.Идентификатор Тогда спрПодч=СоздатьОбъект("Справочник."+_СпрПодч.Идентификатор); спрПодч.ИспользоватьВладельца(_ЭлементИсточник); спрПодч.ВыбратьЭлементы(1); Пока спрПодч.ПолучитьЭлемент()=1 Цикл _Элем=глСоздатьКопиюЭлементаСправочника(спрПодч.ТекущийЭлемент(),_НовыйЭлемент.ТекущийЭлемент(),1); КонецЦикла; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; Возврат _НовыйЭлемент.ТекущийЭлемент(); КонецФункции |
|||
21
saslentochka
27.09.21
✎
16:20
|
(18) Его необходимо записать. Но откровенно не понимаю как это сделать.
В процедуре при вводе() передается Родит = ОбъектКопирования В процедуре при записи() выполняется заполнение подчиненного справочника. |
|||
22
Volodja
27.09.21
✎
16:28
|
(21) возьмите (20) эта функция сама все сделает
Поместите ее в глобальный модуль Вызовите ее откуда-нибудь НовыйЭлемент=глСоздатьКопиюЭлементаСправочника(_ЭлементСКоторогоСнятьКопию) И будет создан новый со всеми подчиненными |
|||
23
Volodja
27.09.21
✎
16:31
|
(21) Поместите на форме списка справочника кнопку. Формулу кнопки напишите :
глСоздатьКопиюЭлементаСправочника(ТекущийЭлемент()) |
|||
24
saslentochka
27.09.21
✎
16:42
|
(23) Спасибо большое...)
|
|||
25
Sserj
27.09.21
✎
16:44
|
(23) Что-то я в этой функции не увидел обработки периодических реквизитов. По идее если реквизит периодический то его нужно получать на текущую дату а не просто читать как атрибут.
|
|||
26
Volodja
27.09.21
✎
16:48
|
(25) Верно.
Для универсальности нужно будет подправить спс |
|||
27
acanta
27.09.21
✎
16:49
|
ИспользоватьДату()?
|
|||
28
Volodja
27.09.21
✎
16:51
|
(27) тут в общем подойти нужно будет. ИспользоватьДату() не подойдет
Через .Получить(...) и .Установить(...) через чтение Периодического объекта |
|||
29
Volodja
27.09.21
✎
16:53
|
+(28) чтобы была полная копия, нужно тогда и копию всей истории сделать
|
|||
30
Volodja
27.09.21
✎
16:57
|
+(28) Ошибся. Через
ВыбратьЗначения() Периодического объекта |
|||
31
Sserj
27.09.21
✎
17:02
|
(30) И кстати будет бооольшая и малозаметная ошибка если к примеру будешь так копировать номенклатуру.
Он сделает подчиненные единицы измерения, но основные в самой номенклатуре назначит от исходного объекта. |
|||
32
Sserj
27.09.21
✎
17:04
|
+(31) А так же это будет с договорами и счетами в контрагентах.
|
|||
33
Volodja
27.09.21
✎
17:06
|
(31) ну да. Точная копия элемента.
|
|||
34
Volodja
27.09.21
✎
17:08
|
(32) или вы хотите сказать, что в реквизитах подчиненного элемента есть реквизит ссылка на владельца?
|
|||
35
Volodja
27.09.21
✎
17:09
|
+(34) тогда да? согласен с (32)
|
|||
36
Volodja
27.09.21
✎
17:10
|
a
35 - 27.09.21 - 17:09 +(34) тогда да. согласен с (32) |
|||
37
Volodja
27.09.21
✎
17:10
|
тогда да. согласен с (32)
|
|||
38
Volodja
27.09.21
✎
17:15
|
(34) но зачем в реквизитах подчиненного справочника еще реквизит на владельца? Если и так Владелец есть?
|
|||
39
Sserj
27.09.21
✎
17:17
|
(34) Наоборот. В реквизитах Владельца есть ссылка на подчиненные. К примеру Основной договор - ссылка на подчиненный ему же Договора. Или Основной банковский счет - ссылка на подчиненные банковские счета.
В твоей функции эти Основной договор и Основной банковский счет будут ссылаться на подчиненные Источнику копирования. И что там начнется во взаиморасчетах представить несложно. |
|||
40
Volodja
27.09.21
✎
17:18
|
(39) Понял
|
|||
41
Volodja
27.09.21
✎
17:22
|
(39) использовал эту функцию только в одном справочнике. Там не было периодических и ссылок на подчиненные, поэтому и не заметил.
А так я для договоров и счетов использую галочку "Использовать по умолчанию" и поэтому у меня бы эта ситуация не возникла бы |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |