Имя: Пароль:
1C
1С v8
Каким способом оптимальней всего проверить изменения в ТЧ документа
0 Сергиус
 
31.07.14
11:18
Нужно перед записью документа проверять, были ли какие-то изменения в его ТЧ. На данный момент реализовал это так:

КоллекцияКолонокТЧ = Ссылка.Метаданные().ТабличныеЧасти[ИмяТЧ].Реквизиты;
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Ссылка",Ссылка);
    Запрос.УстановитьПараметр("ТЧДок",ДокОб[ИмяТЧ]);
    Запрос.Текст = "ВЫБРАТЬ
    |  *
    |ПОМЕСТИТЬ ТЧДок
    |ИЗ &ТЧДок КАК ТЧДок;
    |
    |ВЫБРАТЬ
    |  *
    |ИЗ
    |   Документ."+ИмяТекДокумента+"."+ИмяТЧ+" КАК ТЧ
    |ПОЛНОЕ СОЕДИНЕНИЕ
    |   ТЧДок КАК ТЧДок
    |ПО "+Символы.ПС;
    
    Запрос.Текст = Запрос.Текст + " ТЧ.НомерСтроки = ТЧДок.НомерСтроки "+Символы.ПС;
    
    Для каждого Колонка ИЗ КоллекцияКолонокТЧ Цикл
        Если Колонка.Имя = "Ссылка" ИЛИ Колонка.Имя = "НомерСтроки" Тогда
            Продолжить;
        КонецЕсли;    
        Запрос.Текст = Запрос.Текст + " И ТЧ."+Колонка.Имя+" = ТЧДок."+Колонка.Имя+Символы.ПС;
    КонецЦикла;
    
    Запрос.Текст = Запрос.Текст + " ГДЕ
    |   ТЧ.Ссылка = &Ссылка И
    |   (ТЧ."+КоллекцияКолонокТЧ[0].Имя+" ЕСТЬ NULL ИЛИ ТЧДок."+КоллекцияКолонокТЧ[0].Имя+" ЕСТЬ NULL)";
    
    Выб = Запрос.Выполнить().Выгрузить();
    Если Выб.Количество() > 0 Тогда
        ИзменениеРеквизитовТЧ = Истина;
    КонецЕсли;

Вопрос, правильно ли так делать или есть более правильный способ?
1 Сергиус
 
31.07.14
11:19
(+0) Т.е. делаю полное соединение по всем колонкам и затем условием проверяю, нет ли NULL'ов по первому полю..
2 Maxus43
 
31.07.14
11:22
Работает? значит разрешаю.

З.ы. выгрузка в ТЗ - не нужна, лишние танцы.
Просто Если Запрос.Выполнить().Пустой() Тогда
3 Maxus43
 
31.07.14
11:23
хотя... ихо легче левое соединение и проверить просто ссылку второго на null
4 Сергиус
 
31.07.14
11:23
(2) Понял, спасибо.
5 jsmith
 
31.07.14
11:30
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ Таблица.* ИЗ Документ.ИмяДокумента.ИмяТабЧасти КАК Таблица ГДЕ Таблица.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ЭтотОбъект.Ссылка);
ТЗ1 = Запрос.Выполнить.Выгрузить();
ТЗ2 = ЭтотОбъект.ИмяТабЧасти.Выгрузить();
Сравнение = Новый СравнениеЗначений();
Идентично = (Сравнение.Сравнить(ТЗ1, ТЗ2) = 0);
6 Сергиус
 
31.07.14
12:17
(5) Кстати, для ТЗ не работает такое сравнение..всегда Сравнение.Сравнить(ТЗ1, ТЗ2) = 0. В любом случае, меняешь ли какой-либо реквизит или нет.
7 Drac0
 
31.07.14
12:26
(5) Читай: "Элементы, чьи типы не совпадают, сравниваются по коду типа;
Элементы простых типов сравниваются по значению;
Объекты сравниваются по идентификатору;
Моменты времени сравниваются по дате и идентификатору объекта;
Элементы остальных типов сравниваются по строковому представлению."
8 Drac0
 
31.07.14
12:27
(0) А я бы сделал ОБЪЕДИНИТЬ и посмотрел бы на количество строк. Если осталось как было, значит не менялась. Но только если все строки уникальны.
9 Timon1405
 
31.07.14
12:29
(0) конфа какая?
10 Сергиус
 
31.07.14
12:34
(9) самописка.
11 Timon1405
 
31.07.14
12:38
(10) а БСП есть? там есть функция "ДанныеСовпадают"
12 Сергиус
 
31.07.14
12:46
(11)Да, есть, спасибо за подсказку.
13 acsent
 
31.07.14
13:08
Ведь недостаточно сказать только есть или нет, хотелось бы наверно показать какие
14 Сергиус
 
31.07.14
13:13
(13) В данном случае достаточно.