Имя: Пароль:
1C
1С v8
Событие "Перед выгрузкой объекта" в конвертации данных
,
0 Nikama
 
12.08.13
10:43
Добрый день. Пишу простейшие правила конвертации для самописной конфигурации.
В процедуре "Перед выгрузкой объекта" пишу код.

Проблема в том, что этот код действует только на часть объектов.

Надо писать в цикле или все-таки данное событие действует на каждый объект?
1 zak555
 
12.08.13
10:44
> Проблема в том, что этот код действует только на часть объектов.


на какие именно ?
и код покажи
2 Godofsin
 
12.08.13
10:45
обожди, ща мы подключим свои мегавселеннские способности, чтоб увидеть твой код
3 Nikama
 
12.08.13
10:45
) как код правильно вставить?

Основной = Ложь;
Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Объект)) Тогда
    
    Для Каждого ТЧ Из Объект.Метаданные().ТабличныеЧасти Цикл
        НайдОсн = Ложь;
        
        Если НЕ ТЧ.Реквизиты.Найти("Основной") = Неопределено Тогда
            НайдОсн = Истина;
        Иначе
            Продолжить;
        КонецЕсли;    
        
        Если НайдОсн Тогда
            Для Каждого СтрТЧ Из Объект[ТЧ.Имя] Цикл
                Если СтрТЧ.Основной Тогда
                    Основной = Истина;
                    Прервать;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
        
    КонецЦикла;

    Если Основной Тогда
        Отказ = Истина;
    КонецЕсли;
    
ИначеЕсли Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Объект)) Тогда

    МетаданныеОбъекта = Объект.Метаданные();
    НайдОсн = Ложь;
    Если МетаданныеОбъекта.Реквизиты.Найти("Основной") = Неопределено Тогда        

        ОбщиеРеквизиты = Метаданные.ОбщиеРеквизиты;                                      
        Если ОбщиеРеквизиты.Найти("Основной")= Неопределено Тогда
            НайдОсн = Ложь;
        Иначе
            ТекСоставОбщегоРеквизита = ОбщиеРеквизиты["Основной"].Состав;
            Если ТекСоставОбщегоРеквизита.Найти(МетаданныеОбъекта).Использование = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита.Использовать Тогда
                НайдОсн = Истина;
            Иначе
                НайдОсн = Ложь;  
            КонецЕсли;        
        КонецЕсли;
        
    Иначе
        НайдОсн = Истина;
    КонецЕсли;
    
    Если НайдОсн Тогда

        Если Объект.Основной Тогда
               Отказ = Истина;      
        КонецЕсли;
        
    КонецЕсли;


КонецЕсли;
4 Nikama
 
12.08.13
10:49
(1) Такое ощущение, что на первые по номеру этот код не действует.
Меня где не туда унесло?
Я с КД первый раз пытаюсь работать.
5 Godofsin
 
12.08.13
10:56
(4) Сакральный смысл сего кода? Отсеять справочники и документы с реквизитом основной?
6 Nikama
 
12.08.13
10:57
(5) с реквизитом Основной в значении "Истина"
7 hhhh
 
12.08.13
11:01
(6) но ведь это же будет дико тормозить, если ты в каждом объекте будешь такую огромную дуру выполнять. Нафига это может понадобиться, такая бредовая проверка?
8 Nikama
 
12.08.13
11:02
(7)Желание заказчика.
Проверять надо в любом случае
9 hhhh
 
12.08.13
11:04
(8) так заказчик вас пристрелит. Ну нельзя же так тупо желания выполнять.
10 Nikama
 
12.08.13
11:06
(9) Тогда заказчику предварительно придется пристрелить тех, кто писал его конфу до меня.

Вы лучше скажите, где в коде ошибка...
11 Godofsin
 
12.08.13
11:15
(10) Да хз. Отладчик ничего не говорит?
12 Nikama
 
12.08.13
11:17
(11) молчит. При этом вроде отрабатывает сия конструкция на части объектов базы, а на второй части нет
13 Aleksey
 
12.08.13
11:21
Универсальность - зло
14 Nikama
 
12.08.13
11:22
(13) зло - это комменты в стиле "лишь бы написать, для рейтингу"
15 be-may
 
12.08.13
11:31
(14) а если попробовать принудительно перед началом проверки
Отказ = Ложь; ?
16 Nikama
 
12.08.13
11:44
(15) а что это даст? Отказ вроде стандартно идет ложь или я не права?
17 Aleksey
 
12.08.13
11:55
(14) ну почему? Ты для чего эту простыню написал? для универсальности. что тебе мешает в кокретном ПВД или ПКС прописать конкретный код?
18 Nikama
 
12.08.13
11:59
(17) здесь должен быть очень смущенный смайл. Я ж пишу, что первый раз с КД работаю.
То, что написала для объектов вообще не отрабатывает.
19 be-may
 
12.08.13
12:16
(16) подумалось, что может кэшируется..

(18) для первого раза оч. круто
Я бы что сделала. Нашла бы справочник или документ, которые не грузится или не грузится весь. Тот код, что выше, положила бы в ПКО Перед выгрузкой (только без универсальности) и отладчиком бы выловила те объекты, которые не выгружаются.И смотрела бы что с ними так/не так.
20 hhhh
 
12.08.13
12:19
(18) вообще делается просто. Если уж так хочет заказчик, надо во все справочники и документы добавить реквизит "Основной".

Тогда ваша программа примет вид

Отказ = Объект.Основной;

Всё.
Зачем себе лишней работы прибавлять? Её и так полно.
21 hhhh
 
12.08.13
12:19
и тормозить не будет, и все будут довольны.
22 Godofsin
 
12.08.13
12:20
(20) Гениально!
23 Nikama
 
12.08.13
12:22
(20) А чем использование общего реквизита плохо?
И зачем нужен "геммор" (простите за мой французский) с добавлением кучи реквизитов? А вдруг у меня в конфе 1000 объектов?
24 Alex S D
 
12.08.13
12:28
срабатывает не для всех объектов потому что для объектов выгружаемых по ссылке данный обработчик не вызывается
25 Nikama
 
12.08.13
12:30
(24) так, а теперь для тех "кто в первый раз" - поподробнее, что значит по ссылке?
26 Alex S D
 
12.08.13
12:31
(25) Ну допустим выгружается документ. По ссылке из документа выгружаются контрагенты и номенклатура
27 Nikama
 
12.08.13
12:33
(26)ок. А как сделать так, чтобы для всех действовало?
28 Alex S D
 
12.08.13
12:35
(27) да сделать то можно , это делается в аналогичном обработчике ПКО, но смысл какой? По ссылке должны быть по идее выгружены все объекты, иначе ссылка пустая будет
29 Nikama
 
12.08.13
12:39
(28) хорошо. Тогда поставим вопрос по другому. Мне нужно перенести все данные из объектов справочники/документы, для которых реквизит "Основной" = Ложь.

Это правилами можно сделать или нет?
30 Абыр
 
12.08.13
12:41
(30) Можно
31 Alex S D
 
12.08.13
12:42
(29) Можно, но вот глобального обработчика вроде нет. Придется в каждом объекте прописывать
32 Абыр
 
12.08.13
12:42
+(24) Можно использовать глобальное
"Перед конвертацией объекта", только там уже не Объект будет, а Источник
33 Nikama
 
12.08.13
12:43
(32) Где ж Вы раньше были. Я с объектом бьюсь второй день.
Спасибо!

(31) Спасибо!
34 Alex S D
 
12.08.13
12:44
(32) о , точно
35 Nikama
 
12.08.13
19:33
Возник новый вопрос.

При выгрузке документов, переносятся строки. Если в строках есть тип справочник (тот, у которого значение основной = истина), то данное значение не заполняется.

В ПКО для справочника добавила "Перед выгрузкой" Отказ = Источник.Основной
36 Nikama
 
12.08.13
19:41
ну хоть кто-нибудь. Очень-очень надо
37 hhhh
 
12.08.13
20:02
наверно ПриВыгрузке
38 Nikama
 
12.08.13
20:07
(37) можете чуть поподробнее объяснить - почему при выгрузке будет правильно отрабатывать?
39 Абыр
 
13.08.13
09:20
(35) Ну так и должно быть. У вас в ПКС реквизита ТЧ документа указано соответствующее ПКО. Перед обработкой ПКО, если вы завели код в глобальный обработчик "Перед конвертацией объекта", проверяется конвертируемое значение (в данном случае, элемент справочника) по вашим условиям и, так как "основной = истина" у конвертируемого значения, то оно не выгружается, в приемнике реквизит заполнен не будет.
Вы вроде это и хотели, нет?)
Определитесь: если у вас не должны выгружаться объекты с "основной = истина" только по ПВД, то проверку помещаете в глобальный обработчик "Перед выгрузкой объекта". В этом случае будут выгружены объекты с "основной = истина" по ссылкам. Если объекты с "основной = истина" не должны выгружаться вообще, то проверку производите в глобальном "Перед конвертацией объекта".
40 Nikama
 
13.08.13
15:05
(39) хорошо. Этот момент понятен. Теперь вопрос - как отследить изменение выгружаемых объектов, даже если они с признаком основной?
41 Nikama
 
13.08.13
15:50
Еще раз сформулирую задачу:
Надо выгрузить все объекты, у которых свойство Основной = Ложь, а также все объекты, которые были изменены.

Например, есть справочник "Контрагенты", элемент "Рога и копыта". Основной = Истина. Но поменяли адрес. Значит данный элемент во второй базе надо заменить.
42 Абыр
 
13.08.13
16:40
(41) По поводу измененный/не измененный используйте планы обмена.
Только и в этом случае, если будете контролировать в глобальном "Перед конвертацией объекта", у вас не будут выгружаться по ссылкам объекты с "основной=истина", по которым не было зарегистрировано изменений.