Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Копирование элемента справочника со значениями подчиненного справочника.

v7: Копирование элемента справочника со значениями подчиненного справочника.
Я
   saslentochka
 
24.09.21 - 11:32
Добрый день. Прошу помощи.
Уже всю голову сломала.
Есть справочник Материалы. у него подчиненный справочник МатериалыОперации. Строки справочника МатериалыОперации, также справочник ВидРабот.
Заполняется МатериалыОперации из карточки элемента (вставлена таблица с вызовом функции).
Задача в том, что при копировании материала, должны копироваться МатериалыОперации.
   ДенисЧ
 
1 - 24.09.21 - 11:37
В чём проблема? В конфигуратор не пускают?
   saslentochka
 
2 - 24.09.21 - 11:52
Проблема в том, что никак не могу получить значения при копировании.
   ДенисЧ
 
3 - 24.09.21 - 11:52
А как получаешь?
   saslentochka
 
4 - 24.09.21 - 12:00
При закрытии.
Если ПустоеЗначение(Родит)=0 Тогда
        Спр=СоздатьОбъект("Справочник.Материалы");
        Спр=ТекущийЭлемент();
        СпрР=СоздатьОбъект("Справочник.МатериалыОперации");
        СпрК=СоздатьОбъект("Справочник.МатериалыОперации");
        СпрР.ИспользоватьВладельца(Родит);
        СпрК.ИспользоватьВладельца(Спр);
        СпрР.ВыбратьЭлементы();
        Пока СпрР.ПолучитьЭлемент()=1 Цикл
            СпрК.Новый();
            СпрК.ВидРабот=СпрР.ВидРабот;
            СпрК.Записать();
        КонецЦикла;
    КонецЕсли;
   Lazy Stranger
 
5 - 24.09.21 - 12:09
что находится в Родит и откуда оно там берётся?
должно быть что-то такое

Перем Родит
Процедура ВводНового(флагКопирования, ОбъектКопирования)
Если ФлагКопирования=1 тогда
Родит = ОбъектКопирования;
КонецЕсли;
КонецПроцедуры

ну и записывать это дело лучше при записи, а не при закрытии
Процедура ПриЗаписи()
Если ПустоеЗначение(Родит)=0 тогда//элемент скопировали

Записать();
//дальше тот код что в (4), только там 2 строки лишние

//можно сразу
СпрК.ИспользоватьВладельца(ТекущийЭлемент());
   ДенисЧ
 
6 - 24.09.21 - 12:10
А владельца для СпрК Кужегетыч будет прописывать?
   Lazy Stranger
 
7 - 24.09.21 - 12:36
(6) там же есть СпрК.ИспользоватьВладельца(), что ты ещё предлагаешь прописать?
   ChMikle
 
8 - 24.09.21 - 12:39
СпрК.Владелец= ЗначениеВладельца;
   Злопчинский
 
9 - 24.09.21 - 12:43
Блин, откуда же вы такие вылазиие. Давит вас снеговик, давит, а все никак...
   ChMikle
 
10 - 24.09.21 - 12:49
(9) это вы сейчас в чей адрес ?
   серый КТУЛХУ
 
11 - 24.09.21 - 12:54
вопрос из разряда "никак не могу составить сложноподчиненное предложение, вот пытаюсь - "ыдловтдо тфывдло лоыфтавдлофтывлдофдлы" - и не получается... помогите!"
   Злопчинский
 
12 - 24.09.21 - 14:59
(10) я - бубнист, бубню...
   saslentochka
 
13 - 27.09.21 - 14:29
(5) Добрый день!
Спасибо большое.

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


Сейчас ошибок не выдает, видит все операции, но в подчиненном справочнике - пустота...
   saslentochka
 
14 - 27.09.21 - 14:32
В подчиненном справочнике, вид работ - это тоже справочник.
Может нужно находить по реквизиту в нем значение и уже присваивать?
   Злопчинский
 
15 - 27.09.21 - 14:38
Спраоп. Записать() - гиде????
   saslentochka
 
16 - 27.09.21 - 14:56
(15) Да, забыла.
Зато теперь ошибка. После первого прохода цикла.
Привет
Получение металла со склада
Создал
Записал
Получение металла со склада
СпрКоп.Записать();
{Справочник.Материалы.Форма.Модуль(313)}: Не выбран элемент справочника-хозяина! Элемент не может быть записан!
   Mikeware
 
17 - 27.09.21 - 15:10
(16) ну вроде русским языком пишет... Или вам нужно в стихотворной форме?
   Volodja
 
18 - 27.09.21 - 15:19
(16)   вот здесь:
СпрКоп.ИспользоватьВладельца(ТекущийЭлемент());

У вас еще Владелец не существует
   Volodja
 
19 - 27.09.21 - 15:20
(18) Проверьте
Сообщить(ТекущийЭлемент().Выбран())
   Volodja
 
20 - 27.09.21 - 15:22
(16) Ловите:

Функция глСоздатьКопиюЭлементаСправочника(_ЭлементИсточник,_НовыйВладелец=0,_СоздатьПодчиненные=1) Экспорт
    Если ПустоеЗначение(_ЭлементИсточник)=1 Тогда
        Возврат ПустоеЗначение("Справочник");
    КонецЕсли;
    _НовыйЭлемент=СоздатьОбъект("Справочник."+_ЭлементИсточник.Вид());
    _Родитель=_ЭлементИсточник.Родитель;
    Если ПустоеЗначение(_Родитель)=0 Тогда
        _НовыйЭлемент.ИспользоватьРодителя(_Родитель);
    КонецЕсли;
    _Владелец=?(_НовыйВладелец=0,_ЭлементИсточник.Владелец,_НовыйВладелец);
    Если ПустоеЗначение(_Владелец)=0 Тогда
        _НовыйЭлемент.ИспользоватьВладельца(_Владелец);
    КонецЕсли;
    _НовыйЭлемент.Новый();
    спрМД=Метаданные.Справочник(_ЭлементИсточник.Вид());
    Для Инд = 1 По спрМД.Реквизит() Цикл
        ИД=СокрЛП(спрМД.Реквизит(Инд).Идентификатор);
        _НовыйЭлемент.УстановитьАтрибут(ИД,_ЭлементИсточник.ПолучитьАтрибут(ИД));
    КонецЦикла;
    _НовыйЭлемент.Наименование=_ЭлементИсточник.Наименование;
    _НовыйЭлемент.Записать();
    Если _ЭлементИсточник.ПометкаУдаления()=1 Тогда
        _НовыйЭлемент.Удалить(0);
    КонецЕсли;
    Если _СоздатьПодчиненные=1 Тогда
        Для _ИндПодч=1 по Метаданные.Справочник() Цикл
            _СпрПодч=Метаданные.Справочник(_ИндПодч);
            Если (ПустаяСтрока(_СпрПодч.Владелец)=0) и (СокрЛП(_СпрПодч.Владелец)<>"Метаданные") Тогда
                Если _НовыйЭлемент.Вид()=_СпрПодч.Владелец.Идентификатор Тогда
                    спрПодч=СоздатьОбъект("Справочник."+_СпрПодч.Идентификатор);
                    спрПодч.ИспользоватьВладельца(_ЭлементИсточник);
                    спрПодч.ВыбратьЭлементы(1);
                    Пока спрПодч.ПолучитьЭлемент()=1 Цикл
                        _Элем=глСоздатьКопиюЭлементаСправочника(спрПодч.ТекущийЭлемент(),_НовыйЭлемент.ТекущийЭлемент(),1);
                    КонецЦикла;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
    Возврат _НовыйЭлемент.ТекущийЭлемент();
КонецФункции
   saslentochka
 
