|   |   | 
| 
 | Запрет записи любого документа или справочника | ☑ | ||
|---|---|---|---|---|
| 0
    
        tatyana12 08.06.16✎ 15:41 | 
        Подскажите пожалуйста, нужно через подписку на событие создать процедуру, которая при записи любого документа или справочника проверяла, есть ли у него(выбранного документа или справочника) хоть один реквизит с пометкой на удаление. Если есть - запретить запись. Заранее спасибо!)     | |||
| 1
    
        sergeev-ag-1977 08.06.16✎ 15:45 | 
        Событие ПередЗаписью     | |||
| 2
    
        sergeev-ag-1977 08.06.16✎ 15:47 | 
        Методологический вопрос: а что делать если ошибочно пометили на удаление? Как быть с пере-проведением ?     | |||
| 3
    
        tatyana12 08.06.16✎ 15:48 | 
        (1) Это понятно, я беру событие ПриЗаписи, я не могу понять как правильно нужно перебрать реквизиты из Источника?     | |||
| 4
    
        FIXXXL 08.06.16✎ 15:49 | 
        (3) через Метаданные     | |||
| 5
    
        tatyana12 08.06.16✎ 15:50 | 
        (4) Метаданные не содержат значения     | |||
| 6
    
        FIXXXL 08.06.16✎ 15:51 | 
        (4) в цикле получаете ИмяРеквизита, проверяете как
 Источник[ИмяРеквизита].ПометкаУдаления не забудьте проверить, что пометка есть у метаданного | |||
| 7
    
        Torquader 08.06.16✎ 15:51 | 
        Можно ещё в сторону подписки на события посмотреть, чтобы для всех сразу.
 Но, если в реквизите есть ссылка на объект, внутри которого тоже есть ссылка на другой объект, который также может быть помечен на удаление - это тоже нужно проверять ? | |||
| 8
    
        sergeev-ag-1977 08.06.16✎ 15:51 | 
        СписокРеквизитов = Справочники.Номенклатура.НайтиПоКоду("").Метаданные().Реквизиты;     | |||
| 9
    
        sergeev-ag-1977 08.06.16✎ 15:52 | 
        Остается только обобщить     | |||
| 10
    
        Torquader 08.06.16✎ 15:52 | 
        (5) Через метаданные ты можешь узнать только какой тип значения может содержаться в реквизите, если это объект базы, то нужно будет у него проверять пометку удаления - то есть проверить, что ссылка не пустая, и что это не перечисление и выполнить запрос элемента с данными пометки удаления.     | |||
| 11
    
        Torquader 08.06.16✎ 15:53 | 
        (8) Тогда уж Метаданные.Справочники.Номенклатура.Реквизиты     | |||
| 12
    
        В тылу врага 08.06.16✎ 16:03 | 
        (5) метаданные содержат все реквизиты, их имена и типы значений     | |||
| 13
    
        В тылу врага 08.06.16✎ 16:04 | 
        +(12) вот реальный пример:
 Процедура ЗаполнитьРеквизиты(Об,Ссылка) Мета = Об.Метаданные(); Для каждого Реквизит Из Мета.Реквизиты Цикл ИмяРеквизита = Реквизит.Имя; Если Ссылка.Метаданные().Реквизиты.Найти(ИмяРеквизита)<>Неопределено Тогда Об[ИмяРеквизита] = ВыгрузитьДанные(Ссылка[ИмяРеквизита]); КонецЕсли; КонецЦикла; КонецПроцедуры | |||
| 14
    
        xxTANATORxx 08.06.16✎ 16:18 | 
        (6)лучше одним динамическим запросом     | |||
| 15
    
        В тылу врага 08.06.16✎ 16:21 | 
        +(14) что вы так боитесь объектов? там все данные есть уже     | |||
