Вывел ТЧ документа на форму. Мне нужно контролировать Модифицированность. Делаю:
ОбъектФормы = РеквизитФормыВЗначение("ДокументОбъект");
ОбъектСервера = МойДокумент.ПолучитьОбъект();
Если ОбъектФормы <> ОбъектСервера Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
Показать
1Ска говорит, что есть отличия в ТЧ, остальные реквизиты - одинаковые. В ТЧ одна единственная строка, которую я не трогаю, только вывожу. Не пойму, в чем отличие ОбъектФормы.МояТЧ[0] и ОбъектСервера.МояТЧ[0] ? Сравнил все колонки через "=" - значения колонок совпадают...
(1) Так нельзя сравнивать разные объекты, даже если они содержат одинаковые данные. Сами объекты разные. Условие "Если ОбъектФормы <> ОбъектСервера Тогда" всегда будет Истина.
Если хотите определить, изменился документ или нет, то сравнивайте их Ссылки.
(2) Мне нужно узнать, были ли изменения в ТЧ документа, выведенной на форму, чтобы выполнить сохранение документа, если данные изменились. Причем тут ссылки?
(3) Вот в каком месте вышеприведенного кода "1Ска говорит, что есть отличия в ТЧ"?
Комментарий был про сам код.
Хотите сравнивать ТЧ?
Сравнивайте каждое значение каждой строки ТЧ объекта формы с данными ссылки.
Только вот зачем? Если изменения вносились оперативно, то флаг модифицированности устанавливается автоматически.
Если изменяли вне контекста модуля формы, то по хорошему делается оповещение и устанавливается тот флаг программно.
(4) Начал сравнивать - громоздко. Искал решение попроще. Пока что обошелся признаком Модифицированности и флагом Сохранять данные. Спс за комменты.
Если что - похожая тема тут - https://forum.infostart.ru/forum9/topic133387/
Функция КоллекцияРазличаются(ТЗ1,ТЗ2,ИсключаемыеКолонки="") Экспорт
ИсклКол=СтрокаВМассив(ИсключаемыеКолонки);
Если ТЗ1.Количество()<>ТЗ2.Количество() Тогда
Если ТЗ1.Количество()=1 И ТЗ2.Количество()=0 Тогда
Для К=0 По ТЗ1.Количество()-1 Цикл
Стр1=ТЗ1[К];
Для М=0 По ТЗ1.Колонки.Количество()-1 Цикл
Имя=ТЗ1.Колонки[М].Имя;
Если ИсклКол.Найти(Имя)<>Неопределено Тогда
Продолжить;
КонецЕсли;
Если ЗначениеЗаполнено(Стр1[Имя]) Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Ложь;
ИначеЕсли ТЗ1.Количество()=0 И ТЗ2.Количество()=1 Тогда
Для К=0 По ТЗ2.Количество()-1 Цикл
Стр2=ТЗ2[К];
Для М=0 По ТЗ1.Колонки.Количество()-1 Цикл
Имя=ТЗ1.Колонки[М].Имя;
Если ИсклКол.Найти(Имя)<>Неопределено Тогда
Продолжить;
КонецЕсли;
Если ЗначениеЗаполнено(Стр2[Имя]) Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецЕсли;
Для К=0 По ТЗ1.Количество()-1 Цикл
Стр1=ТЗ1[К];
Стр2=ТЗ2[К];
Для М=0 По ТЗ1.Колонки.Количество()-1 Цикл
Имя=ТЗ1.Колонки[М].Имя;
Если ИсклКол.Найти(Имя)<>Неопределено Тогда
Продолжить;
КонецЕсли;
Если Стр1[Имя]<>Стр2[Имя] Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Ложь;
КонецФункции
(5) есть другой вариант, документ объект со всеми своими ТЧ отлично сериализуется (что это такое - знаете?)
с помощью 3-4 команд XDTO документ превращается в строку
и остается сравнить всего две строки, текущего документа и сохраненного.