Имя: Пароль:
1C
1С v8
Алгоритм плана обмена.
0 antihacker
 
05.06.15
12:32
Всем привет ! Надо изменить алгоритм плана обмена. Например не передовать конфеденциальные данные филиальным базам.
Копаясь в паланах обмена нашел что в процедуре

ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента)

Можнро вроде что то сделать. Помогите как ?

Например

Код

    Если ИмяБазовогоТипа="Справочники" Тогда
    
        сообщить(ЭлементДанных);
        
    КонецЕсли;
Показывает что значение ЭлементДанных содепржит имена контрагентов. Можно здесь как то убрать не нужных контрагентов ?


Платформа 8,2 и конфига 2,0

Спасибо !
1 Lama12
 
05.06.15
12:43
(0) Посмотри как БСП реализовано.
2 antihacker
 
05.06.15
12:54
Спасибо. Думаю как то так.

    Если ИмяБазовогоТипа="Справочники" Тогда
        
         Если Не ЭтоНужныйОбъект Тогда
         ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;
         КонецЕсли;

        
    КонецЕсли;
3 antihacker
 
05.06.15
13:06
Одна проблема. Раз не передаем не нужных элментов, то и не нужно передовать все связанные элементы.

А какие есть объкты связанные с контрагентами ? Пмомгите заполнить список.

1) Контргаент(справочник)
2) Договоры контрганетов(справочник)
3) Контакты контргаентов(справочник)

итд
...
4 Повелитель
 
05.06.15
13:28
Может тупо RLS в филиалах настроить?
5 0wl
 
05.06.15
13:33
(2)
" ОтправкаЭлементаДанных.Удалить;"

ты тут сейчас понаотправляешь. Посмотри в "Профессиональной разработке в 1С:Предприятие", там подробно механизм обмена расписан.
6 antihacker
 
05.06.15
13:38
По твоему где это я применяю ? Это типовая конфига.
А что такое RLS ?
7 Повелитель
 
05.06.15
14:21
(6) Ограничение на уровне записей.
То есть обмен будет такой же как и сейчас.
А вот данные пользователи будут видеть только те которые вы разрешите.
8 antihacker
 
05.06.15
16:46
Зачем скрывать ? Просто не надо отправлять
9 and2
 
05.06.15
16:48
почисти после получения данных.
10 fisher
 
05.06.15
16:51
ПриОтправкеДанныхПодчиненному() - плохо.
Это будет замедлять выгрузку пропорционально количеству данных и баз.
Правильно - формировать список баз-получателей при записи объектов.
11 antihacker
 
05.06.15
16:57
Ребята здесь видно что объект справочник

Если ИмяБазовогоТипа="Справочники" Тогда

Но как узнать какой справочник ? Кто нить разбирал этот модуль ?
12 antihacker
 
05.06.15
17:06
Мы знаем значение ЭлементДанных. Может как то можно узнать к какому справочнику относиться ?
13 olegves
 
05.06.15
17:42
(0) а подправить напильником в КД правила обмена не хочешь?
14 dmpl
 
05.06.15
20:28
(0) План обмена - просто механизм регистрации изменений. Дальше алгоритм может быть любым (а поскольку о том, какой именно план обмена и какая конфигурация молчок, то исходим из общих предположений). Соответственно, оптимально будет отключить авторегистрацию у нужных объектов и добавлять их регистрацию в подписке на событие при записи, например.

А можно написать свою выгрузку - тоже вариант, особенно учитывая что это может быть внешняя обработка и не потребуется менять конфигурацию.

(12) Метод Метаданные() у него есть?
15 antihacker
 
08.06.15
09:02
И так. Дпиоивая копаю и изучаю. Вроде работает.

    Если ИмяБазовогоТипа="Справочники" И СокрЛП(ТипЗнч(ЭлементДанных))="Справочник объект: Контрагенты" Тогда
    ЭлементНужен=ЛОЖЬ;

    //----Фильтр по контрагентам-------------------------
    Для Каждого Организация ИЗ ЭтотОбъект.Организации Цикл
        
      Если ЭлементНужен=ЛОЖЬ Тогда           
        ЗапросФильтра= Новый Запрос;
    
        ЗапросФильтра.Текст="ВЫБРАТЬ
        | РТТКонтрагента.ТТ КАК ТТ
        | ИЗ Справочник.Контрагенты.РТТ  КАК РТТКонтрагента ГДЕ РТТКонтрагента.ТТ=&ТТ И РТТКонтрагента.Ссылка=&Контрагент "; //     
        
          ЗапросФильтра.УстановитьПараметр("ТТ",Организация.Организация);
          ЗапросФильтра.УстановитьПараметр("Контрагент",ЭлементДанных.Ссылка);
    
          Если ЗапросФильтра.Выполнить().Выбрать().Количество()=0 Тогда
          ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;
          ЭлементНужен=Ложь; сообщить(ЭлементДанных);
          Иначе
          ЭлементНужен=ИСТИНА;
          КонецЕсли;
      
      КонецЕсли;    
   КонецЦикла;
    
   КонецЕсли;

Только одна проблема. Если контргаент лежит в папке, то передает отправляет контрагента без папки. По этому у дочерной базы падает в самы верхний корневую. Как передать туда с иерархией ?
16 antihacker
 
08.06.15
09:04
Как мне стыдно за грамматику )) Случайно нажал на отпрвку )
17 dmpl
 
08.06.15
09:52
(16) Тут не за грамматику должно быть стыдно. Стыдно, товарищ, сравнивать результат ТипЗнч() со строкой. Тип() для кого придумали? 1С за это уже наказывала. Ну и классика - запрос в цикле.
18 antihacker
 
08.06.15
11:05
dmpl , цикл я поставил временно что бы кое что проверить. А так знаю , что надо передовать в зпрос все списки через список знаяения. Ты бы лучше писал по сути. Не это главное.
19 antihacker
 
08.06.15
12:10
dmpl, вот исправил ))

Если ИмяБазовогоТипа="Справочники" И ТипЗнч(ЭлементДанных.Ссылка)=Тип("СправочникСсылка.Контрагенты")
20 SUA
 
08.06.15
12:14
(15)>>передает отправляет контрагента без папки
ну это как написано
21 antihacker
 
08.06.15
12:19
SUA, вот и не получаеться проверить тип на группу. По этому пропускает только элементы справочника. А группы нет.
22 antihacker
 
08.06.15
13:58
И так тема закрыта.  Если кто решил создать обмен по организациям ,то может быть так что у каждой организации свои контрагенты. А стандартный не фильтрирует. П о этому у контргаента создайте табличную часть РТТ а там реквизит ТТ с сылкой на справочник - "Организции". Откройте модуль обмеа по организациям и найдите процедуру ПриОтправкеДанныхПодчиненному() и добавить этот код

    Если ИмяБазовогоТипа="Справочники" И ТипЗнч(ЭлементДанных.Ссылка)=Тип("СправочникСсылка.Контрагенты")  Тогда //И ТипЗнч(ЭлементДанных) <>  Тип("Группа")
    ЭлементНужен=ЛОЖЬ;
  
    //----Фильтр по контрагентам-------------------------
    Для Каждого Организация ИЗ ЭтотОбъект.Организации Цикл
        
      Если ЭлементНужен=ЛОЖЬ Тогда           
        ЗапросФильтра= Новый Запрос;
    
        ЗапросФильтра.Текст="ВЫБРАТЬ
        | РТТКонтрагента.ТТ КАК ТТ
        | ИЗ Справочник.Контрагенты.РТТ  КАК РТТКонтрагента ГДЕ РТТКонтрагента.ТТ=&ТТ И РТТКонтрагента.Ссылка В ИЕРАРХИИ (&Контрагент) ";     
        
          ЗапросФильтра.УстановитьПараметр("ТТ",Организация.Организация);
          ЗапросФильтра.УстановитьПараметр("Контрагент",ЭлементДанных.Ссылка);
    
          Если ЗапросФильтра.Выполнить().Выбрать().Количество()=0 Тогда
          ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;
          ЭлементНужен=Ложь; сообщить(ЭлементДанных);
          Иначе
          ЭлементНужен=ИСТИНА;
          КонецЕсли;
      
      КонецЕсли;    
   КонецЦикла;
    
   КонецЕсли;


Спасибо всем.
23 antihacker
 
08.06.15
13:59
Если ИмяБазовогоТипа="Справочники" И ТипЗнч(ЭлементДанных.Ссылка)=Тип("СправочникСсылка.Контрагенты")  Тогда
    ЭлементНужен=ЛОЖЬ;
  

    Для Каждого Организация ИЗ ЭтотОбъект.Организации Цикл
        
      Если ЭлементНужен=ЛОЖЬ Тогда           
        ЗапросФильтра= Новый Запрос;
    
        ЗапросФильтра.Текст="ВЫБРАТЬ
        | РТТКонтрагента.ТТ КАК ТТ
        | ИЗ Справочник.Контрагенты.РТТ  КАК РТТКонтрагента ГДЕ РТТКонтрагента.ТТ=&ТТ И РТТКонтрагента.Ссылка В ИЕРАРХИИ (&Контрагент) ";     
        
          ЗапросФильтра.УстановитьПараметр("ТТ",Организация.Организация);
          ЗапросФильтра.УстановитьПараметр("Контрагент",ЭлементДанных.Ссылка);
    
          Если ЗапросФильтра.Выполнить().Выбрать().Количество()=0 Тогда
          ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;
          ЭлементНужен=Ложь; сообщить(ЭлементДанных);
          Иначе
          ЭлементНужен=ИСТИНА;
          КонецЕсли;
      
      КонецЕсли;    
   КонецЦикла;
    
   КонецЕсли;