![]() |
![]() |
![]() |
|
Проблемы с удалением элементов справочников в УРБД | ☑ | ||
---|---|---|---|---|
0
wirg
11.11.08
✎
15:04
|
Есть распределенная база с 2мя узлами Центральным и периферийным. Обмен идет в обе стороны, а передаются только справочники. Опишу в кратце проблему: Допустим в Центральной базе пришел товар, оформили поступление документом и осуществили обмен с Периферийной, после чего в ней появляется номенклатура, затем её помечают на удаление и удаляют через операции удаляем без проблем, потому что документа нет(он не передается). Меняемся обратно и номенклатура пропадает в центральной базе. Была идея ограничить права на удаление в Периферийной базе, но это не устраивает заказчика. Какие пути еще могут быть???
|
|||
1
ТелепатБот
гуру
11.11.08
✎
15:04
|
||||
2
wirg
11.11.08
✎
15:07
|
Извените забыл указать, что это 1с версии 8
|
|||
3
Mitriy
11.11.08
✎
15:18
|
не принимать удаление объектов от подчиненного, или вообще эти удаления не регистрировать
|
|||
4
wirg
11.11.08
✎
15:24
|
Каким образом это можно реализовать?
|
|||
5
wirg
11.11.08
✎
15:25
|
Есть в плане обмена процедура ПриПолученииДанныхОтПодчиненного, но что там нужно прописать, чтобы удаления не принимались
? |
|||
6
wirg
11.11.08
✎
15:29
|
Что именно необходимо дописать, чтобы элементы не удалялись или изменения для удаленных объектов не регистрировались в центрально???
|
|||
7
KalachevDV
11.11.08
✎
15:42
|
1. Вариант
ПриПолученииДанныхОтПодчиненного(<Элемент данных>, <Получение элемента>, <Отправка назад>) Параметры: <Элемент данных> При вызове обработчика события данный параметр содержит элемент данных, прочитанный из сообщения обмена данными. Элементами данных могут быть КонстантаМенеджерЗначения.<Имя константы>, объекты базы данных, наборы записей регистров, последовательностей или перерасчетов. Думаю при получении информации об удаленном объекте, тип "Элемент данных" будет "УдалениеОбъекта". Если получаем данные такого типа - отказываемся от загрузки. Для Этого используем второй параметр <Получение элемента>. 2й вариант. Снимаем автоматическую регистрацию данных для нужных справочников в главной базе. создаем подписку на событие нужных справочников "При записи". В подписке для нужных узлов делаем регистрацию изменений. Факт удаления объекта в этом случае не будет фиксироваться вообще и в подчиненной базе ничего делать не нужно. |
|||
8
wirg
11.11.08
✎
15:57
|
Скорее всего выберу первый вариант. Спасибо за грамотный и быстрый ответ.
|
|||
9
Serg_1960
11.11.08
✎
16:04
|
Согласен с (7) но хочу уточнить :) в РИБ-базе можно:
При получении данных - проверить объект на наличие ссылок. Если есть ссылки - надо а) проигнорировать удаление и б)зарегистрировать изменение для узла - "источника" удаления. Объект не будет удалён, а будет передан в узел, где он будет записан заново - но со "старым" идентификатором (т.е. будет "восстановлен") |
|||
10
wirg
11.11.08
✎
16:12
|
Если не трудно примерчик реализации 2 варианта.
Допустим называется РаспределеннаяБаза, значение для справочников установлены в плане обмена Авторегистрация-Запретить, Центральный узел и Периферийный. Что дальше нужно прописать в процедуре подписки??? Процедура ПриЗаписиСправочников(Источник, Отказ) Экспорт Если Источник.ОбменДанными.Загрузка = Истина Тогда ????? КонецЕсли; КонецПроцедуры Еще есть один вопросик по созданию начального образа базы пишу такой код(На форме есть элемент ПолеВводаОтделение с типом ПланОбменаСсылка.РаспределеннаяБаза): Процедура СоздатьНачальныйОбразНажатие(Элемент) // процедура создания образа узла Диалог= Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); Диалог.Заголовок="Укажите каталог информационной базы:" ; Если Диалог.Выбрать() тогда Узел =ЭлементыФормы.ПолеВводаОтделение.Значение ; ПланыОбмена.СоздатьНачальныйОбраз(Узел ,"File=" + Диалог.Каталог); Предупреждение("Создание начального образа узла завершено."); КонецЕсли; КонецПроцедуры Выдает ошибку, пробовал Менять Узел=ЭлементыФормы.ПолеВводаОтделение.Значение.ПолучитьОбъект(), 1с в обоих случаях говорит что ошибка во втором параметре. В чем не прав??? |
|||
11
wirg
11.11.08
✎
16:27
|
С созданием образа разобрался, всё работает.
По поводу (9). Т.е. если правильно понимаю нужно проверить какой-то командой наличие ссылки и отправить назад, если есть. Как можно проверить наличие ссылок и правильно ли я вас понял??? |
|||
12
Serg_1960
11.11.08
✎
16:37
|
Глобальный контекст
НайтиПоСсылкам (FindByRef) Синтаксис: НайтиПоСсылкам(<Список ссылок>) Параметры: <Список ссылок> (обязательный) Тип: Массив. Массив со списком ссылок на объекты, ссылки на которые нужно найти. Возвращаемое значение: Тип: ТаблицаЗначений. Возвращает ссылки на найденные объекты в виде ТаблицаЗначений, состоящей из колонок с индексами: 0 - искомая ссылка; 1 - ссылка на объект, если найдена ссылка в объектной таблице; ключ записи, если ссылка найдена в независимом регистре сведений; ссылка на документ-регистратор для всех остальных необъектных таблиц; 2 - объект метаданных, которому соответствуют данные из колонки 1. Описание: Осуществляет поиск ссылок на объекты, переданные в параметре <Список ссылок>. Пример: Ссылки = НайтиПомеченныеНаУдаление(); ТабСсылок = НайтиПоСсылкам(Ссылки); Для Каждого Ссылка из ТабСсылок Цикл Сообщить ("" + СокрЛП(Ссылка[0]) + " " + СокрЛП(Ссылка[1])); КонецЦикла; |
|||
13
Serg_1960
11.11.08
✎
16:43
|
Пример использования:
МассивКУдалению = Новый Массив; МассивКУдалению.Добавить(ОбъектПомечанныйНаУдаление.Ссылка); ТаблицаСсылок = НайтиПоСсылкам(МассивКУдалению); Если ТаблицаСсылок.Количество() Тогда Сообщить("Казнить нельзя, помиловать!"); Иначе Сообщить("Казнить, нельзя помиловать!"); КонецЕсли; |
|||
14
wirg
11.11.08
✎
16:54
|
Сенкс всё реально работает.
|
|||
15
wirg
11.11.08
✎
16:55
|
написал
Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад) Типданных=ТипЗнч(ЭлементДанных) ; Ссылки =ЭлементДанных.Ссылка; Если Типданных=ТипЗнч("УдалениеОбъекта") тогда ТабСсылок=новый массив(); ТабСсылок = НайтиПоСсылкам(Ссылки); Если ТабСсылок.Количество()>0 тогда ПолучениеЭлемента=ПолучениеЭлементаДанных.Игнорировать; ОтправкаНазад=ОтправкаЭлементаДанных.Авто; КонецЕсли; КонецЕсли; КонецПроцедуры Вроде пашет |
|||
16
Serg_1960
11.11.08
✎
17:06
|
(15) *:о)
|
|||
17
KalachevDV
11.11.08
✎
17:10
|
(15) Мне больше нравиться второй вариант на основе "ручной" регистрации изменений. В этом случае очень удобно сортировать данные по получателям. Т.е например в подчиненной базе можно отказаться от выгрузки определенных данных в центральную, например анализировав иерархию элемента справочника Номенклатура и на ее основе принимая решение в какой узел необходимо ее отослать. В этом случае ничего нигде удалять не нужно будет. а в случае большого объема данных сократит размер пакетов.
|
|||
18
Serg_1960
11.11.08
✎
17:26
|
(17) Вопрос не о том "отправлять" или "не отправлять" :( Справочники надо синхронизировать - на то они и "справочники" :) А раз так, то и надо иметь механиз удаления и "защиту" от от него :). Вся "соль" в том, что в одном узле, где нет ссылок на запись, эту запись могут удалить и "удаление" отправить по другим узлам, а обмен данными такую запись "самовосстанавливает" - если хотя-бы в одном узле есть ссылки :)
|
|||
19
KalachevDV
11.11.08
✎
17:37
|
(18) +1. Согласен. Но, если есть ситуация, когда в одной базе удаляют номенклатуру в ней не использующуюся, а в другой базе она используется... Не логичнее ее вообще не отправлять?
|
|||
20
Serg_1960
11.11.08
✎
17:54
|
Можно не отправлять - но тогда как узнать что удалять нельзя?
Сорри, отвлекли, позно прочитал |
|||
21
KalachevDV
11.11.08
✎
17:58
|
(20) А тогда удалять будет нечего. В подчиненной базе будет общая номенклатура и специфичная только для нее. Основная сложность знать наверняка где какая :)
|
|||
22
Serg_1960
11.11.08
✎
18:08
|
Второй вариант в (7) ограничен "в применении" и не возможен "в принципе" когда удаление разрешено в различных узлах с различным составом объектов. Проще всего организовать удаление только в корневом узле, - и тогда, когда он "консолидирует" все объекты подчиненных узлов.
В базах различный состав документов? Это допустимо :) Но различный состав (содержимое) справочников :( - не верное решение. Их содержимое должно быть "общее" и "единое" - так будет "правильнее". Особенно, если учитывать возможность различного рода изменений в будущем... |
|||
23
KalachevDV
11.11.08
✎
18:11
|
(22)Их содержимое должно быть "общее" и "единое" - так будет "правильнее". + стотыщпицот :)
Нефиг удалять вообще нигде. Завели элемент, пусть будет, есть не просит. Удачи, пора по домам. |
|||
24
Serg_1960
11.11.08
✎
18:13
|
Пока, по норам пора :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |