Имя: Пароль:
1C
1С v8
Как при записи элемента справочника определить, какие именно реквизиты изменены?
,
0 Михаил Анянов
 
17.05.12
10:01
Как при записи элемента справочника определить, какие именно реквизиты изменены?

Возможно ли это и как реализовать?
1 alextom81
 
17.05.12
10:02
Через объект метаданных и элемент формы
2 Михаил Анянов
 
17.05.12
10:02
Суть задачи, при изменении только Родителя - никаких проверок при записи не делать, во всех остальных случаях осуществлять ряд проверок.
3 Cube
 
17.05.12
10:03
Если Наименование <> Ссылка.Наименование Тогда
   Сообщить("Наименование изменено");
КонецЕсли;
4 Reset
 
17.05.12
10:03
а) Хранить структуру реквизитов до измения
б) Взять предыдущие из БД ПередЗаписью (по ссылке)
5 НЕА123
 
17.05.12
10:04
(3)+1
6 Михаил Анянов
 
17.05.12
10:04
(3) а как пробежаться по всем реквизитам?
7 Reset
 
17.05.12
10:05
(6)
а) Из метаданных
б) Выбрать *
8 Cube
 
17.05.12
10:07
(6) А тебе нужно конкретно знать, что изменено или пофиг?
9 Reset
 
17.05.12
10:09
Да, (8) прав, можно использовать модифицированность, при таковой сравнивать только Родителя (если (2))
10 Михаил Анянов
 
17.05.12
10:10
Для Каждого текРеквизит из СписокРеквизитов Цикл
   Если // а вот как тут проверку написать? Тогда
       Сообщить("Реквизит " + текРеквизит + " изменен!");
   КонецЕсли;
КонецЦикла;
11 Михаил Анянов
 
17.05.12
10:11
Забыл:

СписокРеквизитов = ЭтотОбъект.Метаданные().Реквизиты;
12 Reset
 
17.05.12
10:11
(10) Что написать - зависит от того, что находится в СписокРеквизитов
13 Михаил Анянов
 
17.05.12
10:11
Мне нужно определить, что не изменилось ничего кроме родителя
14 Михаил Анянов
 
17.05.12
10:11
Т.е. перебрать все реквизиты надо
15 Reset
 
17.05.12
10:12
(11)
Если Ссылка[текРеквизит.Имя]<>ЭтотОбъект[текРеквизит.Имя]

Хотя меня лично коробит множественное обращение по ссылке
16 Reset
 
17.05.12
10:13
(13) и (14) - взаимоисключающие утверждения
17 Maxus43
 
17.05.12
10:13
(15) запросом вытащить предварительно можно
18 Cube
 
17.05.12
10:13
(13) Фигня какая-то... Информация может храниться в регистрах сведений и/или подчиненных справочниках... Как их проверять будешь?
19 Reset
 
17.05.12
10:13
(16) Поторопился -
20 Reset
 
17.05.12
10:14
(17) Я так и предлагаю :)
21 Михаил Анянов
 
17.05.12
10:14
(16) как же они взаимоисключающие? Мне нужно получить список измененных реквизитов, если он будет состоять только из Родителя - тогда Возврат, иначе - проверки.
22 Михаил Анянов
 
17.05.12
10:15
Интересуют только реквизиты! :)
23 Михаил Анянов
 
17.05.12
10:15
(18) Интересуют только реквизиты самого объекта!
24 Михаил Анянов
 
17.05.12
10:17
(15) ну а иначе никак... либо перед записью в таблицу все реквизиты текущего объекта просто выгружать... В результате обращение к объекту будет одно.
25 Михаил Анянов
 
17.05.12
10:17
Спасибо за советы, сейчас буду мудрить :)
26 Reset
 
17.05.12
10:20
(24) Можно оптимизировать
а) Получить запросом
б) Создать временный объект - копию:

ОбъектДоИзменения=Ссылка.ПолучитьОбъект()
//блабла
    Если ОбъектДоИзменения[текРеквизит.Имя]<>ЭтотОбъект[текРеквизит.Имя]
// Так читабельней и меня меньше коробит ;)
27 hhhh
 
17.05.12
10:22
(26) не, там и так всё в порядке. По ссылке один раз получается объект и дальше уже он используется. То есть временный объект сам создается платформой. Не нужно заморачиваться.
28 Maxus43
 
17.05.12
10:23
(27) некрасиво просто. я за запрос!
29 Михаил Анянов
 
17.05.12
10:37
Всем спасибо большое! Сделал так в модуле ПередЗаписью()

   Если НЕ ЭтоНовый() Тогда
       Запрос = Новый Запрос;
       Запрос.Текст =
           "ВЫБРАТЬ *
           |ИЗ
           |    Справочник.Номенклатура КАК Номенклатура
           |ГДЕ
           |    Номенклатура.Ссылка = &Ссылка";
       Запрос.УстановитьПараметр("Ссылка", ЭтотОбъект.Ссылка);
       Результат = Запрос.Выполнить().Выбрать();
       Если Результат.Количество() > 0 Тогда
           Результат.Следующий();
           СписокРеквизитов = ЭтотОбъект.Метаданные().Реквизиты;
           Для Каждого текРеквизит из СписокРеквизитов Цикл
               Если Результат[текРеквизит.Имя] <> ЭтотОбъект[текРеквизит.Имя] Тогда
                   Сообщить("Реквизит " + текРеквизит + " изменен!");
               КонецЕсли;
           КонецЦикла;
       КонецЕсли;
   КонецЕсли;
30 Михаил Анянов
 
17.05.12
10:44
Есть один косяк, СписокРеквизитов = ЭтотОбъект.Метаданные().Реквизиты - в список Родитель не попадает, и другие стандартные реквизиты
31 Михаил Анянов
 
17.05.12
10:45
СписокРеквизитов = ЭтотОбъект.Метаданные().СтандартныеРеквизиты;

Вопрос снят :)
32 Reset
 
17.05.12
10:46
(29)(31) Нормально вполне себе, молодца :)
33 AAlexandra
 
17.05.12
10:48
(30) КолонкиИзЗапроса = Запрос.Выполнить().Колонки;
34 Alex375
 
17.05.12
10:48
А тебе надо отследить изменения в объекте при редактировании через форму или при любых изменениях объекта? Просто если через форму, тогда можно проще - завести флаг и его выставлять при изменении реквизитов в форме.
35 Михаил Анянов
 
17.05.12
10:52
(34) при любых, как обработкой, так и обменом
36 hhhh
 
17.05.12
10:53
(31) а чего у вас там постоянно родителя туда-сюда меняют у элементов? Может не стоит такую офигенную проверку устраивать каждый раз, а сделать с родителем так же.
37 Михаил Анянов
 
17.05.12
10:53
(34) тот флаг о котором ты говоришь итак есть стандартно, ЭтотОбъект.Модифицированность()
38 Михаил Анянов
 
17.05.12
10:54
(36) справочник обрабатывается как ручками, так и обработками различными. Если подскажешь как мне определить, что происходит событие смены родителя, то буду благодарен :)
39 hhhh
 
17.05.12
10:57
(38) ну легко:

ТабличноеПоле (TableBox)
ПриСменеТекущегоРодителя (OnCurrentParentChange)
Синтаксис:

ПриСменеТекущегоРодителя()
Описание:

Возникает при изменении текущего родителя в режиме иерархического списка.
40 DrShad
 
17.05.12
11:02
(38) подписку на событие не предлагать?
41 Михаил Анянов
 
17.05.12
11:57
Ага, только рассмотрите еще один момент, помимо родителя я одновременно могу например еще и наименование изменить, и т.п.
42 Михаил Анянов
 
17.05.12
12:00
(39) - собитие при записи все равно ведь выполнится с кучей проверок внутри?
Ошибка? Это не ошибка, это системная функция.