РИБ: как сделать, чтобы подчиненный узел 1с не видел данные центрального
У меня настроен полный обмен РИБ.
Клиент хочет, чтобы в подчиненных узлах не видели никакие данные, кроме своих. Ну а центр видит все, разумеется.
Если делать через односторонний обмен, то выйдет, что при изменении в центре общей информации (номенклатура, контрагенты) подчиненные базы это не увидят, т.к. они не будут принимать данные при одностороннем обмене.
Как решить вопрос?
Клиент хочет, чтобы в подчиненных узлах не видели никакие данные, кроме своих. Ну а центр видит все, разумеется.
Если делать через односторонний обмен, то выйдет, что при изменении в центре общей информации (номенклатура, контрагенты) подчиненные базы это не увидят, т.к. они не будут принимать данные при одностороннем обмене.
Как решить вопрос?
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
А конфигурация то какая может можно попробовать с правами поиграть что бы удаленные базы видели бы только свое, при РИБе там ведь префикс присваивается вот и сделать ограничение на просмотр по префиксу за исключением справочников
Полез в модуль объекта плана обмена (Полный). Там такой код:
насколько я понимаю, мне надо в процедуре ПриПолученииДанныхОтГлавного() определить из какой базы ко мне идет документ.
Если получаемый объект (документ) из текущей базы, то принимаем его, иначе нет.
вычислить происхождение объекта я могу по префиксу в номере документа, а как тогда поставить отказ на прием (загрузку) объекта?
Перем мЭтоНовыйЭлемент;
Перем мМонопольныйРежимПередЗаписью;
Функция СообщитьИнформациюПользователюПослеСозданияНовогоУзла() Экспорт
НужноПерезапуститьВсеПодключенияКИБ = Ложь;
Если мЭтоНовыйЭлемент
И НЕ ПараметрыСеанса.ИспользованиеРИБ
И НЕ мМонопольныйРежимПередЗаписью Тогда
НужноПерезапуститьВсеПодключенияКИБ = Истина;
КонецЕсли;
Если НужноПерезапуститьВсеПодключенияКИБ Тогда
Если мМонопольныйРежимПередЗаписью Тогда
ПолныеПрава.ОпределитьПараметрыСеансаДляОбменаДанными();
Возврат "";
Иначе
Возврат "Для корректной работы механизма обмена данными необходимо завершить работу всех пользователей и перезапустить текущий сеанс работы 1С:Предприятия.";
КонецЕсли;
Иначе
Если мЭтоНовыйЭлемент Тогда
ПолныеПрава.ОпределитьПараметрыСеансаДляОбменаДанными();
КонецЕсли;
Возврат "";
КонецЕсли;
КонецФункции
Процедура ПередЗаписью(Отказ)
мЭтоНовыйЭлемент = ЭтоНовый();
мМонопольныйРежимПередЗаписью = ОбщегоНазначения.ОпределитьТекущийРежимРаботыМонопольный();
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
СтрокаСообщенияПользователю = СообщитьИнформациюПользователюПослеСозданияНовогоУзла();
#Если Клиент Тогда
Сообщить(СтрокаСообщенияПользователю);
#КонецЕсли
КонецПроцедуры
Процедура ОпределитьТипОтправкиДанных(ЭлементДанных, ОтправкаЭлемента) Экспорт
КонецПроцедуры
Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад)
Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.Пользователи") Тогда
ИдентификаторСсылки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЭлементДанных.Ссылка, "ИдентификаторПользователяИБ");
Если ЭлементДанных.ИдентификаторПользователяИБ <> ИдентификаторСсылки Тогда
ЭлементДанных.ИдентификаторПользователяИБ = ИдентификаторСсылки;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад)
Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.Пользователи") Тогда
ИдентификаторСсылки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЭлементДанных.Ссылка, "ИдентификаторПользователяИБ");
Если ЭлементДанных.ИдентификаторПользователяИБ <> ИдентификаторСсылки Тогда
ЭлементДанных.ИдентификаторПользователяИБ = ИдентификаторСсылки;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Показатьнасколько я понимаю, мне надо в процедуре ПриПолученииДанныхОтГлавного() определить из какой базы ко мне идет документ.
Если получаемый объект (документ) из текущей базы, то принимаем его, иначе нет.
вычислить происхождение объекта я могу по префиксу в номере документа, а как тогда поставить отказ на прием (загрузку) объекта?
вроде чего-то надо, я согласен полностью)
тут еще проблема в том, что надо не только фильтровать данные, а еще же есть регистрация объектов для обмена.
я смутно представляю себе работу обмена.
но понимаю так, что объект может быть зарегистрирован для обмена, но не принят (фильтруем при получении данных от главного узла).
но тогда в центре будет скапливаться объем зарегистрированных объектов, не загруженных в удаленных узлах.
так что там много чего надо иметь ввиду.
тут еще проблема в том, что надо не только фильтровать данные, а еще же есть регистрация объектов для обмена.
я смутно представляю себе работу обмена.
но понимаю так, что объект может быть зарегистрирован для обмена, но не принят (фильтруем при получении данных от главного узла).
но тогда в центре будет скапливаться объем зарегистрированных объектов, не загруженных в удаленных узлах.
так что там много чего надо иметь ввиду.
(8) тогда уж лучше делать при отправке данных от главного, ПриОтправкеПодчиненному (или как-то так называется), в этом случае документы не будут включаться в файл выгрузки (чтобы лишние данные не гонять). А принцип обмена прост, формируется файл выгрузки, в него включаются, либо не включатся данные, он выгружается с определенным номером. Файл загружается, формируется ответное сообщение (это обязательно надо), в котором содержится номер принятого пакета, при прочтении ответного сообщения из таблиц регистрации к обмену, удаляются объекты, у которых номер выгрузки меньше или равен прочитанному.
(9) adva, понимаешь, даже если сделать проверку, зарегистрированные для обмена данные будут все равно скапливаться.
т.е. чтобы решить задачу, надо в центральном узле найти код, который производит регистрацию данных.
соответственно, если объект не будет регистрироваться, то и не надо никаких фильтров на обмен накладывать.
надо ковыряться в конфе. я не знаю, где в УТ 10 этот код.
(11) NE_ZNAIY, при использовании RLS у нас данные все-таки будут гоняться между узлами. да, доступа не будет, если настроить. но это принципиально другой метод решения задачи.
если решу вопрос, напишу.
т.е. чтобы решить задачу, надо в центральном узле найти код, который производит регистрацию данных.
соответственно, если объект не будет регистрироваться, то и не надо никаких фильтров на обмен накладывать.
надо ковыряться в конфе. я не знаю, где в УТ 10 этот код.
(11) NE_ZNAIY, при использовании RLS у нас данные все-таки будут гоняться между узлами. да, доступа не будет, если настроить. но это принципиально другой метод решения задачи.
если решу вопрос, напишу.
(12) чтобы не скапливались объекты регистрации, принимай всегда ответный файл. Сделай, чтобы в нем была только инфа о пакетах (не выгружай в центральную доки и прочее). Есть же отдельно процедуры в узле и для выгрузки в ЦБ и для выгрузки в ПБ. Этот механизм надежнее будет, чем ты будешь снимать регистрацию изменений / не регестрировать изменения после выгрузкки.
(17) adva, я не совсем тебя понимаю.
во-первых, регистрация изменений происходит до выгрузки, а не после.
во-вторых, как же и из ПБ в ЦБ не буду выгружать данные о доках? мне же как раз надо сливать из всех ПБ данные в ЦБ. А ЦБ не должна рассылать принимаемые данные по другим узлам.
немного повторюсь, логика какая:
1. создается объект (документ);
2. при записи он регистрируется для обмена (для всех узлов);
3. при запуске обмена происходит выгрузка.
т.е. не будет регистрации, нет выгрузки.
мне остается на этапе регистрации изменений анализировать данные:
или я не прав?
во-первых, регистрация изменений происходит до выгрузки, а не после.
во-вторых, как же и из ПБ в ЦБ не буду выгружать данные о доках? мне же как раз надо сливать из всех ПБ данные в ЦБ. А ЦБ не должна рассылать принимаемые данные по другим узлам.
немного повторюсь, логика какая:
1. создается объект (документ);
2. при записи он регистрируется для обмена (для всех узлов);
3. при запуске обмена происходит выгрузка.
т.е. не будет регистрации, нет выгрузки.
мне остается на этапе регистрации изменений анализировать данные:
Если ТекущийДокумент создан в ЦБ Тогда
регистрируем его для остальных узлов
КонецЕсли;
или я не прав?
Здесь почитайте. Вдруг пригодиться.
Если у вас получиться. Отпишитесь мне, пожалуйста. Задача аналогичная. Решить не могу.
да пока не за что спасибо говорить(
выше писал про подписку. там в подписках на события в УТ 10 основная масса как раз обработчики по регистрации изменений и т.п.
нашел такую вещь. есть процедура - Общие модули - ОбменДаннымиСобытия.МеханизмРегистрацииОбъектов()
в коде есть комментарий-описание к процедуре
она выполняется при записи, проведении, отмене проведения.
я попробовал вставить простую проверку в начало процедуры.
проверял свои тесты на документах реализации.
но изменения документа все равно регистрируются.
т.е. нижеуказанный запрос показывает, что документ добавляется в результат запроса по изменениям:
где-то я близко, мне кажется)
выше писал про подписку. там в подписках на события в УТ 10 основная масса как раз обработчики по регистрации изменений и т.п.
нашел такую вещь. есть процедура - Общие модули - ОбменДаннымиСобытия.МеханизмРегистрацииОбъектов()
в коде есть комментарий-описание к процедуре
// Механизм регистрации объектов (МРО)
// Процедура механизма регистрации объектов. Предназначена для определения списка узлов получателей планов обмена
// на которых необходимо выполнить регистрацию объекта для последующей его выгрузки
она выполняется при записи, проведении, отмене проведения.
я попробовал вставить простую проверку в начало процедуры.
проверял свои тесты на документах реализации.
//************
сообщить("МеханизмРегистрацииОбъектов()");
Если Объект.Комментарий = "---" Тогда
сообщить("Этот объект не должен регистрироваться для обменов!
|возврат");
Возврат
КонецЕсли;
//************
Показатьно изменения документа все равно регистрируются.
т.е. нижеуказанный запрос показывает, что документ добавляется в результат запроса по изменениям:
ВЫБРАТЬ
Ссылка
ИЗ
Документ.РеализацияТоваровУслуг.Изменения
ГДЕ
Узел = &НужныйУзелПланаОбмена
где-то я близко, мне кажется)
В УТ 10.3 у полного плана обмена авторегистрация стоит у всех объектов. Это значит, что кодом её отменить не получится. Порядок такой:
1. У всех снимаем авторегистрацию (или только у документов)
2. Создаем подписки на необходимые события для разных метаданных свои (при записи, при удалении, доков, справочников...)
3. Внутри подписки регистрируем изменения кодом и заодно делаем проверки.
Как мануал открыть демку 11.3, там у полного плана обмена авторегистрация отключена.
1. У всех снимаем авторегистрацию (или только у документов)
2. Создаем подписки на необходимые события для разных метаданных свои (при записи, при удалении, доков, справочников...)
3. Внутри подписки регистрируем изменения кодом и заодно делаем проверки.
Как мануал открыть демку 11.3, там у полного плана обмена авторегистрация отключена.
(19) даже если стоит авторегистрация, можно убрать из кода узлы получатели.
(18) можно и через снятие регистрации делать, а можно и отменять выгрузку конкретных доков либо из периферии, либо из центра, в зависимости от потребностей (смотря чего удобней). Логика получится такая:
1) создается и регистрируется для обмена док;
2) на этапе выгрузки проверяется, надо ли его выгружать, и если не надо, то отменяется его выгрузка. И похоже надо будет не только доки, но и движения регистров отменять выгрузку (не регистрировать), если пользоваться полным планом.
(18) можно и через снятие регистрации делать, а можно и отменять выгрузку конкретных доков либо из периферии, либо из центра, в зависимости от потребностей (смотря чего удобней). Логика получится такая:
1) создается и регистрируется для обмена док;
2) на этапе выгрузки проверяется, надо ли его выгружать, и если не надо, то отменяется его выгрузка. И похоже надо будет не только доки, но и движения регистров отменять выгрузку (не регистрировать), если пользоваться полным планом.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот