![]() |
![]() |
![]() |
|
РИБ : как можно в модуле обмена достучатся в регистрах. накопл. до измерений | ☑ | ||
---|---|---|---|---|
0
Genri
09.09.09
✎
17:24
|
РИБ : как можно в модуля обмена достучатся в регистрах. накопл. до измерений.В процедуре ПриОтправкеДанныхПодчиненному.
|
|||
1
mikecool
09.09.09
✎
17:34
|
ничё не понял
|
|||
2
Genri
09.09.09
✎
17:50
|
Мне нужно отфильтровать данные при обмене.
Сейчас я пытаюсь отфильтровать регистры накопления, чтоб лишние данные не кочевали из одного филиала в другой. Так вот я немогу достучатся в регистрах до измерений.(склад,организация,....) |
|||
3
mikecool
09.09.09
✎
17:53
|
(2) в поиск
не надо фильтровать данные в ПриОтправке/Получении - это очень медленно и будут "хвосты" зависать... регистрируй изменения только для нужных узлов |
|||
4
Genri
09.09.09
✎
17:58
|
В поиске ничего не нашал (может плохо искал).
В регистрируй изменения только для нужных узлов. Это как ? Покажи путь. |
|||
6
maxar
09.09.09
✎
18:04
|
модуль набора записей
перед записью регистрируй изменения только для нужных узлов |
|||
7
mikecool
09.09.09
✎
18:05
|
Процедура ПриЗаписиРННаборЗаписейПриЗаписи(Источник, Отказ, Замещение) Экспорт
// регистрируем изменения регистров накопления, бухгалтерии, расчетов Если Отказ Тогда Источник.ОбменДанными.Получатели.Очистить(); Источник.ОбменДанными.Получатели.Автозаполнение = Ложь; Возврат; КонецЕсли; Если (Источник.ОбменДанными.Загрузка) Тогда Источник.ОбменДанными.Получатели.Очистить(); Источник.ОбменДанными.Получатели.Автозаполнение = Ложь; Возврат; КонецЕсли; Если не Метаданные.ПланыОбмена.Полный.Состав.Содержит(Источник.Метаданные()) Тогда возврат; КонецЕсли; МассивУзлов = ОбработкаСобытий.ПолучитьМассивУзловПоОрганизацииИзДокумента(Источник.Отбор.Регистратор.Значение); Если МассивУзлов.Количество()>0 Тогда Источник.ОбменДанными.Получатели.Очистить(); Источник.ОбменДанными.Получатели.Автозаполнение = Ложь; Для Каждого Значение Из МассивУзлов Цикл Источник.ОбменДанными.Получатели.Добавить(Значение); КонецЦикла; КонецЕсли; // а это система должна сделать сама //ПланыОбмена.ЗарегистрироватьИзменения(МассивУзлов, Источник); КонецПроцедуры Процедура ПриЗаписиРСНаборЗаписейПриЗаписи(Источник, Отказ, Замещение) Экспорт Если Отказ Тогда Источник.ОбменДанными.Получатели.Очистить(); Источник.ОбменДанными.Получатели.Автозаполнение = Ложь; Возврат; КонецЕсли; ИсточникМетаданные = Источник.Метаданные(); Отправитель = Неопределено; Если (Источник.ОбменДанными.Загрузка) И Не ПараметрыСеанса.ЕстьПодчиненныеУзлы Тогда Источник.ОбменДанными.Получатели.Очистить(); Источник.ОбменДанными.Получатели.Автозаполнение = Ложь; Возврат; Иначе Отправитель = Источник.ОбменДанными.Отправитель; КонецЕсли; Если НЕ Метаданные.ПланыОбмена.Полный.Состав.Содержит(ИсточникМетаданные) Тогда Возврат; КонецЕсли; Источник.ОбменДанными.Получатели.Очистить(); Источник.ОбменДанными.Получатели.Автозаполнение = Ложь; МассивУзлов = новый массив; Если ИсточникМетаданные.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый Тогда //посмотрим содержание организации по измерениям //НаличиеДокумента = ИсточникМетаданные.Измерения.НайтиПоТипу(Документы.ТипВсеСсылки()); НаличиеОрганизации = (ИсточникМетаданные.Измерения.Найти("Организация") <> Неопределено); Если НаличиеОрганизации Тогда Организация = Источник.Отбор.Найти("Организация").Значение; МассивУзлов = ОбработкаСобытий.ПолучитьМассивУзловПоОрганизацииИзДокумента(Организация, Отправитель); Иначе Для х = 0 по источник.отбор.количество() - 1 цикл Если Источник.отбор[х].значение = неопределено или не документы.типвсессылки().содержитТип(типзнч(Источник.отбор[х].значение)) Тогда продолжить; КонецЕсли; Если не Источник.отбор[х].значение.метаданные().реквизиты.найти("Организация") = неопределено Тогда МассивУзлов = ОбработкаСобытий.ПолучитьМассивУзловПоОрганизацииИзДокумента(Источник.отбор[х].значение.организация, Отправитель); конецЕсли; конеццикла; Если МассивУзлов.Количество() <= 0 Тогда МассивУзлов = ОбработкаСобытий.ПолучитьМассивУзловПоОрганизацииИзДокумента(Неопределено, Отправитель); КонецЕсли; КонецЕсли; Иначе МассивУзлов = ОбработкаСобытий.ПолучитьМассивУзловПоОрганизацииИзДокумента(Источник.Отбор.Регистратор.Значение, Отправитель); КонецЕсли; Если МассивУзлов.Количество() > 0 Тогда Источник.ОбменДанными.Получатели.Очистить(); Источник.ОбменДанными.Получатели.Автозаполнение = Ложь; Для Каждого Значение Из МассивУзлов Цикл Источник.ОбменДанными.Получатели.Добавить(Значение); КонецЦикла; //ПланыОбмена.ЗарегистрироватьИзменения(МассивУзлов, Источник); КонецЕсли; КонецПроцедуры Процедура ПриЗаписиСправочникПриЗаписи(Источник, Отказ) Экспорт Если Отказ Тогда Источник.ОбменДанными.Получатели.Очистить(); Источник.ОбменДанными.Получатели.Автозаполнение = Ложь; Возврат; КонецЕсли; Если НЕ Метаданные.ПланыОбмена.Полный.Состав.Содержит(Источник.Метаданные()) Тогда Возврат; КонецЕсли; Отправитель = Неопределено; Если Источник.ОбменДанными.Загрузка И Не ПараметрыСеанса.ЕстьПодчиненныеУзлы Тогда Возврат; Иначе Отправитель = Источник.ОбменДанными.Отправитель; КонецЕсли; Элемент = Источник.Ссылка; ТипЭлемента = ТипЗнч(Элемент); //значение по-умолчанию - для всех Организация = Неопределено; Если Источник.Предопределенный Или Источник.ЭтоГруппа Тогда Организация = Неопределено; ИначеЕсли ТипЭлемента = Тип("СправочникСсылка.Организации") Тогда Организация = Элемент; ИначеЕсли Метаданные.НайтиПоТипу(ТипЭлемента).Реквизиты.Найти("Организация") <> Неопределено тогда //Содержит(Метаданные.НайтиПоТипу(Тип("Справочникссылка.Организации"))) Тогда Организация = Элемент["Организация"]; КонецЕсли; // не нашли по реквизитам, смотрим на владельца... Если Организация = Неопределено Тогда // если владелец контрагент, то можно просмотреть договоры... // однако не считаю это правильным, поскольку контрагенты должны быть общими Владелец = Неопределено; //т.к. прошли по реквизитам элемента и не нашли принадлежность, продолжим поиск по владельцу Если Элемент.метаданные().владельцы.количество() > 0 Тогда Владелец = Элемент.Владелец.Ссылка; ТипВладельца = ТипЗнч(Владелец); КонецЕсли; Если Владелец = Неопределено Тогда Организация = Неопределено; ИначеЕсли ТипВладельца = Тип("СправочникСсылка.Организации") Тогда Организация = Владелец; ИначеЕсли Метаданные.НайтиПоТипу(ТипЭлемента).Реквизиты.Найти("Организация") <> Неопределено тогда //Содержит(Метаданные.НайтиПоТипу(Тип("Справочникссылка.Организации"))) Тогда Организация = Элемент["Организация"]; КонецЕсли; КонецЕсли; МассивУзлов = ОбработкаСобытий.ПолучитьМассивУзловПоОрганизацииИзДокумента(Организация, Отправитель); Если МассивУзлов.Количество()>0 Тогда Источник.ОбменДанными.Получатели.Очистить(); Источник.ОбменДанными.Получатели.Автозаполнение = Ложь; Для Каждого Значение Из МассивУзлов Цикл Источник.ОбменДанными.Получатели.Добавить(Значение); КонецЦикла; КонецЕсли; КонецПроцедуры типа так... |
|||
8
mikecool
09.09.09
✎
18:06
|
(+7) перед каждым возвратом должны быть строки
Источник.ОбменДанными.Получатели.Очистить(); Источник.ОбменДанными.Получатели.Автозаполнение = Ложь; |
|||
9
Genri
09.09.09
✎
18:07
|
Спасибо, сейчас буду разбирать по кусочкам.
|
|||
10
mikecool
09.09.09
✎
18:13
|
кажется писал статью на эту тему, поиск по КЗ чего то не работает... :(
|
|||
11
Genri
09.09.09
✎
18:15
|
Авторегистрацию нужно будет отключить у всех объектов .Да ?
|
|||
12
mikecool
09.09.09
✎
18:16
|
(11) читай внимательно :)
// а это система должна сделать сама //ПланыОбмена.ЗарегистрироватьИзменения(МассивУзлов, Источник); в случае - если отключена - тогда надо раскомментировать строчку |
|||
13
mikecool
09.09.09
✎
18:18
|
что я выиграл своим методом:
1) скорость выгрузки/загрузки - никаких фильтров 2) регистрация объекта/набора - по времени занимает очень мало времени, проверено замерами 3) нет "висячих" регистраций, которые неизбежно останутся при фильтрах в ПриОтправке и т.п. процедурах |
|||
14
Genri
10.09.09
✎
15:32
|
Такая ситуация, предположим, схема РИБ состоит из одной ЦБ и две ПБ.
Я делаю новый документ в одной ПБ, а он попадает в другую. Не могу понять, что нужно сделать, чтобы было так типа Место создание и Центр. Вот код сделал в общем модуле для каждого документа. Процедура ВключитьРегистрацию(ОбменДанными, Регион) Экспорт ОбменДанными.Получатели.Очистить(); ОбменДанными.Получатели.Автозаполнение = Ложь; если ПланыОбмена.Полный.ЭтотУзел().Регион = справочники.Регионы.Одесса тогда //Получение узлов для конкретного региона Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Полный.Ссылка |ИЗ | ПланОбмена.Полный КАК Полный |ГДЕ | Полный.Регион = &Регион"; Запрос.УстановитьПараметр("Регион", Регион); Выборка = Запрос.Выполнить().Выбрать(); // Регистрация изменений для выбранных узлов Пока Выборка.Следующий() Цикл ОбменДанными.Получатели.Добавить(Выборка.Ссылка); КонецЦикла; иначе если не ПланыОбмена.Полный.ЭтотУзел().Регион = неопределено тогда ОбменДанными.Получатели.Добавить( ПланыОбмена.ГлавныйУзел()); КонецЕсли КонецЕсли; КонецПроцедуры // ВключитьРегистрацию(ОбменДанными, Регион) |
|||
15
maxar
10.09.09
✎
15:39
|
у меня так
подписки на события - событие перед записью процедура примерно такая Процедура ПередЗаписьюДокументовОпределениеУзловПолучателейПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) экспорт ЭтоГлавныйУзел = (ПланыОбмена.ГлавныйУзел() = Неопределено); ЭтоОбменДанными = Источник.ОбменДанными.Загрузка; Если не ЭтоГлавныйУзел и ЭтоОбменДанными = Истина Тогда Возврат; КонецЕсли; // ДобавлятьГлавныйУзел = Истина; МассивАдресатов = ПолучитьМассивАдресатовДокументов(Источник, ДобавлятьГлавныйУзел); МассивУзлов = УправлениеУзламиПолучателей.ПолучитьМассивУзловПолучателейПоПодразделению(МассивАдресатов); УстановитьУзлыПолучателя(Источник, МассивУзлов, ДобавлятьГлавныйУзел); КонецПроцедуры // ПередЗаписьюДокументовОпределениеУзловПолучателейПередЗаписью() |
|||
16
Genri
10.09.09
✎
15:53
|
(15)Не совсем понятно.
Я делаю так: перед записью документа если это ЦБ тогда регистрируем по регионам если это ПБ, то регистрируем на ЦЕНТР. Что делаю не так ? |
|||
17
maxar
10.09.09
✎
15:58
|
(16) так а что не так то?
|
|||
18
Genri
10.09.09
✎
16:35
|
(16)По той схеме схеме которую я сделал, документ тот, который я сделал в одной ПБ попадает в другую ПД, а мне так не надо. Мне нужно место создание и центр.
|
|||
21
hhhh
10.09.09
✎
17:50
|
(20) кнопка у тебя заедает. Поменяй мышь.
|
|||
22
maxar
10.09.09
✎
17:56
|
при записи документа в центральную базу из ПБ проверяй какие узлы получатели устанавливаются
|
|||
23
Genri
10.09.09
✎
18:12
|
(22)Так вот я так делаю :
если не ПланыОбмена.Полный.ЭтотУзел().Регион = неопределено тогда ОбменДанными.Получатели.Добавить( ПланыОбмена.ГлавныйУзел()); КонецЕсли Т.е он по идее должен передать только в ЦБ. |
|||
24
y22-k
10.09.09
✎
18:23
|
"ВЫБРАТЬ
| ABCКлассификацияПокупателейИзменения.Узел, | ABCКлассификацияПокупателейИзменения.Ссылка, | ABCКлассификацияПокупателейИзменения.НомерСообщения |ИЗ | Документ.ABCКлассификацияПокупателей.Изменения КАК ABCКлассификацияПокупателейИзменения |ГДЕ | ABCКлассификацияПокупателейИзменения.Ссылка.ДатаНачала > &ДатаНачала и ABCКлассификацияПокупателейИзменения.Узел = &Узел" так не хочешь попробовать |
|||
25
y22-k
10.09.09
✎
18:24
|
В конструкторе запроса нужно нажать включать таблицы изменений
|
|||
26
LamerSuper
10.09.09
✎
18:41
|
Попытка
ТекущаяОрганизация = Неопределено; ТекущееРешение = Ложь; Позиция = ЭлементДанных.Количество() - 1; Пока Позиция >= 0 Цикл СтрокаНабора = ЭлементДанных[Позиция]; Если СтрокаНабора.Организация <> ТекущаяОрганизация Тогда ТекущаяОрганизация = СтрокаНабора.Организация; ТекущееРешение = ЭтотОбъект.Организация <> ТекущаяОрганизация; КонецЕсли; Если ТекущееРешение Тогда ЭлементДанных.Удалить(Позиция); КонецЕсли; Позиция = Позиция - 1; КонецЦикла; Исключение КонецПопытки; |
|||
27
LamerSuper
10.09.09
✎
18:44
|
||||
28
Genri
11.09.09
✎
12:56
|
Все нашел в чем проблема.
В моем случие нужно было отключить авторегистрацию. Все спасибо всем за помощь. |
|||
29
Genri
11.09.09
✎
14:02
|
Следующая ситуация:
К примеру, мне нужно сделать док. перемещение между филиалами (ПБ). Я делаю так в одной из ПБ перед записью док. перемещения я добавляю получателей: Центр и склад (узел) получатель. В итоги, что получилось в центр док попал, а в склад (узел) получатель его нет, что нужно сделать чтобы он попал к получателю ПБ. В док.перемещение аторегистрацию я отключил. |
|||
30
mikecool
11.09.09
✎
14:04
|
(29) ты не авторегистрацию отключай, а грамотно зщаполняй узлы-получатели и будет тебе щастье
|
|||
31
Genri
11.09.09
✎
14:13
|
(30)Вот кусок кода в общем модуле (Для всех документов) я делаю так:
В ставляю в процедуре документа передЗаписью. Что нетак подскажите. Если ТипЗнч(ЭтотОбъект) = Тип("ДокументОбъект.ПеремещениеТоваров") Тогда РигионПолучатель=ЭтотОбъект.СкладПолучатель.Регион; ТекУзел=ПланыОбмена.Полный.НайтиПоРеквизиту("Регион",РигионПолучатель); если ПланыОбмена.Полный.ЭтотУзел()=ТекУзел тогда Предупреждение("Регион отправитель и регион получатель одинаковые !"); Отказ=Истина; возврат; Конецесли; ОбменДанными.Получатели.Добавить(ТекУзел.Ссылка); //Регион получатель КонецЕсли; ОбменДанными.Получатели.Добавить(ПланыОбмена.ГлавныйУзел()); //Центр |
|||
32
mikecool
11.09.09
✎
14:19
|
(31) все не так
в филиале - регистрация только для центра в центре - уже подбираем для кого типа Если Не ТекУзел = ПланыОбмена.ГлавныйУзел() Тогда ОбменДанными.Получатели.Добавить(ПланыОбмена.ГлавныйУзел()); Иначе Если ТипЗнч(ЭтотОбъект) = Тип("ДокументОбъект.ПеремещениеТоваров") Тогда РигионПолучатель=ЭтотОбъект.СкладПолучатель.Регион; ТекУзел=ПланыОбмена.Полный.НайтиПоРеквизиту("Регион",РигионПолучатель); если ПланыОбмена.Полный.ЭтотУзел()=ТекУзел тогда Предупреждение("Регион отправитель и регион получатель одинаковые !"); Отказ=Истина; возврат; Конецесли; ОбменДанными.Получатели.Добавить(ТекУзел.Ссылка); //Регион получатель КонецЕсли; за предупреждение в обмене - от Дефа получишь по рукам :) к тому же - на сервере предупреждений нет |
|||
33
mikecool
11.09.09
✎
14:22
|
+32 а предупреждение без срока - и руки оторвать можно
|
|||
34
mikecool
11.09.09
✎
14:22
|
держи мою функцию заполнения узлов-адресатов
Функция ПолучитьМассивУзловПоОрганизацииИзДокумента(пДокумент, Отправитель = Неопределено) Экспорт Если пДокумент = Неопределено Тогда ОрганизацияВДокументе = Справочники.Организации.ПустаяСсылка(); ИначеЕсли ТипЗнч(пДокумент) = Тип("СправочникСсылка.Организации") или ТипЗнч(пДокумент) = Тип("СправочникОбъект.Организации") Тогда ОрганизацияВДокументе = пДокумент; Иначе Если Метаданные.НайтиПоТипу(Типзнч(пДокумент)).Реквизиты.Найти("Организация") <> Неопределено тогда //Содержит(Метаданные.НайтиПоТипу(Тип("Справочникссылка.Организации"))) Тогда ОрганизацияВДокументе = пДокумент.Организация; Иначе ОрганизацияВДокументе = Справочники.Организации.ПустаяСсылка(); КонецЕсли; КонецЕсли; Запрос = Новый Запрос("ВЫБРАТЬ | Полный.Ссылка |ИЗ | ПланОбмена.Полный КАК Полный |ГДЕ | (Полный.Ссылка <> &ТекУзел) И (НЕ Полный.ПометкаУдаления) | И (Полный.Организации.Организация.Ссылка = &Организация | ИЛИ &Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)) | И (Полный.Ссылка <> &Отправитель ИЛИ &Отправитель = Неопределено) |СГРУППИРОВАТЬ ПО Полный.Ссылка"); Запрос.УстановитьПараметр("ТекУзел", ПланыОбмена.Полный.ЭтотУзел()); Запрос.УстановитьПараметр("Организация", ОрганизацияВДокументе); Запрос.УстановитьПараметр("Отправитель", Отправитель); ТаблицаУзлов = Новый ТаблицаЗначений; ТаблицаУзлов = Запрос.Выполнить().Выгрузить(); Возврат ТаблицаУзлов.ВыгрузитьКолонку("Ссылка"); КонецФункции |
|||
35
Genri
11.09.09
✎
14:33
|
(34)А это при каком событии эта функция должна срабатывать.
Смотри я в отправителе ПБ добавил получателя ЦЕНТР и док ушел в ЦЕНТР. А потом при каком событии в ЦЕНТРЕ мне добавить получателя ПБ. "Предупреждение" срабатывает в событии перед записью документа. Галочка клиент в общем модуле у меня стоит. |
|||
36
Genri
11.09.09
✎
14:59
|
(32)А как это (в центре - уже подбираем для кого).
Как это реализовать. |
|||
37
Genri
11.09.09
✎
15:54
|
(32)А как это (в центре - уже подбираем для кого).
Как это организовать. |
|||
38
Genri
11.09.09
✎
18:05
|
Так как это реализовать (в центре - уже подбираем для кого).
|
|||
39
Genri
12.09.09
✎
10:23
|
up
|
|||
40
Genri
12.09.09
✎
12:12
|
Так как быть с перемещениями между филиалами (ПБ).
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |