|   |   | 
| 
 | 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) использовал эту функцию только в одном справочнике. Там не было периодических и ссылок на подчиненные, поэтому и не заметил.
 А так я для договоров и счетов использую галочку "Использовать по умолчанию" и поэтому у меня бы эта ситуация не возникла бы | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |