Помощь - Поиск - Пользователи - Календарь
Полная версия: Запрет на выгрузку документа
1C-PRO - Форум по 1С > Форумы по платформе "1С:Предприятие 8.x" > (8.х) Обмен данными
Виталик
Здравствуйте. Типовой случай: надо чтобы при обмене данными в "филиальную" базу выгружались тоько документы по определенной организации, а все остальные - нет.
В книжках на этот счет советуется: а) при записи документа задать проверку на введенное значение организации и переопределить вручную список узлов, для которых регистриуется изменение объекта. б) в модуле плана обмена добавить процедуру ПриОтправкеДанныхПодчиненному() , в ней задать условия на значение реквизита и для документов, которые не надо выгружать установить:
ОтправкаЭлемента=ОтправкаЭлементаДанных.Удалить
Все вроде просто. Я сегодня попробовал пойти по второму пути(как более простому) и обнаружил что в итоге документ в базу не попадает, а вот все его движения - спокойно переносятся?! sm_razz.gif
Первый случай, как я понимаю, аналогичный - в таблицу изменений нежелательный документ не попадает, а вот все движения его регистрируются и переносятся в другую базу с измерением регистратора "объект не найден". Честно говоря я в небольшом шоке от перехода от теории к практике... Конечно я могу задать условия по отбору организации из регистратора(который входит в основной отбор регистра) для регистров накопления/сведений/бухгалтерии/расчета... но это как-то криво. Проясните пожалуйста : так ли я понял ситуацию, или я просто где-то успел накосячить?! Спасибо.
BabySG
Надо фильтровать еще и все регистры.
Писал такую вещь для УПП - работы на пару часов.
Виталик
Цитата(BabySG @ 25.3.2009, 11:39) *

Надо фильтровать еще и все регистры.
Писал такую вещь для УПП - работы на пару часов.

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


КонецЕсли;
КонецЕсли;
КонецЕсли;

КонецЕсли;
и так для каждого из четырех видов регистров....

Вроде так надо??? У меня УППшка...
BabySG
Идея правильная, но вот реализация подкачала :)

Попробуйте оптимизировать и доработать и все получиться. Если уж совсем плохо - найду код, где я это делал
Виталик
Цитата(BabySG @ 27.3.2009, 13:22) *

Идея правильная, но вот реализация подкачала :)

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

А можно узнать в каких местах реализация подкачала? biggrin.gif Буду весьма признателен, если выложите код ибо обмен у нас с другим городом пока через флешку, чтобы пофиксить один косяк надо его сначало найти, а база УППшная...нигде не могу реальных примеров найти как это работает vis.gif
BabySG
Код
Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза)
Перем УжеУдалили;
Перем ТипЗнчДанных;
Перем ТипОбъекта;

ТипОбъекта = ТипЗнч(ЭлементДанных);

Если мСтарыйТипОбъектаОтправки = ТипОбъекта Тогда
ИмяБазовогоТипа = мИмяСтарогоБазовогоТипа;
Иначе
ИмяБазовогоТипа = мИнформацияОБазовыхТипах.Получить(ТипОбъекта);
Если ИмяБазовогоТипа = Неопределено Тогда
ИмяБазовогоТипа = ПолучитьИмяБазовогоТипаПоТипуОбъекта(ТипОбъекта);
мИнформацияОБазовыхТипах.Вставить(ТипОбъекта, ИмяБазовогоТипа);
КонецЕсли;
мИмяСтарогоБазовогоТипа = ИмяБазовогоТипа;
мСтарыйТипОбъектаОтправки = ТипОбъекта;
КонецЕсли;

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

ИначеЕсли ИмяБазовогоТипа = "Документы" Тогда
// Фильтруем по установленной дате
Если мДокументыБезФильтрацииПоДате[ЭлементДанных.Метаданные().Имя] = Неопределено Тогда
Если ЭлементДанных.Дата < ДатаВыгрузкиДокументов Тогда
ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;
КонецЕсли;
КонецЕсли;
// }} ИмяБазовогоТипа = "Документы"

ИначеЕсли ИмяБазовогоТипа = "РегистрыНакопления" Тогда
Документ = ЭлементДанных.Отбор.Регистратор.Значение;
МетаданныеДокумента = Метаданные.НайтиПоТипу(ТипЗнч(Документ));

Если мДокументыБезФильтрацииПоДате[МетаданныеДокумента.Имя] = Неопределено Тогда
ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;
КонецЕсли;
//ЕстьВСоставеОбмена = мИнформацияОМетаданных.Получить(МетаданныеДокумента);
//Если ЕстьВСоставеОбмена = Неопределено Тогда
// ЕстьВСоставеОбмена = мМетаданныеСоставаПланаОбмена.Содержит(МетаданныеДокумента);
// мИнформацияОМетаданных.Вставить(МетаданныеДокумента, ЕстьВСоставеОбмена);
//КонецЕсли;
//
//Если НЕ ЕстьВСоставеОбмена Тогда
// ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;
//КонецЕсли;
// }} ИмяБазовогоТипа = "РегистрыНакопления"

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

Если РежимРегистра = мПодчинениеРегистратору Тогда
// Посмотрим, что у нас там за регистратор и нужна ли нам запись
Документ = ЭлементДанных.Отбор.Регистратор.Значение;
МетаданныеДокумента = Документ.Метаданные();

Если мДокументыБезФильтрацииПоДате[МетаданныеДокумента.Имя] = Неопределено Тогда
ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;
КонецЕсли;
//ЕстьВСоставеОбмена = мИнформацияОМетаданных.Получить(МетаданныеДокумента);
//Если ЕстьВСоставеОбмена = Неопределено Тогда
// ЕстьВСоставеОбмена = мМетаданныеСоставаПланаОбмена.Содержит(МетаданныеДокумента);
// мИнформацияОМетаданных.Вставить(МетаданныеДокумента, ЕстьВСоставеОбмена);
//КонецЕсли;
//
//Если НЕ ЕстьВСоставеОбмена Тогда
// ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;
//КонецЕсли;
Иначе
// Пороемся во всех измерениях и ресурсах, чтобы отсеять ненужное
Позиция = ЭлементДанных.Количество() - 1;
МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипОбъекта);
Пока Позиция >= 0 Цикл
УжеУдалили = Ложь;
СтрокаНабора = ЭлементДанных[Позиция];

Если НЕ УжеУдалили Тогда
Для каждого Измерение Из МетаданныеОбъекта.Измерения Цикл
СтрокаНабораИмя = СтрокаНабора[Измерение.Имя];
ТипЗнчДанных = ТипЗнч(СтрокаНабораИмя);
Если ТипЗнчДанных <> Тип("Строка") И ТипЗнчДанных <> Тип("Число") И ТипЗнчДанных <> Тип("Дата") И ТипЗнчДанных <> Тип("Булево") И ТипЗнчДанных <> Тип("Неопределено") И ТипЗнчДанных <> Тип("NULL") Тогда

МетаданныеИзмерения = мМетаданныеОбъекта.Получить(СтрокаНабораИмя);
Если МетаданныеИзмерения = Неопределено Тогда
МетаданныеИзмерения = СтрокаНабораИмя.Метаданные();
мМетаданныеОбъекта.Вставить(СтрокаНабораИмя, МетаданныеИзмерения);
КонецЕсли;

ЕстьВСоставеОбмена = мИнформацияОМетаданных.Получить(МетаданныеИзмерения);
Если ЕстьВСоставеОбмена = Неопределено Тогда
Если Найти(МетаданныеИзмерения.ПолноеИмя(),"Документ") > 0 Тогда
ЕстьВСоставеОбмена = (мДокументыБезФильтрацииПоДате[МетаданныеИзмерения.Имя] = Неопределено);
Иначе
ЕстьВСоставеОбмена = мМетаданныеСоставаПланаОбмена.Содержит(МетаданныеИзмерения);
КонецЕсли;
мИнформацияОМетаданных.Вставить(МетаданныеИзмерения, ЕстьВСоставеОбмена);
КонецЕсли;

Если НЕ ЕстьВСоставеОбмена Тогда
УжеУдалили = Истина;
ЭлементДанных.Удалить(Позиция);
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;

Если НЕ УжеУдалили Тогда
Для каждого Ресурс Из МетаданныеОбъекта.Ресурсы Цикл
СтрокаНабораИмя = СтрокаНабора[Ресурс.Имя];
ТипЗнчДанных = ТипЗнч(СтрокаНабораИмя);
Если ТипЗнчДанных <> Тип("Строка") И ТипЗнчДанных <> Тип("Число") И ТипЗнчДанных <> Тип("Дата") И ТипЗнчДанных <> Тип("Булево") И ТипЗнчДанных <> Тип("Неопределено") И ТипЗнчДанных <> Тип("ХранилищеЗначения") И ТипЗнчДанных <> Тип("NULL") Тогда

МетаданныеРесурса = мМетаданныеОбъекта.Получить(СтрокаНабораИмя);
Если МетаданныеРесурса = Неопределено Тогда
МетаданныеРесурса = СтрокаНабораИмя.Метаданные();
мМетаданныеОбъекта.Вставить(СтрокаНабораИмя, МетаданныеРесурса);
КонецЕсли;

ЕстьВСоставеОбмена = мИнформацияОМетаданных.Получить(МетаданныеРесурса);
Если ЕстьВСоставеОбмена = Неопределено Тогда
Если Найти(МетаданныеРесурса.ПолноеИмя(),"Документ") > 0 Тогда
ЕстьВСоставеОбмена = (мДокументыБезФильтрацииПоДате[МетаданныеРесурса.Имя] = Неопределено);
Иначе
ЕстьВСоставеОбмена = мМетаданныеСоставаПланаОбмена.Содержит(МетаданныеРесурса);
КонецЕсли;
мИнформацияОМетаданных.Вставить(МетаданныеРесурса, ЕстьВСоставеОбмена);
КонецЕсли;

Если НЕ ЕстьВСоставеОбмена Тогда
УжеУдалили = Истина;
ЭлементДанных.Удалить(Позиция);
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;

Позиция = Позиция - 1;
КонецЦикла;
КонецЕсли;
// }} ИмяБазовогоТипа = "РегистрыСведений"

ИначеЕсли ИмяБазовогоТипа = "РегистрыБухгалтерии" Тогда
Документ = ЭлементДанных.Отбор.Регистратор.Значение;
МетаданныеДокумента = Документ.Метаданные();

Если мДокументыБезФильтрацииПоДате[МетаданныеДокумента.Имя] = Неопределено Тогда
ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;
КонецЕсли;
//ЕстьВСоставеОбмена = мИнформацияОМетаданных.Получить(МетаданныеДокумента);
//Если ЕстьВСоставеОбмена = Неопределено Тогда
// ЕстьВСоставеОбмена = мМетаданныеСоставаПланаОбмена.Содержит(МетаданныеДокумента);
// мИнформацияОМетаданных.Вставить(МетаданныеДокумента, ЕстьВСоставеОбмена);
//КонецЕсли;
//
//Если НЕ ЕстьВСоставеОбмена Тогда
// ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;
//КонецЕсли;

ИначеЕсли ИмяБазовогоТипа = "РегистрыРасчета" Тогда
// }} ИмяБазовогоТипа = "РегистрыРасчета"
КонецЕсли;
КонецПроцедуры


Но эта процедура была заточена под определенную задачу - но смысл показывает
Виталик
Оооо... blink.gif Есть где разгуляться фантазии!!!!!Спосибо!!!! coin.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2009 Invision Power Services, Inc.