Имя: Пароль:
1C
1С v8
Помогите по настройке РИБ с фильтрами.
0 Повелитель
 
24.11.15
11:43
Управление торговым предприятием для Казахстана, редакция (2.0.7.5).

Задача:
Обмен центральной базы и торговой точки, всеми документам, но чтобы документы в торговое точке видели только по своему подразделению, своему складу, своей кассе.
База в торговое точке файловая. Пользователей 3 человека.

Решение:
1. Создали новый план обмена "Филиал".
2. Для документов и регистров регистрацию поставили равной "Запретить".
3. Для документов создали подписку на событие "ПриЗаписи". Для дочерней базы регистрируем все документы, для центральной только те которые соответствуют заданным условиям.
4. Для документов создали подписку на событие "ПередУдалением". Тут регистрируем все документы без отборов.
Тут все отрабатывает хорошо.

5. Для регистров создали подписку "ПриЗаписи". Процедура ФилиалПриЗаписиРегистра(Источник, Отказ, Замещение,ОтменаПроведения=Ложь) Экспорт

В типовой конфигурации в документах, на закладке "Движения", удаление движений = "Не удалять автоматически".
При проведении документов вызывается процедура:
УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ, РучнаяКорректировка);
При отмене проведения тоже вызывается УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ, РучнаяКорректировка);

Вот тут возникли проблемы:
1. При проведении документа срабатывала подписка для регистров "ПриЗаписи". А вот при отмене проведения или пометке удаления документа не срабатывала, так как нет такой подписки.
В Итоге получили, в торговое точке документ не проведен, а движения у документа остались.

Решили эту проблему так. В процедуру УдалитьДвиженияРегистратора добавили вызов процедуры
ФилиалПриЗаписиРегистра(Набор, Отказ, Ложь,Истина).

Теперь стало еще хуже. При проведении документы которые не относиться к торговой точке, вызывается функция УдалитьДвиженияРегистратора, которая регистрирует пустые наборы записей для этого документа. А далее идет проведение документа, там конечно по фильтру набор записей не проходит к регистрации. Ну так как регистрация уже есть, то все данные по регистру уходят.

И в торговой точке имеем записи регистра, без регистратора.

Подскажите решение?

Вот все процедуры которые используются:


//Процедуры на примере документа РеализацияТоваровУслуг
//для одного регистра "Продажи"

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ, Ложь);
    
    //Далее типовой модуль проведения документа...
    
КонецПроцедуры // ОбработкаПроведения()

Процедура ОбработкаУдаленияПроведения(Отказ)
    
    УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ, РучнаяКорректировка);
    
КонецПроцедуры


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


Процедура ФилиалКСПриЗаписиРегистра(Источник, Отказ, Замещение,ОтменаПроведения=Ложь) Экспорт
    
    Если Источник = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    ТекущийУзел = ПланыОбмена.ФилиалКС.ЭтотУзел();
    МассивУзлов = ПолучитьМассивУзлов(ТекущийУзел);
    ГлУзел = ПланыОбмена.ГлавныйУзел();
    
    //Если нет зарегистрированых узлов, то выходим
    Если МассивУзлов.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    //Если отмена проведения, то регистрируем все
    Если ОтменаПроведения = Истина Тогда
        ПланыОбмена.ЗарегистрироватьИзменения(МассивУзлов, Источник);
        Возврат;
    КонецЕсли;
    
    
    //В дочерней базе регистрируем все без фильтров
    Если ГлУзел <> Неопределено Тогда
        ПланыОбмена.ЗарегистрироватьИзменения(МассивУзлов, Источник);
        Возврат;
    КонецЕсли;
    
        
    //////////////////////////////////////////////////////////////
    //2. ОРГАНИЗАЦИЯ + ПОДРАЗДЕЛЕНИЕ
    
    Если ТипЗнч(Источник) = Тип("РегистрНакопленияНаборЗаписей.Продажи") Тогда
        Для Каждого Запись Из Источник Цикл
            Если РазрешитьРегистрациюПоОрганизации(Запись,ТекущийУзел,"Организация") и РазрешитьРегистрациюПоПодразделениям(Запись,ТекущийУзел,"Подразделение") Тогда
                ПланыОбмена.ЗарегистрироватьИзменения(МассивУзлов, Источник);
            КонецЕсли;
            Прервать;
        КонецЦикла;
        
        Возврат;
    КонецЕсли;
    

КонецПроцедуры


Функция РазрешитьРегистрациюПоОрганизации(Источник,ПланОбмена,ИмяРеквизита)
    Разрешить = Истина;
    Если Источник[ИмяРеквизита] <> ПланОбмена.Организация Тогда
        Разрешить = Ложь;
    КонецЕсли;     
    
    Возврат Разрешить;    
КонецФункции

Функция РазрешитьРегистрациюПоПодразделениям(Источник,ПланОбмена,ИмяРеквизита)
    Разрешить = Истина;
    Если ПланОбмена.ОтборПоПодразделениям.Найти(Источник[ИмяРеквизита],"Подразделение") = Неопределено Тогда
        Разрешить = Ложь;
    КонецЕсли;
    
    Возврат Разрешить;    
КонецФункции

1 aleks_default
 
24.11.15
12:05
"1. При проведении документа срабатывала подписка для регистров "ПриЗаписи". А вот при отмене проведения или пометке удаления документа не срабатывала, так как нет такой подписки." - причем тут какая-то подписка на отмену проведения, здесь должна отрабатывать подписка ПриЗаписи регистра. Ведь при этом должно происходить изменение набора записей регистра. Вот разберитесь почему она не отрабатывала. Короче хрень у вас написана в процедуре УдалитьДвиженияРегистратора()
2 Повелитель
 
24.11.15
12:09
(1) При отмене проведения, подписка для регистров "ПриЗаписи" не срабатывает.
А разве должна?
3 aleks_default
 
24.11.15
12:12
Сам подумай. Если при отмене проведения удаляются движения документа, а движения документа это у нас что? Это у нас - набор записей регистра. А на запись набора записей регистра у нас стоит эта подписка. Так почему она не отрабатывает? видимо мотому что движения документа не удаляются.
4 Повелитель
 
24.11.15
12:16
(3) Понял.
Проверил, да действительно "ПриЗаписи" вызывается.
До этого тестировал на документе у которого действительно двжижения не удалялись.

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