21 - 27.09.21 - 16:20
(18) Его необходимо записать. Но откровенно не понимаю как это сделать.

В процедуре при вводе() передается Родит = ОбъектКопирования
В процедуре при записи() выполняется заполнение подчиненного справочника.
   Volodja
 
22 - 27.09.21 - 16:28
(21) возьмите (20) эта функция сама все сделает
Поместите ее в глобальный модуль
Вызовите ее откуда-нибудь
НовыйЭлемент=глСоздатьКопиюЭлементаСправочника(_ЭлементСКоторогоСнятьКопию)

И будет создан новый со всеми подчиненными
   Volodja
 
23 - 27.09.21 - 16:31
(21) Поместите на форме списка справочника кнопку. Формулу кнопки напишите :

глСоздатьКопиюЭлементаСправочника(ТекущийЭлемент())
   saslentochka
 
24 - 27.09.21 - 16:42
(23) Спасибо большое...)
   Sserj
 
25 - 27.09.21 - 16:44
(23) Что-то я в этой функции не увидел обработки периодических реквизитов. По идее если реквизит периодический то его нужно получать на текущую дату а не просто читать как атрибут.
   Volodja
 
26 - 27.09.21 - 16:48
(25) Верно.
Для универсальности нужно будет подправить
спс
   acanta
 
27 - 27.09.21 - 16:49
ИспользоватьДату()?
   Volodja
 
28 - 27.09.21 - 16:51
(27) тут в общем подойти нужно будет. ИспользоватьДату() не подойдет
Через .Получить(...) и .Установить(...) через чтение Периодического объекта
   Volodja
 
29 - 27.09.21 - 16:53
+(28) чтобы была полная копия, нужно тогда и копию всей истории сделать
   Volodja
 
30 - 27.09.21 - 16:57
+(28) Ошибся. Через 
ВыбратьЗначения() Периодического объекта
 
 
   Sserj
 
31 - 27.09.21 - 17:02
(30) И кстати будет бооольшая и малозаметная ошибка если к примеру будешь так копировать номенклатуру.
Он сделает подчиненные единицы измерения, но основные в самой номенклатуре назначит от исходного объекта.
   Sserj
 
32 - 27.09.21 - 17:04
+(31) А так же это будет с договорами и счетами в контрагентах.
   Volodja
 
33 - 27.09.21 - 17:06
(31) ну да. Точная копия элемента.
   Volodja
 
34 - 27.09.21 - 17:08
(32) или вы хотите сказать, что в реквизитах подчиненного элемента есть реквизит ссылка на владельца?
   Volodja
 
35 - 27.09.21 - 17:09
+(34) тогда да? согласен с (32)
   Volodja
 
36 - 27.09.21 - 17:10
a
35 - 27.09.21 - 17:09
+(34) тогда да. согласен с (32)
   Volodja
 
37 - 27.09.21 - 17:10
тогда да. согласен с (32)
   Volodja
 
38 - 27.09.21 - 17:15
(34) но зачем в реквизитах подчиненного справочника еще реквизит на владельца? Если и так Владелец есть?
   Sserj
 
39 - 27.09.21 - 17:17
(34) Наоборот. В реквизитах Владельца есть ссылка на подчиненные. К примеру Основной договор - ссылка на подчиненный ему же Договора. Или Основной банковский счет - ссылка на подчиненные банковские счета.
В твоей функции эти Основной договор и Основной банковский счет будут ссылаться на подчиненные Источнику копирования. И что там начнется во взаиморасчетах представить несложно.
   Volodja
 
40 - 27.09.21 - 17:18
(39) Понял
   Volodja
 
41 - 27.09.21 - 17:22
(39) использовал эту функцию только в одном справочнике. Там не было периодических и ссылок на подчиненные, поэтому и не заметил.
А так я для договоров и счетов использую галочку "Использовать по умолчанию" и поэтому у меня бы эта ситуация не возникла бы


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.