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