Имя: Пароль:
1C
 
РИБ : как можно в модуле обмена достучатся в регистрах. накопл. до измерений
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
Так как быть с перемещениями между филиалами (ПБ).