Имя: Пароль:
1C
 
Проблемы с удалением элементов справочников в УРБД
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
Пока, по норам пора :)
Программист всегда исправляет последнюю ошибку.