| 16
    
        tatyana12 09.06.16✎ 11:23 | 
        (9) (6) (11) (15) (14) Спасибо всем!
 В совокупности всё получилось. Вот моя процедура) Реквизиты = Источник.Метаданные().Реквизиты; Ии = 0; Для Ии = 0 По (Реквизиты.Количество()-1) Цикл Если (Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Источник.Ссылка[Реквизиты[Ии].Имя])) Или Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Источник.Ссылка[Реквизиты[Ии].Имя]))) И Источник.Ссылка[Реквизиты[Ии].Имя] <> Неопределено Тогда Если Источник.Ссылка[Реквизиты[Ии].Имя].ПометкаУдаления = ИСТИНА Тогда ОбщегоНазначения.СообщитьОбОшибке("Значение """ + Реквизиты[Ии] + """ помечено на удаление!"); Отказ = ИСТИНА; Возврат; КонецЕсли; КонецЕсли; КонецЦикла; ТабличныеЧасти = Источник.Метаданные().ТабличныеЧасти; Ии = 0; Для Ии = 0 По (ТабличныеЧасти.Количество()-1) Цикл Для Каждого Строка ИЗ Источник[ТабличныеЧасти[Ии].Имя] Цикл РеквизитыТЧ = Источник.Метаданные().ТабличныеЧасти[Ии].Реквизиты; Ит = 0; Для Ит = 0 По (РеквизитыТЧ.Количество() - 1) Цикл Если (Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Источник[Источник.Метаданные().ТабличныеЧасти[Ии].Имя][Строка.НомерСтроки-1][РеквизитыТЧ[Ит].Имя])) Или Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Источник[Источник.Метаданные().ТабличныеЧасти[Ии].Имя][Строка.НомерСтроки-1][РеквизитыТЧ[Ит].Имя]))) И Источник[Источник.Метаданные().ТабличныеЧасти[Ии].Имя][Строка.НомерСтроки-1][РеквизитыТЧ[Ит].Имя] <> Неопределено Тогда Если Источник[Источник.Метаданные().ТабличныеЧасти[Ии].Имя][Строка.НомерСтроки-1][РеквизитыТЧ[Ит].Имя].ПометкаУдаления = ИСТИНА Тогда ОбщегоНазначения.СообщитьОбОшибке("В табличной части " + ТабличныеЧасти[Ии].Имя + " в строке №" + Строка(Строка.НомерСтроки) +" значение реквизита """ + РеквизитыТЧ[Ит] + """ помечено на удаление!"); Отказ = ИСТИНА; Возврат; КонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; КонецЦикла; | |||
| 17
    
        xxTANATORxx 09.06.16✎ 11:26 | 
        (15)в Объекте есть информация о пометке удаления реквизита?
 (16)ты написал запрос(ы) в цикле, как это скажется на производительности? | |||
| 18
    
        tatyana12 09.06.16✎ 11:28 | 
        (17) На производительность это никак не повлияло, замерили, проверили на большом документе) так что всё хорошо     | |||
| 19
    
        xxTANATORxx 09.06.16✎ 11:30 | 
        (18)ок, как повлияет на производительность системы в целом? при параллельной активной работе пользователей     | |||
| 20
    
        Dmitrii гуру 09.06.16✎ 11:36 | 
        (18) >> На производительность это никак не повлияло
 Врешь. Не может не повлиять. Хотя влияние и не сильно заметное. На одном документе выявить влияние невозможно, но при перепроведении документов (закрытие месяца, например) это может вылиться в весьма ощутимую разницу. | |||
| 21
    
        tatyana12 09.06.16✎ 11:36 | 
        (19) Согласна, вот это надо будет еще проверить     | |||
| 22
    
        lodger 09.06.16✎ 11:38 | 
        (16) если честно - когда-нибудь это место станет костью в горле. лучше на основании метаданных слепить запрос, который в 1 проход вернет истину или ложь.
 p.s. классный ник, Тату ) | |||
| 23
    
        EugeniaK 09.06.16✎ 11:39 | 
        (18) Плохо меряли. На производительность это заметно влияет.     | |||
| 24
    
        Dmitrii гуру 09.06.16✎ 11:42 | 
        (16) >> Источник.Ссылка[Реквизиты[Ии].Имя]
 Это что? А если документ или элемент справочника новый (только что создан)? У него не будет ссылки. Что вернёт твой код? Правильно: Источник[Реквизиты[Ии].Имя] Еще момент. Я бы предварительно проверял на заполненность: Если ЗначениеЗаполнено(Источник[Реквизиты[Ии].Имя]) А вообще правы коллеги - правильнее написать запрос. | |||
| 25
    
        tatyana12 09.06.16✎ 11:48 | 
        (24) ПриЗаписи нового документа ссылка уже существует     | |||
| 26
    
        xxTANATORxx 09.06.16✎ 11:55 | 
        (25)это надо делать перед записью
 + учтите права и РЛСы всякие | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |