|   |   | 
| 
 | v8: Юзер редактирует Регистр сведений. Непериодический. Узнать, что и на что он менял. | ☑ | ||
|---|---|---|---|---|
| 0
    
        AF 29.03.12✎ 14:24 | 
        Сломал голову... Существует некий регистр сведений. Непериодический. Независимый. В нем записи<>0. В какой то момент юзер редактирует этот регистр. Причем из многих мест, документов, справочников, обработок...
  Необходимо узнать, что было до того как, и что стало после того как, и эти данные записать в отдельный регистр сведений. Не спрашивайте меня, почему сделано так. Сделано и все. Можно во все формы, где это событие может быть, привинтить процедуру, но это грустно и долго. В модуле набора записей без проблем читаю первичные данные, и что пишется в момент записи. Проблема в том, что первичные данные, если я и запишу, то в момент записи эти первичные данные = неопределено, так как для записи открывается новая копия модуля набора записей и в ней уже первичных данных нет... Хочется изящного и простого решения... | |||
| 1
    
        vicof 29.03.12✎ 14:25 | 
        слямзи с УПП Версионирование     | |||
| 2
    
        Jstunner 29.03.12✎ 14:26 | 
        подписка на событие перед записью рс     | |||
| 3
    
        mikecool 29.03.12✎ 14:27 | 
        ПередЗаписью и ПриЗаписи у модуле набора записей     | |||
| 4
    
        AF 29.03.12✎ 14:27 | 
        (1) нету... (((  Может пример? Или советы...?     | |||
| 5
    
        rotting 29.03.12✎ 14:27 | 
        (0) сохрани в первоначальные данные в глобальную переменную     | |||
| 6
    
        AF 29.03.12✎ 14:27 | 
        (3) не катит.     | |||
| 7
    
        AF 29.03.12✎ 14:28 | 
        (5) А если пользователей х? х переменных? )))))))))     | |||
| 8
    
        Jstunner 29.03.12✎ 14:28 | 
        (6) катит.     | |||
| 9
    
        aka AMIGO 29.03.12✎ 14:31 | 
        изячно будет сравнить с локальной копией рабочей базы, обновляемой 1 раз в день/месяц/квартал/год..     | |||
| 10
    
        Jstunner 29.03.12✎ 14:33 | 
        после каждой записи в РС делать полную выгрузку базы     | |||
| 11
    
        Maxus43 29.03.12✎ 14:33 | 
        подписки катят, нефиг     | |||
| 12
    
        vde69 29.03.12✎ 14:34 | 
        (6) катит
  Процедура ПередЗаписьюРегистровПравДоступаПередЗаписью(Источник, Отказ, Замещение) Экспорт УстановитьПривилегированныйРежим(Истина); Если Источник.ОбменДанными.Загрузка Тогда Возврат; КонецЕсли; Источник.ДополнительныеСвойства.Удалить("ОбновитьДоступ"); Источник.ДополнительныеСвойства.Удалить("ТаблицаШтатныхЕдиниц"); ТипЗначенияИсточника = ТипЗнч(Источник); МетаданныеРегистра = Метаданные.НайтиПоТипу(ТипЗначенияИсточника); Если Источник.Модифицированность() Тогда // тут нужно еще проверку на типы изменяемых данных Если МетаданныеРегистра.Имя = "ШтатноеРасписание" Тогда Если НужнаЗапись Тогда Источник.ДополнительныеСвойства.Вставить("ОбновитьДоступ", Истина); Источник.ДополнительныеСвойства.Вставить("ТаблицаШтатныхЕдиниц", ТаблицаШтатныхЕдиниц); КонецЕсли; Процедура ПриЗаписиРегистровПравДоступаПриЗаписи(Источник, Отказ, Замещение) Экспорт УстановитьПривилегированныйРежим(Истина); Если Источник.ОбменДанными.Загрузка Тогда Возврат; КонецЕсли; ОбновитьДоступ = Ложь; Источник.ДополнительныеСвойства.Свойство("ОбновитьДоступ", ОбновитьДоступ); ТаблицаШтатныхЕдиниц = Ложь; Источник.ДополнительныеСвойства.Свойство("ТаблицаШтатныхЕдиниц", ТаблицаШтатныхЕдиниц); ТипЗначенияИсточника = ТипЗнч(Источник); МетаданныеРегистра = Метаданные.НайтиПоТипу(ТипЗначенияИсточника); Если ОбновитьДоступ = Истина Тогда //Попытка // Для каждого эл Из ТаблицаШтатныхЕдиниц Цикл // // запишем в очередь обновления ролевого доступа // Рег = РегистрыСведений.ОчередьОбновленияПрав.СоздатьМенеджерЗаписи(); // Рег.ШтатнаяЕдиница = эл.ШтатнаяЕдиница; // Рег.Активность = Истина; // Рег.Записать(Истина); // КонецЦикла; //Исключение // Отказ = Истина; //КонецПопытки; // КонецЕсли; УстановитьПривилегированныйРежим(Ложь); КонецПроцедуры | |||
| 13
    
        AF 29.03.12✎ 14:38 | 
        (12) пока не понял.     | |||
| 14
    
        Maxus43 29.03.12✎ 14:40 | 
        В подписке Перед Записью - можно узнать что "было" и что записывается в данный момнент     | |||
| 15
    
        AF 29.03.12✎ 14:42 | 
        Доступные процедуры в модуле..
  Процедура ПередЗаписью(Отказ, Замещение) КонецПроцедуры Процедура ПриЗаписи(Отказ, Замещение) КонецПроцедуры Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) КонецПроцедуры Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) КонецПроцедуры | |||
| 16
    
        Maxus43 29.03.12✎ 14:43 | 
        (15) мать-перемать) в Регистре самом "Перед Записью"     | |||
| 17
    
        AF 29.03.12✎ 14:44 | 
        (16) Ага, я тоже так возрадовался... Да рановато. В этой хне пусто. Регистр уже пустой.     | |||
| 18
    
        vde69 29.03.12✎ 14:45 | 
        (15) делаешь 2 подписки, одна перед записью, другая при записи, цепляешь их к процедурам в общем модуле (12)
  в процедуре ПередЗаписьюРегистровПравДоступаПередЗаписью сравниваешь что было и что стало и необходимый результат цепляешь в дополнительныеСвойства дальше в процедуре ПриЗаписиРегистровПравДоступаПриЗаписи читаешь дополнительныеСвойства и что-то делаешь | |||
| 19
    
        AF 29.03.12✎ 14:46 | 
        Причем я его пытался читать и модулем, и запросом... КоличествоЗаписей()=0     | |||
| 20
    
        vde69 29.03.12✎ 14:46 | 
        (17) LOL
  смотри у меня есть фишка Если Источник.Модифицированность() Тогда | |||
| 21
    
        Maxus43 29.03.12✎ 14:47 | 
        (17) первый раз оттуда удаляются записи - там пусто, но сделав запрос или прочитав набор записей по данному отбору - увидиш что "было".
  а когда в перед записью не пусто - то это что "сейчас пишет". (19) не верю, отбор ставь номральный в запросе | |||
| 22
    
        AF 29.03.12✎ 14:53 | 
        Т.е иначе говоря фигачить промежуточный регистр...
  (21) Редактируемый вид характеристики - статус. Этот запрос Перед записью с отбором по виду характеристик количество()=0 Без отбора - все характеристики, кроме статуса. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокХарактеристик.ВидХарактеристики, | СписокХарактеристик.ЗначениеХарактеристики |ИЗ | РегистрСведений.СписокХарактеристик КАК СписокХарактеристик |ГДЕ | СписокХарактеристик.Владелец = &Владелец"; | |||
| 23
    
        AF 29.03.12✎ 14:54 | 
        (20) Нет у меня Источник. Допустимые процедуры и переменные модуля выше.     | |||
| 24
    
        AF 29.03.12✎ 15:01 | 
        Может я и надоел, но все таки...     | |||
| 25
    
        Maxus43 29.03.12✎ 15:02 | 
        не понял. в пед записью регистра у ЭтотОбъект есть отбор, отбор по измерениям. Точно такой же отбор надо в запросе устанавливать. Чудес не бывает, в перед записью запросом вытаскивается всё нормально     | |||
| 26
    
        AF 29.03.12✎ 15:08 | 
        (25) Да, вытаскивается и валю все в таблицу значений. А потом, когда я ПередЗаписью заглядываю в эту ТЗ, там пусто...     | |||
| 27
    
        vde69 29.03.12✎ 15:14 | 
        (26) ты читать умеешь? в (18) про дополнительные свойства объекта читал?     | |||
| 28
    
        Maxus43 29.03.12✎ 15:19 | 
        (26) вот прям заставил меня проверить...
  в самом регистре: Процедура ПередЗаписью(Отказ, Замещение) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОтветственныеЛица.СтруктурнаяЕдиница, | ОтветственныеЛица.ФизическоеЛицо |ИЗ | РегистрСведений.ОтветственныеЛица КАК ОтветственныеЛица |ГДЕ | ОтветственныеЛица.СтруктурнаяЕдиница = &СтруктурнаяЕдиница"; Запрос.УстановитьПараметр("СтруктурнаяЕдиница", ЭтотОбъект.Отбор.СтруктурнаяЕдиница.Значение); Результат_ЧтоБыло = Запрос.Выполнить().Выгрузить(); Сообщить(Результат_ЧтоБыло.Количество()); КонецПроцедуры заходит туда 2 раза, первый раз - удаление записи, запрос возвращает что БЫЛО до этого. 2-й раз - сама запись, в ЭтотОбъект там Что СТАЛО, запрос возвращает пусто. Всё правильно. | |||
| 29
    
        AF 29.03.12✎ 15:40 | 
        (28) Я пошел этим же путем. Тока в шапку добавил...
  Перем ТЗ; Процедура ПередЗаписью(Отказ, Замещение) Если ЭтотОбъект.Количество()>5 (на самом деле больше..., но какая разница...) ТЗ.Колонки.Добавить... и т.д. и т.п... в ТЗ я пишу все. КонецЕсли; КонецПроцедуры Так как количество записей получаемых разное, то второй раз ТЗ не заполняется И в этот момент я отлавливаю, что стало..., заглядываю в ТЗ... а ТЗ = неопределено. Т.е ТЗ сбрасывается... Пробовал ТЗ присваивать значение 10. Для теста. И в отладчике вижу: ТЗ=Неопределено. (до присвоения) ТЗ=10 (после присвоения) ТЗ=неопределено (при записи). И действительно, не поспоришь... заходит туда 2 раза, первый раз - показывает что было, второй раз ничего не показывает. И сохранить, что показывал я не могу... | |||
| 30
    
        vde69 29.03.12✎ 15:46 | 
        >>>И сохранить, что показывал я не могу...
  четвертый раз говорю ДополнительныеСвойста объекта | |||
| 31
    
        Maxus43 29.03.12✎ 16:17 | 
        когда получил ТЗ со старыми данными - тогда их и записывай, нафига их пытаться передать куда-то, когда заходит во 2-й раз - там ТЗ уже другая.     | |||
| 32
    
        vde69 29.03.12✎ 16:19 | 
        (31) за тем, что бы
  1. сравнить и писать только разность 2. записывать только в конце (чего зря писать если потом будет откат транзакции?) | |||
| 33
    
        КМ155 29.03.12✎ 16:20 | 
        (29) Процедура ПередЗаписью(Отказ, Замещение)
  ТЗ=ЭтотОбъект.Выгрузить(); ЭтотОбъект.ДополнительныеСвойства.Вставить("НаборПередЗаписью",ТЗ); КонецПроцедуры | |||
| 34
    
        wladimir90 29.03.12✎ 16:23 | 
        Реквизит Контрагент и рядом - СтарыйКонтрагент. Ну типа того.     | |||
| 35
    
        Maxus43 29.03.12✎ 16:26 | 
        ок ок, доп свойства юзать     | |||
| 36
    
        Фауст 29.03.12✎ 16:26 | 
        Сделай регистр периодическим     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |