8.х ОБМЕН Запрет на выгрузку документа

Тема в разделе "Обмен данными в "1С:Предприятие 8"", создана пользователем pathetique, 24 мар 2009.

  1. TopicStarter Overlay
    pathetique
    Offline

    pathetique Опытный в 1С

    Регистрация:
    21 янв 2008
    Сообщения:
    105
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте. Типовой случай: надо чтобы при обмене данными в "филиальную" базу выгружались тоько документы по определенной организации, а все остальные - нет.
    В книжках на этот счет советуется: а) при записи документа задать проверку на введенное значение организации и переопределить вручную список узлов, для которых регистриуется изменение объекта. б) в модуле плана обмена добавить процедуру ПриОтправкеДанныхПодчиненному() , в ней задать условия на значение реквизита и для документов, которые не надо выгружать установить:
    ОтправкаЭлемента=ОтправкаЭлементаДанных.Удалить
    Все вроде просто. Я сегодня попробовал пойти по второму пути(как более простому) и обнаружил что в итоге документ в базу не попадает, а вот все его движения - спокойно переносятся?! :unsure:
    Первый случай, как я понимаю, аналогичный - в таблицу изменений нежелательный документ не попадает, а вот все движения его регистрируются и переносятся в другую базу с измерением регистратора "объект не найден". Честно говоря я в небольшом шоке от перехода от теории к практике... Конечно я могу задать условия по отбору организации из регистратора(который входит в основной отбор регистра) для регистров накопления/сведений/бухгалтерии/расчета... но это как-то криво. Проясните пожалуйста : так ли я понял ситуацию, или я просто где-то успел накосячить?! Спасибо.
  2. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Надо фильтровать еще и все регистры.
    Писал такую вещь для УПП - работы на пару часов.
  3. TopicStarter Overlay
    pathetique
    Offline

    pathetique Опытный в 1С

    Регистрация:
    21 янв 2008
    Сообщения:
    105
    Симпатии:
    0
    Баллы:
    26
    а где там работы на пару часоф?
    у меня для каждого регистра идет проверка в процедуре ПриОтправкеДанныхПодчиненному() вида
    Код:
    	 Если Метаданные.РегистрыНакопления.Содержит(ЭлементДанных.Метаданные()) тогда
    Если  ЭлементДанных.Отбор.Найти("Регистратор")<> Неопределено тогда
    Если  ЭлементДанных.Отбор.Регистратор.Значение.Метаданные().Реквизиты.Найти("Организация")<> неопределено тогда
    Если ЭлементДанных.Отбор.Регистратор.Значение.Организация<>Справочники.Организации.НайтиПоКоду("80000000 ") тогда 
    ОтправкаЭлемента=ОтправкаЭлементаДанных.Удалить;
    
    
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    
    КонецЕсли; 
    
    и так для каждого из четырех видов регистров....

    Вроде так надо??? У меня УППшка...
  4. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Идея правильная, но вот реализация подкачала :)

    Попробуйте оптимизировать и доработать и все получиться. Если уж совсем плохо - найду код, где я это делал
  5. TopicStarter Overlay
    pathetique
    Offline

    pathetique Опытный в 1С

    Регистрация:
    21 янв 2008
    Сообщения:
    105
    Симпатии:
    0
    Баллы:
    26
    А можно узнать в каких местах реализация подкачала? :smile: Буду весьма признателен, если выложите код ибо обмен у нас с другим городом пока через флешку, чтобы пофиксить один косяк надо его сначало найти, а база УППшная...нигде не могу реальных примеров найти как это работает :unsure:
  6. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Код:
    Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза)
    Перем УжеУдалили;
    Перем ТипЗнчДанных;
    Перем ТипОбъекта;
    
    ТипОбъекта = ТипЗнч(ЭлементДанных);
    
    Если мСтарыйТипОбъектаОтправки = ТипОбъекта Тогда
    ИмяБазовогоТипа = мИмяСтарогоБазовогоТипа;
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/иначе')">	Иначе	</span>
    ИмяБазовогоТипа = мИнформацияОБазовыхТипах.Получить(ТипОбъекта);
    Если ИмяБазовогоТипа = Неопределено Тогда
    ИмяБазовогоТипа = ПолучитьИмяБазовогоТипаПоТипуОбъекта(ТипОбъекта);
    мИнформацияОБазовыхТипах.Вставить(ТипОбъекта, ИмяБазовогоТипа);
    КонецЕсли;
    мИмяСтарогоБазовогоТипа = ИмяБазовогоТипа;
    мСтарыйТипОбъектаОтправки = ТипОбъекта;
    КонецЕсли;
    
    Если ИмяБазовогоТипа = "Справочники" Тогда
    // }} ИмяБазовогоТипа = "Справочники" 
    
    ИначеЕсли ИмяБазовогоТипа = "Документы" Тогда
    // Фильтруем по установленной дате
    Если мДокументыБезФильтрацииПоДате[ЭлементДанных.Метаданные().Имя] = Неопределено Тогда
    Если ЭлементДанных.Дата < ДатаВыгрузкиДокументов Тогда
    ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;				
    КонецЕсли; 						
    КонецЕсли; 
    // }} ИмяБазовогоТипа = "Документы" 
    
    ИначеЕсли ИмяБазовогоТипа = "РегистрыНакопления" Тогда
    Документ = ЭлементДанных.Отбор.Регистратор.Значение;
    МетаданныеДокумента = Метаданные.НайтиПоТипу(ТипЗнч(Документ));
    
    Если мДокументыБезФильтрацииПоДате[МетаданныеДокумента.Имя] = Неопределено Тогда
    ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;	
    КонецЕсли; 
    //ЕстьВСоставеОбмена = мИнформацияОМетаданных.Получить(МетаданныеДокумента);
    //Если ЕстьВСоставеОбмена = Неопределено Тогда
    //	ЕстьВСоставеОбмена = мМетаданныеСоставаПланаОбмена.Содержит(МетаданныеДокумента);
    //	мИнформацияОМетаданных.Вставить(МетаданныеДокумента, ЕстьВСоставеОбмена);
    //КонецЕсли; 
    //
    //Если НЕ ЕстьВСоставеОбмена Тогда
    //	ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;	
    //КонецЕсли; 
    // }} ИмяБазовогоТипа = "РегистрыНакопления"
    
    ИначеЕсли ИмяБазовогоТипа = "РегистрыСведений" Тогда
    РежимРегистра = мРежимЗаписиРегистра.Получить(ТипОбъекта);
    Если РежимРегистра = Неопределено Тогда
    РежимРегистра = Метаданные.НайтиПоТипу(ТипОбъекта).РежимЗаписи;
    мРежимЗаписиРегистра.Вставить(ТипОбъекта, РежимРегистра);
    КонецЕсли; 
    
    Если РежимРегистра = мПодчинениеРегистратору Тогда
    // Посмотрим, что у нас там за регистратор и нужна ли нам запись		
    Документ = ЭлементДанных.Отбор.Регистратор.Значение;
    МетаданныеДокумента = Документ.Метаданные();
    
    Если мДокументыБезФильтрацииПоДате[МетаданныеДокумента.Имя] = Неопределено Тогда
    ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;	
    КонецЕсли;
    //ЕстьВСоставеОбмена = мИнформацияОМетаданных.Получить(МетаданныеДокумента);
    //Если ЕстьВСоставеОбмена = Неопределено Тогда
    //	ЕстьВСоставеОбмена = мМетаданныеСоставаПланаОбмена.Содержит(МетаданныеДокумента);
    //	мИнформацияОМетаданных.Вставить(МетаданныеДокумента, ЕстьВСоставеОбмена);
    //КонецЕсли;
    //
    //Если НЕ ЕстьВСоставеОбмена Тогда
    //	ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;					
    //КонецЕсли; 
    Иначе
    // Пороемся во всех измерениях и ресурсах, чтобы отсеять ненужное
    Позиция = ЭлементДанных.Количество() - 1;
    МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипОбъекта);
    Пока Позиция >= 0 Цикл
    УжеУдалили = Ложь;
    СтрокаНабора = ЭлементДанных[Позиция];
    
    Если НЕ УжеУдалили Тогда
    Для каждого Измерение Из МетаданныеОбъекта.Измерения Цикл
    СтрокаНабораИмя = СтрокаНабора[Измерение.Имя]; 
    ТипЗнчДанных = ТипЗнч(СтрокаНабораИмя);
    Если ТипЗнчДанных <> Тип("Строка") И ТипЗнчДанных <> Тип("Число") И ТипЗнчДанных <> Тип("Дата") И ТипЗнчДанных <> Тип("Булево") И ТипЗнчДанных <> Тип("Неопределено") И ТипЗнчДанных <> Тип("NULL") Тогда
    
    МетаданныеИзмерения = мМетаданныеОбъекта.Получить(СтрокаНабораИмя);
    Если МетаданныеИзмерения = Неопределено Тогда
    МетаданныеИзмерения = СтрокаНабораИмя.Метаданные();
    мМетаданныеОбъекта.Вставить(СтрокаНабораИмя, МетаданныеИзмерения);
    КонецЕсли;
    
    ЕстьВСоставеОбмена = мИнформацияОМетаданных.Получить(МетаданныеИзмерения);
    Если ЕстьВСоставеОбмена = Неопределено Тогда
    Если Найти(МетаданныеИзмерения.ПолноеИмя(),"Документ") > 0 Тогда
    ЕстьВСоставеОбмена = (мДокументыБезФильтрацииПоДате[МетаданныеИзмерения.Имя] = Неопределено);										
    Иначе
    ЕстьВСоставеОбмена = мМетаданныеСоставаПланаОбмена.Содержит(МетаданныеИзмерения);
    КонецЕсли; 
    мИнформацияОМетаданных.Вставить(МетаданныеИзмерения, ЕстьВСоставеОбмена);
    КонецЕсли;
    
    Если НЕ ЕстьВСоставеОбмена Тогда
    УжеУдалили = Истина;
    ЭлементДанных.Удалить(Позиция);
    Прервать;
    КонецЕсли; 						
    КонецЕсли; 		
    КонецЦикла; 
    КонецЕсли;
    
    Если НЕ УжеУдалили Тогда
    Для каждого Ресурс Из МетаданныеОбъекта.Ресурсы Цикл
    СтрокаНабораИмя = СтрокаНабора[Ресурс.Имя]; 
    ТипЗнчДанных = ТипЗнч(СтрокаНабораИмя);
    Если ТипЗнчДанных <> Тип("Строка") И ТипЗнчДанных <> Тип("Число") И ТипЗнчДанных <> Тип("Дата") И ТипЗнчДанных <> Тип("Булево") И  ТипЗнчДанных <> Тип("Неопределено") И ТипЗнчДанных <> Тип("ХранилищеЗначения") И ТипЗнчДанных <> Тип("NULL") <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/тогда')">Тогда							</span>
    
    МетаданныеРесурса = мМетаданныеОбъекта.Получить(СтрокаНабораИмя);
    Если МетаданныеРесурса = Неопределено Тогда
    МетаданныеРесурса = СтрокаНабораИмя.Метаданные();
    мМетаданныеОбъекта.Вставить(СтрокаНабораИмя, МетаданныеРесурса);
    КонецЕсли; 
    
    ЕстьВСоставеОбмена = мИнформацияОМетаданных.Получить(МетаданныеРесурса);
    Если ЕстьВСоставеОбмена = Неопределено Тогда
    Если Найти(МетаданныеРесурса.ПолноеИмя(),"Документ") > 0 Тогда
    ЕстьВСоставеОбмена = (мДокументыБезФильтрацииПоДате[МетаданныеРесурса.Имя] = Неопределено);										
    Иначе
    ЕстьВСоставеОбмена = мМетаданныеСоставаПланаОбмена.Содержит(МетаданныеРесурса);
    КонецЕсли; 
    мИнформацияОМетаданных.Вставить(МетаданныеРесурса, ЕстьВСоставеОбмена);
    КонецЕсли;
    
    Если НЕ ЕстьВСоставеОбмена Тогда
    УжеУдалили = Истина;
    ЭлементДанных.Удалить(Позиция);
    Прервать;
    КонецЕсли;
    КонецЕсли; 		
    КонецЦикла; 					
    КонецЕсли; 
    
    Позиция = Позиция - 1;
    КонецЦикла;	
    КонецЕсли; 
    // }} ИмяБазовогоТипа = "РегистрыСведений"
    
    ИначеЕсли ИмяБазовогоТипа = "РегистрыБухгалтерии" Тогда
    Документ = ЭлементДанных.Отбор.Регистратор.Значение;
    МетаданныеДокумента = Документ.Метаданные();
    
    Если мДокументыБезФильтрацииПоДате[МетаданныеДокумента.Имя] = Неопределено Тогда
    ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;	
    КонецЕсли;
    //ЕстьВСоставеОбмена = мИнформацияОМетаданных.Получить(МетаданныеДокумента);
    //Если ЕстьВСоставеОбмена = Неопределено Тогда
    //	ЕстьВСоставеОбмена = мМетаданныеСоставаПланаОбмена.Содержит(МетаданныеДокумента);
    //	мИнформацияОМетаданных.Вставить(МетаданныеДокумента, ЕстьВСоставеОбмена);
    //КонецЕсли;
    //
    //Если НЕ ЕстьВСоставеОбмена Тогда
    //	ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;	
    //КонецЕсли; 
    
    ИначеЕсли ИмяБазовогоТипа = "РегистрыРасчета" Тогда
    // }} ИмяБазовогоТипа = "РегистрыРасчета"
    КонецЕсли;	
    КонецПроцедуры
    
    Но эта процедура была заточена под определенную задачу - но смысл показывает
  7. TopicStarter Overlay
    pathetique
    Offline

    pathetique Опытный в 1С

    Регистрация:
    21 янв 2008
    Сообщения:
    105
    Симпатии:
    0
    Баллы:
    26
    Оооо... :unsure: Есть где разгуляться фантазии!!!!!Спосибо!!!! :smile:
  8. Diversant
    Offline

    Diversant

    Регистрация:
    19 авг 2009
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    а что означают мИнформацияОБазовыхТипах и прочие с буквой "м"?
    это процедуры? :unsure:
  9. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Это переменные уровня модуля.
    Код:
    мИнформацияОБазовыхТипах = Новый Соответствие;
    
    Если будет время - выложу подробное описание работы механизма

Поделиться этой страницей