|
Каким способом оптимальней всего проверить изменения в ТЧ документа | ☑ | ||
---|---|---|---|---|
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) В данном случае достаточно.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |