Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
24 окт 2021, 15:51

Проблема при удалении объекта ссылки

Автор Igig Brave, 19 июн 2017, 15:04

0 Пользователей и 1 гость просматривают эту тему.

Igig Brave

Здравствуйте!
Меня интересует один вопрос, который может не очень простой и обычный.
Допустим у нас есть справочник и документ. Последний имеет ссылку, на какой ни-будь реквизит справочника. И допустим пользователь один элемент справочника, на который ссылался созданный документ пометил, а потом удалил.
Не для кого не секрет, что в таком случае, происходит следующее:
Во первых: после удаления в реквизите ссылки документа который ссылался на удаленный элемент справочника появляется надпись: «<Объект не найден>.....»
Во вторых: допустим код удаленного элемента: «000000055»....если после этого, создать новый элемент то, система может повторить этот же код опять. И это не совсем устаивает . Нужно, что бы созданный код никогда больше не повторялся. Вне зависимости от удаления или создания нового элемента. 
Поэтому главный вопрос.
Нельзя ли сделать следящее.
Что бы реквизит оставался ссылкой пока элемент ссылки не удален. Но как только элемент подвергся удалению, вместо надписи: «<Объект не найден>.....», что бы  реквизит приобретал другой тип. Тип строки.
Ведь обычно чисто по СТАНДАРТУ на один реквизит один тип. А нужно, что бы был один реквизит, с двумя типами.
И что бы значение реквизита оставалось, а тип менялся в зависимости от того или иного действия.
Есть ли такая возможность в платформе 1С и можно ли это сделать?
Если да то, как?
Буду признателен!

alex0402

Цитата: Igig Brave от 19 июн 2017, 15:04осле удаления в реквизите ссылки документа который ссылался на удаленный элемент справочника появляется надпись: «<Объект не найден>.....»

для этого существует "система" пометки на удаление и "реальное" удаление объекта происходит после удаления всех ссылок на объект.

Цитата: Igig Brave от 19 июн 2017, 15:04Но как только элемент подвергся удалению, вместо надписи: «<Объект не найден>.....», что бы  реквизит приобретал другой тип. Тип строки.
Ведь обычно чисто по СТАНДАРТУ на один реквизит один тип. А нужно, что бы был один реквизит, с двумя типами.

для этого существует составной тип, но для замены на строку после удаления требуется дополнительный код 1С.
Спасибо за Сказать спасибо

oleg-x

Сделайте проще, у всех прав уберите непосредственное удаление объектов и делать только через пометку удаления. И таких проблем в большинстве случаев избежите.
Добавлено: 19 июн 2017, 15:35


ЦитироватьВо вторых: допустим код удаленного элемента: «000000055»....если после этого, создать новый элемент то, система может повторить этот же код опять. И это не совсем устаивает . Нужно, что бы созданный код никогда больше не повторялся. Вне зависимости от удаления или создания нового элемента.
При создание нового элемента, присваивается всегда новый код, старый может назначить либо руками, либо при загрузке/обмене.
Если хотите избежать повторений, сделайте регистр сведений с такими реквизитами: код, ИмяМетаданных.
При пометке удаления, записывать в регистр, при снятие пометке удалять из регистра. При создание нового элемента справочника, проверять есть ли такой код в регистре, если есть, то отказ в записи с описанием отказа.
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

Igig Brave

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

Добавлено: 19 июн 2017, 18:27


Опять привет...
Вынужден опять обратиться за помощь.
Хотел сделать как проще то о чем было сказано ... запретить удалять и так и избавиться от проблемы,
но где такое счастье ... начальник захотел по другому..
Короче решил все таки есть необходимость сделать по другому.
И поэтому решил настроить так, что бы ссылка меняла тип в зависимости от ситуации.
Как это мне самому предстваляется и каким путем иду... и Вы рассудите насколько оптимальный путь.
1) Первое что думаю необходимо это убрать выбор типа
И выбор типа связать с булевым реквизитом на пример "ТочкаУчетаТипСсылка", который будет скрыт от пользователя.
Если он ИСТИНА, то тип реквизит ссылка. Если ложь то строка.
Это первое.
2) Второе ... Если на пример галочка стояла на --ИСТИНА--, и если ссылка была не пустой, то при смене на --ЛОЖЬ-- что бы значение ссылки сохранялось как строка и автоматически вставилось в реквизит уже с типом строка.
Т.е. на пример значение ссылки было: "Точка 1", при галочке ИСТИНА. И вдруг мы нажали на ЛОЖЬ...
что бы при этом событии в поле оставался тот же самый текст: "Точка 1", но уже в реквизите с типом скрока.
Т.е. что бы ссылка на элемент естественно была утеряна, но сам текст в поле оставался неизменным.
3) третье обозначить событие, когда элемент ссылки удален и реквизит ссылки не может его найти. А после и первое и второй связать с этим событием.
И тут на счет третьего не знаю.. возможно ли перехватить событие не нахождения..
Вообщем я пока смог сделать только первое а дальше не получается... знаний маловато
Так что, опять рассчитываю на Вашу помощь.... если кто продолжит и дополнит хотя бы для второго


&НаКлиенте
Процедура ТочкаУчетаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)


СтандартнаяОбработка = Ложь;
Если Объект.ТочкаУчетаТипСсылка=Истина тогда
ФормаВыбора=ПолучитьФорму("Справочник.ТОЧКА.ФормаВыбора",,ЭтаФорма);
ВыбранныйЭлемент = ФормаВыбора.ОткрытьМодально();
Если ВыбранныйЭлемент<>Неопределено Тогда
//ПараметрыЭлемента = Новый Структура("Ключ",ВыбранныйЭлемент);
//ФормаОбъектаПолучить = ПолучитьФорму("Справочник.ТОЧКА.ФормаОбъекта", ПараметрыЭлемента);
Объект.ТочкаУчета=ВыбранныйЭлемент;
Иначе
//ТУТ не застопорился
СписокТипов = Новый СписокЗначений;
СписокТипов.Добавить("Метаданные.Справочники.ТОЧКА.Имя", "Метаданные.Справочники.ТОЧКА.Синоним");




КонецЕсли;
КонецЕсли
КонецПроцедуры

Буду очень признателен!

oleg-x

По этому пути зря идете:
1) Вы увеличиваете размер базы, теперь в базе вместо одного типа реквизита, будет два.
2) Таким путем надо будет для всех реквизитом по умолчанию вводить составной тип данных, если маленькая самописная конфигурация, то еще не так строшно. Но весь код придется перелопатить, так как программа ожидает ссылочный тип данных (например пустая ссылка), а ей приходит строка. Доработка такой конфигурации будет не самым лучшим развлечением.
3) Дальше просто лень писать о минусах данного способа.

Но если хочешь помучится, то менять тип данных на строку нужно в момент удаления объекта.
1) Перед удалением элемента, находишь все объекты с ссылкой на данных элемент.
2) Получаешь данный объект, меняешь тип ссылки, на строку и прописываешь что хочешь. Делаешь запись объекта, через попытку.
3) Удаляешь непосредственно элемент.
Соответственно, если элемент будет в 1000 объектов, то будет записано 1000 объектов.
Я бы так написал, но на истину не претендую.
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

Igig Brave

Все что было Вами изложено с этим конечно трудно не согласиться.
Да действительно ... это аргументы ... в изначально взятом пути много минусов. Именно поэтому решил от него отказаться. И сделать по другому... и я понимаю, что то как я решил, учитывая изложенные аргументы, ЦЕЛЬ ДОСТИГНУТА! Только одна проблема... Такое решение это ИЗВРАТ!
Однако думаю изврат или нет это не ко мне претензии, а к самой системе 1С. Где в стандарте нет такого механизма.
Дело в том, что мне нужно было что бы созданные документы не уродовались из-за удаленных объектов связей. Основной документ всего один. И на нем реквизит ссылки тоже один. Ну пока по кр.мере.
А накладывать заперт на удаление, или при событии удалении менять ссылку на значение это гуууу.. действительно не самое лучшее развлечение.
Короче я решил отказаться от всего этого и сделать грубо и кустарно ... уже плевать, что это именно так. Не я виноват в том, что так в стандарте не предусмотрено.
Что я сделал с документом и что я собираюсь делать со всеми доками...
Я взял реквизит и назначил (не составной) один тип Строка.
Потом взял и рядом с этим реквизитом поставил кнопку выбора и все.
А под саму кнопку написал вот этот простой кодик:

&НаКлиенте
Процедура Выбор_ТочкаУчета(Команда)
//=====================================================
ФормаВыбора_ТОЧКА=ПолучитьФорму("Справочник.ТОЧКА.ФормаВыбора",,ЭтаФорма);
ВыбранныйЭлемент = ФормаВыбора_ТОЧКА.ОткрытьМодально();
//=====================================================
Если ВыбранныйЭлемент<>Неопределено Тогда
ПараметрыЭлемента = Новый Структура("Ключ",ВыбранныйЭлемент);
ФормаОбъектаПолучить = ПолучитьФорму("Справочник.ТОЧКА.ФормаОбъекта", ПараметрыЭлемента);
//--------------------------------------------------
Объект.ТочкаУчета=ВыбранныйЭлемент;
ТОЧКА_код=ФормаОбъектаПолучить.Объект.Код;
//--------------------------------------------------
ПолучитьНеобходимыеЗначения(ВыбранныйЭлемент); //процедура передачи объекта ссылки и получения необходимых значений для всех необходимых полей документа
КонецЕсли;
//=====================================================
КонецПроцедуры

Согласен это грубо и кустарно... ну и ладно... плевать
Главное, что уже теперь созданные и оформленные документы не зависят от того, в справочнике какие ссылки были удалены, а какие нет.
Да хоть все элементы справочника грохни.
Потому, что в данном случае реквизит: "ТочкаУчета", уже не ссылка, а только строка.
И этот реквизит нужен только для выбора и получения объекта и не более. А как меняющая свое значение связь ОН НЕ НУЖЕН!
ПОТОМУ, ЧТО ЭТО ДОКУМЕНТ! Который не должен меняться.
Короче вот как решил.
Хотя тоже не претендую на истину!
Если кто докорректирует и чем-то дополнит буду признателен!








Dethmontt

Igig Brave, контроль ссылочной целостности это не 1С придумала =)))

Добавлено: 20 июн 2017, 14:04


Цитата: Igig Brave от 20 июн 2017, 13:30А как меняющая свое значение связь ОН НЕ НУЖЕН!
Igig Brave, тогда зачем вообще нужен справочник???

Регистр сведений куда удобнее в плане удаления записей...
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Igig Brave

Цитата: Dethmontt от 20 июн 2017, 13:59тогда зачем вообще нужен справочник???
Регистр сведений куда удобнее в плане удаления записей...
Справочник в данном случае нужен только для ВЫБОРА объекта и ПОЛУЧЕНИИ необходимых значений при выборе. Всего лишь. Это все что от него надо. Остальное не нужно.... И так при каждом новом создании дока.
И вообще то, что в справочнике это не часто меняющиеся значения.
А что касается документов, он часто меняется... и если он уже оформлены то,как мне понимается он уже должен никак не зависеть от того, какие изменения будут в справочнике.
Я даже думаю ПриОткритии Формы документа, и вовсе скрыть даже кнопку выбора рядом, в случае если документ уже проведен.
Но все это конечно только вариант решения... и как уже говорил не претендует на истину... еще подумаю над другими решениями.
А с регистром сведений в детально пока не знаком... но разберусь ... и если он будет устраивать может сделаю по другому.
Но пока так!
Ладно! Всем спасибо за реакцию!



Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск