Имя: Пароль:
1C
 
УФ. Самый простой способ определить, что строка таблицы была изменена?
,
0 DTX 4th
 
12.05.17
14:54
Подумал, что при начале редактирования строку можно как-нибудь сериализовать, а при окончание сравнить новую строку с сериализованной. Но как провернуть не знаю.

Попробовал
ЗначениеВСтрокуВнутр(Элементы.Контрагенты.ТекущиеДанные)
Но значения там явно не сериализуются. При этом
ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(Элементы.Контрагенты.ТекущиеДанные))
возвращает Неопределено. Кто-нибудь сталкивался с подобным? Как решали?
1 Heckfy
 
12.05.17
15:01
Ну, мы делали свою систему логирования, где, в том числе, логировали и изменение табличных частей. У тебя что за таблица?
2 sitex
 
naïve
12.05.17
15:04
(0) Изобретаете версионирование в табличной части ?
3 zak555
 
12.05.17
15:05
для редактирования ТЧ вызывай отдельную формы и смотри модифицированность
4 DTX 4th
 
12.05.17
15:39
(2) Нет. Что там изобретать то можно? Выгрузил в ТЗ и готово.

Так мне для строк нужно.
В строках лежат данные из БД скуля. Новые строки нужно в базу добавить, измененные - изменить.

Т.е. мне нужно знать, какая строка была изменена. Т.е. действительно изменена, а не так, что пользователь просто зашёл и вышел из неё.

PhpStorm вот так умеет, например:
http://i.imgur.com/w6HdMsa.png


В общем. Есть ли простой способ сериализовать строку? Или в структуру её перегнать?
5 DTX 4th
 
12.05.17
15:40
(1) Просто таблица формы, которая ссылается на реквизит формы.
6 Heckfy
 
12.05.17
15:41
(5) Данные из этой таблицы в БД записываются?
7 DTX 4th
 
12.05.17
15:46
(6) По кнопке будут. БД не 1С.

Можно как-нибудь ДанныеФормыЭлементКоллекции в структуру перегнать на клиенте? Вроде мелочь, а не сделать. И это в высокоуровневом ЯП =\
8 Mort
 
12.05.17
15:50
Насколько оптимизирует систему сокращение количества измененных строк таким способом? Есть падения производительности, замеры, статистика? Нет. Тогда это просто фантазии.


ПриОкончанииРедактирования(<НоваяСтрока>, <ОтменаРедактирования>)  - флага отмены редактирования достаточно.
9 DTX 4th
 
12.05.17
15:52
(8) Уже думал в эту сторону, но хочется сделать красиво.
10 AceVi
 
12.05.17
15:56
(4) 1С тоже так умеет, выгрузит таблицу при открытии формы, при закрытии сверяйся с ней в запросе и все.
11 Heckfy
 
12.05.17
15:57
Не?

СравнениеЗначений (CompareValues)
Сравнить (Compare)
Синтаксис:

Сравнить(<Значение1>, <Значение2>)
Параметры:

<Значение1> (обязательный)

Тип: Произвольный.
Первое значение сравнения.
<Значение2> (обязательный)

Тип: Произвольный.
Второе значение сравнения.
Возвращаемое значение:

Тип: Число.
Результат < 0 - первое значение меньше второго.
Результат > 0 - первое значение больше второго.
Результат = 0 - первое значение равно второму.
Описание:

Сравнивает два значения.

Доступность:

Сервер, толстый клиент, внешнее соединение.
12 DTX 4th
 
12.05.17
16:05
(10) Это всё должно быть интерактивно.

(11) Что сравнивать то? Да доступность только сервер.


В общем, сделал.
&НаКлиенте
Перем мРедактируемаяСтрока;

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)    
    Таб = РеквизитФормыВЗначение("Контрагенты");
    Для каждого Колонка Из Таб.Колонки Цикл
        КолонкиТаблицы.Добавить(Колонка.Имя);    
    КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура КонтрагентыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
    Если НоваяСтрока Тогда
        Элементы.Контрагенты.ТекущиеДанные.Код = 1;
        Элементы.Контрагенты.ТекущиеДанные.Состояние = "Новая строка";
    Иначе
        мРедактируемаяСтрока = СериализоватьСтрокуВСтруктуру(Элементы.Контрагенты.ТекущиеДанные);
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция СериализоватьСтрокуВСтруктуру(Стр)
    Рез = Новый Структура;
    Для каждого Эл Из КолонкиТаблицы Цикл
        Рез.Вставить(Эл.Значение, Стр[Эл.Значение]);        
    КонецЦикла;
    Возврат Рез;
КонецФункции


&НаКлиенте
Процедура КонтрагентыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
    Если Не НоваяСтрока Тогда
        Стр = СериализоватьСтрокуВСтруктуру(Элементы.Контрагенты.ТекущиеДанные);
        Для каждого КлЗн Из Стр Цикл
            Если мРедактируемаяСтрока[КлЗн.Ключ] <> КлЗн.Значение Тогда
                Элементы.Контрагенты.ТекущиеДанные.Код = 2; //Изменена
                Прервать;
            КонецЕсли;             
        КонецЦикла;
    КонецЕсли;     
КонецПроцедуры


Работает, шустро, но это ужас. Именно из-за таких мелочей и грустно за 1Ц.
Ещё условное оформление прикрутил. Выглядит норм.
13 Heckfy
 
12.05.17
16:09
А может лучше завязаться на объект, который, кстати и ГУИД имеет, и заюзать планы обмена и таблицу изменений и обновлять данные по всему объекту?
14 DTX 4th
 
12.05.17
16:12
(13) Какой объект?) У меня это даже не реквизит объекта, а реквизит формы внешней обработки.
Или это шутка такая?)
15 AceVi
 
12.05.17
16:13
(12) Ну то что ты не умеешь в запросе сравнить 2 таблицы, не делает 1с плохой, это говорит только о тебе.
Плюс ты делаешь много лишних операций - строку в структуру и  сравнение 2 структур причем по каждой строке, это методически не верно.
Нужно сохранить таблицы при открытии формы, а потом при закрытии сравнивать 2 таблицы. получается всего 2 операции.
а у тебя 2 операции на каждую строку + лишний реквизит "Код".
16 НЕА123
 
12.05.17
16:18
(0)
ТекущиеДанные сравнить с ТекущаяСтрока.
17 DTX 4th
 
12.05.17
16:22
Сейчас всё немного портит только то, что цвет активной строки перебивает цвет условного оформления. И это при режиме выделения "Ячейка".

(15) Лолчто? Методически неверно бегать на сервер по каждому чиху. Или ты уже научился запросы на клиенте выполнять?

>сравнение 2 структур причем по каждой строке
По какой каждой строке, алё?

>Нужно сохранить таблицы при открытии формы, а потом при закрытии сравнивать
Похоже, я понял. Ты не знаешь значение слова "Интерактивный", но ничего, это не делает тебя плохим, всё норм.

Специально для тебя гифку сделал даже:
http://i.imgur.com/0nUiaLk.gif

(16) Ммм, это как?) Они разве будут отличаться когда-нибудь?
18 DTX 4th
 
12.05.17
16:24
(16) Так?
Контрагенты.НайтиПоИдентификатору(Элементы.Контрагенты.ТекущаяСтрока) = Элементы.Контрагенты.ТекущиеДанные

Не, что-то странное ты предлагаешь
19 DTX 4th
 
12.05.17
16:29
Если кому интересно, вот что получилось:
http://i.imgur.com/iZwUkC0.gif
20 НЕА123
 
12.05.17
16:29
ТекСтр = Контрагенты.НайтиПоИдентификатору(Элементы.Контрагенты.ТекущаяСтрока)

Если ТекСтр.ИмяПоля <> Элементы.Контрагенты.ТекущиеДанные.ИмяПоля Тогда  .....

ЗЫ ну не (12) же
21 DTX 4th
 
12.05.17
16:33
(20) Всё равно не пойму, в какой момент ты это хочешь сравнивать. Если сохранять строку при начале редактирования, то при окончании она будет совпадать с текущими данными. Да и имена колонок надо жёстко забивать, получается, а это не айс.
22 AceVi
 
12.05.17
16:35
(17) В 0 посте ни одного слова "интерактивно".
23 НЕА123
 
12.05.17
16:36
(21)
КонтрагентыПриОкончанииРедактирования()
в обычных формах так и делали.
имена колонок делай как в (12)
24 DTX 4th
 
12.05.17
16:37
(22) В (12) есть, на который ты отвечал.
Если до сих пор непонятно, то "Код" нужен для условного оформления.
25 DTX 4th
 
12.05.17
16:39
(23) Чего-то ты путаешь.
Пробовал так:
&НаКлиенте
Процедура КонтрагентыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
    Если НоваяСтрока Тогда
        мРедактируемаяСтрока2 = Контрагенты.НайтиПоИдентификатору(Элементы.Контрагенты.ТекущаяСтрока);
    КонецЕсли;
КонецПроцедуры


&НаКлиенте
Процедура КонтрагентыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
    Если Не НоваяСтрока Тогда
        //Тут сравниванию текущие данные с мРедактируемаяСтрока2. Они всегда совпадают, там же ссылка на строку таблицы. Как сделать дубликат строки, а не ссылку на неё я придумать не смог. Поэтому пришлось сериализацию пилить.  
    КонецЕсли;     
КонецПроцедуры
26 Garykom
 
гуру
12.05.17
16:52
27 Garykom
 
гуру
12.05.17
16:55
(26)+ Считаем https://ru.wikipedia.org/wiki/Контрольная_сумма для строки при начале редактирования, запоминаем и сравниваем после окончания.

Для простоты сравниваем каждый раз по "ЗначениеВСтрокуВнутр" для данных строки.
28 DTX 4th
 
12.05.17
16:58
(26) Ну, хеширование можно сюда прикрутить, но смысла в этом пока не вижу. Не думаю, что будет производительнее всё, а памяти нам не жалко в 2017ом. А писаться это, думаю, будет дольше.

(27) >Для простоты сравниваем каждый раз по "ЗначениеВСтрокуВнутр" для данных строки.
ЗначениеВСтрокуВнутр для данных строки выдаёт не контрольную сумму строки, а вроде ссылку на неё, которая не изменится.

Один фиг танцы с бубном вокруг имён колонок.
29 DTX 4th
 
12.05.17
17:02
Да, с хэшем будет побыстрее, на пару сравнений (порядка числа колонок). Но в коде изменится, грубо говоря, только функция СериализоватьСтрокуВСтруктуру, которая будет хэш возвращать. Но за идею спасибо, пригодится.

Меня больше волнует, есть ли способ, при котором не будет использоваться "ПриСозданииНаСервере" для сохранения имён колонок.
30 h-sp
 
12.05.17
17:24
(29) а почему запрет на использование "ПриСозданииНаСервере". Ведь оно в любом случае есть. Туда добавите пару команд.
31 DTX 4th
 
12.05.17
17:40
(30) Запрета нет, сейчас так и сделано. Просто очень странно, что нельзя получить значения ДанныеФормыЭлементКоллекции сразу на клиенте. Точнее, меня смущает количество кода, необходимого для такой фигни.
32 h-sp
 
12.05.17
17:47
(31) ну и делайте на сервере. Всё равно если строка меняется, она меняется на сервере. Какой смысл на клиенте какие-то костыли выдумывать? Понятно, что это куда кода.
33 DTX 4th
 
12.05.17
17:52
(32) >Всё равно если строка меняется, она меняется на сервере
Что?

>Какой смысл на клиенте какие-то костыли выдумывать?  
Потому что без них никак)
Получение имен колонок в ПриСозданииНаСервере самый что ни на есть костыль)
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой