Имя: Пароль:
1C
1С v8
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
Сделай регистр периодическим
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший