|
Сериализация строки регистра | ☑ | ||
---|---|---|---|---|
0
Gsoom2010
10.01.13
✎
15:35
|
Добрый день.
У меня есть следующий код: НаборЗаписей = РегистрыСведений.Кэш.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Документ.Установить(Документ); НоваяЗапись = НаборЗаписей.Добавить(); // Заполняю реквизиты записи НаборЗаписей.Записать(); Для проверки актуальности записей кэша я хотел бы сериализовать строку регистра и получить от неё md5 сумму, что-то вроде уникального идентификатора который меняется при изменении данных. Без проблем нашёл как это делать с объектами, но не получается сделать это с Записью регистра. |
|||
1
Gsoom2010
10.01.13
✎
15:38
|
Ну что-то вроде "Строка регистра" -> "Строка" -> "md5 от строки"
Если строка изменится то и md5 будет другой... |
|||
2
Reset
10.01.13
✎
15:41
|
А "Строка регистра"->"Структура"->"Строка"->"md5" не подойдет?
|
|||
3
Gsoom2010
10.01.13
✎
15:41
|
Подойдёт, как долбануть в структуру?
|
|||
4
Reset
10.01.13
✎
15:43
|
Структура=Новый Структура("Поле1,Поле2");
ЗаполнитьЗначенияСв-в(Структура,Запись) |
|||
5
Reset
10.01.13
✎
15:43
|
Строка регистра - это запись
|
|||
6
Gsoom2010
10.01.13
✎
15:58
|
А как можно заполнить структуру не зная имён Поле1 и Поле2?
|
|||
7
Gsoom2010
10.01.13
✎
15:59
|
Предположим мне не известны имена поле регистра
|
|||
8
Gsoom2010
10.01.13
✎
16:01
|
Оппа, попробовал сделать так и вышло:
// Сериализуем объект Структура = Новый Структура(); Структура = НоваяЗапись; //Записываем набор записей НаборЗаписей.Записать(); |
|||
9
Fragster
гуру
10.01.13
✎
16:01
|
из РС - фиговый кэш, правильный кэш в 8.1 - параметр сеанса с ХЗ, в 8.2 - общий модуль с повторным использованием возвращаемых значений
|
|||
10
Gsoom2010
10.01.13
✎
16:02
|
Про общий модуль с повторным использованием возвращаемых значений можно подробнее?
|
|||
11
Gsoom2010
10.01.13
✎
16:05
|
У меня 1С 8.2.13.219, самописная конфигурация. Распределённая база. Информация долго считается и я её кэширую. Всё было хорошо, но начались колизии при обменах, из за чего некоторые записи кэша не соответствуют реальности, я озаботился написанием процедуры проверки кэша...
|
|||
12
Gsoom2010
10.01.13
✎
16:07
|
Это не совсем кэш в привычном понимании, скорее это агрегация данных...
|
|||
13
Fragster
гуру
10.01.13
✎
16:07
|
подробнее
|
|||
14
Gsoom2010
10.01.13
✎
16:12
|
У меня есть Документ. По нему производятся разные операции, ведутся регистры движений этого документа, регистры оплаты, и прочее. Чтобы получить полную информацию по такому документу мне не достаточно обратится к документу или даже регистрам. Нужны промежуточные, долгие расчёты, а смысл в том чтобы эта информация получалась как можно быстрее. Я сделал РС который консолидирует записи по этим документам в уже рассчитанном виде. Всё устраивает, но происходят иногда отклонения этого РС от действительного состояния БД.
|
|||
15
Gsoom2010
10.01.13
✎
16:13
|
Например одна или две строки не обновились по какой-то причине, я думаю на обмен данными, из за коллизий скорее всего. Бороться с коллизиями не хочу, хочу сделать проверку кэша без его пересчёта, сравнивать по значением не хочу, уныло это, думаю сделать через md5 от строки.
|
|||
16
Fragster
гуру
10.01.13
✎
16:16
|
что такое "регистры оплаты"?
|
|||
17
Gsoom2010
10.01.13
✎
16:17
|
Независимый регистр сведений со ссылкой на документ и статусом его оплаты
|
|||
18
Gsoom2010
10.01.13
✎
16:17
|
И таких независимых регистров несколько, у каждого своя функция.
|
|||
19
Fragster
гуру
10.01.13
✎
16:21
|
и почему выборка из таких РС должна тормозить?
|
|||
20
mikecool
10.01.13
✎
16:22
|
может ключ записи спасет?
|
|||
21
Gsoom2010
10.01.13
✎
16:23
|
(19) Тормозили когда я в журнале делал ПриВыводеСтроки :)
|
|||
22
Gsoom2010
10.01.13
✎
16:26
|
(20) Если я правильно понимаю то ключ записи не зависит от состава данных самой записи, а md5 от записи регистра преобразованной в строку зависит
|
|||
23
Fragster
гуру
10.01.13
✎
16:29
|
(21) т.е. когда переделал на ПриПолученииДанных тормозить перестало?
|
|||
24
Gsoom2010
10.01.13
✎
16:30
|
(8) Теперь осталось Структуру в строку долбануть, пробовал:
ЗначениеВСтрокуВнутр(Структура); Выдаёт всегда одно и тоже значение независимо от состава строки, возможно что-то не так делаю... |
|||
25
Gsoom2010
10.01.13
✎
16:33
|
(23) ПриВыводеСтроки я сейчас делаю запрос к РС который я назвал Кэш (агрегатор), и вытягиваю все дополнительные данные к документу одним запросом (одна строка - один запрос). А про ПриПолученииДанных не знаю пока ничего, сейчас почитаю.
|
|||
26
Jaap Vduul
10.01.13
✎
16:35
|
А ты чего этим кодом хотел добиться?
Структура = Новый Структура(); Структура = НоваяЗапись; |
|||
27
Gsoom2010
10.01.13
✎
16:36
|
(26) Ну походу я туплю, по всему виду НоваяЗапись и есть Структура, теперь бы понять мне как её преобразовать в строку чтобы взять от неё md5
|
|||
28
Fragster
гуру
10.01.13
✎
16:37
|
(25) а что мешает одним запросом вытягивать данные из >1 РС?
|
|||
29
Reset
10.01.13
✎
16:37
|
Имхо велосипед квадратный изобретаешь.
Нужно было начать с перенесения запроса из ПриВыводеСтроки в ПриПолученииДанных |
|||
30
Gsoom2010
10.01.13
✎
16:39
|
(29) а в ПриПолученииДанных можно заполнять значения строк?
|
|||
31
Reset
10.01.13
✎
16:40
|
(30) Не понял про заполнение значений.
Делать можно все то же самое, что и ПриВыводеСтроки |
|||
32
Reset
10.01.13
✎
16:41
|
Но достигается существенное ускорение за счет сокращения (укрупнения) запросов к БД
|
|||
33
Reset
10.01.13
✎
16:41
|
сокращения количества*
|
|||
34
Gsoom2010
10.01.13
✎
16:42
|
(29) Угу, велосипед и есть, но из плюсов что я сократил джоины.
|
|||
35
Gsoom2010
10.01.13
✎
16:43
|
Вернёмся к насущному, пойду в интернеты искать как структуру преобразовать в строку...
|
|||
36
Fragster
гуру
10.01.13
✎
16:46
|
(35) не надо оно тебе
|
|||
37
Gsoom2010
10.01.13
✎
16:46
|
(36) а как быть?
|
|||
38
Reset
10.01.13
✎
16:47
|
(35) Строка=ЗначениеВСтрокуВнутр(Структура);
|
|||
39
Reset
10.01.13
✎
16:47
|
но (36)=Истина
|
|||
40
Reset
10.01.13
✎
16:48
|
Впрочем, хочешь изобретать - изобретай, конечно
|
|||
41
Gsoom2010
10.01.13
✎
16:48
|
(38) ЗначениеВСтрокуВнутр(Структура); выдаёт всегда одно и тоже независимо от состава структуры
|
|||
42
Gsoom2010
10.01.13
✎
16:48
|
(40) Не вы подтолкните на идею, я разовью :)
|
|||
43
Reset
10.01.13
✎
16:49
|
(41) = Ложь
|
|||
44
Reset
10.01.13
✎
16:49
|
(42) Начать с (29)
|
|||
45
Gsoom2010
10.01.13
✎
16:50
|
(44) Можно будет потом, это много работы, надо сперва дожать то что сейчас есть
|
|||
46
Gsoom2010
10.01.13
✎
16:51
|
(44) А что ты писал про "общий модуль с повторным использованием возвращаемых значений"
|
|||
47
Reset
10.01.13
✎
16:52
|
(46) Это не я писал ;p
|
|||
48
Gsoom2010
10.01.13
✎
16:53
|
Fragster, а что ты писал про "общий модуль с повторным использованием возвращаемых значений"?
|
|||
49
Fragster
гуру
10.01.13
✎
16:55
|
(48) сначала надо разобраться с ПриПолученииДанных и одним запросом на получение всех данных
|
|||
50
Gsoom2010
10.01.13
✎
16:55
|
Использую код:
НоваяЗапись.СтатусОплаты = "0"; Сообщить("0: " + ЗначениеВСтрокуВнутр(НоваяЗапись)); НоваяЗапись.СтатусОплаты = "1"; Сообщить("1: " + ЗначениеВСтрокуВнутр(НоваяЗапись)); Результат: 0: {"#",9f9955f6-c0d9-404d-acde-e883e30233d2} 1: {"#",9f9955f6-c0d9-404d-acde-e883e30233d2} |
|||
51
Fragster
гуру
10.01.13
✎
16:57
|
этот РС только для вывода в список?
|
|||
52
acsent
10.01.13
✎
16:58
|
а если в хмл сериализировать?
|
|||
53
Reset
10.01.13
✎
16:58
|
(50) Что есть НоваяЗапись?
|
|||
54
Reset
10.01.13
✎
16:59
|
(53) Явно не структура, в ней нельзя так менять свойства
|
|||
55
Reset
10.01.13
✎
16:59
|
Структура=Новый Структура("Поле1,Поле2",1,Истина);
Строка=ЗначениеВСтрокуВнутр(Структура); Структура2=Новый Структура("Поле1,Поле2",2,Истина); Строка2=ЗначениеВСтрокуВнутр(Структура2); Сообщить(Строка=Строка2); // даст ложь |
|||
56
Serginio1
10.01.13
✎
17:10
|
Функция СтрокаТаблицыЗначенийВСтруктуру(СтрокаТаблицыЗначений) Экспорт
Структура = Новый Структура; Для каждого Колонка Из СтрокаТаблицыЗначений.Владелец().Колонки Цикл Структура.Вставить(Колонка.Имя, СтрокаТаблицыЗначений[Колонка.Имя]); КонецЦикла; Возврат Структура; КонецФункции |
|||
57
Gsoom2010
11.01.13
✎
15:16
|
НаборЗаписей = РегистрыСведений.Кэш.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Документ.Установить(Документ); НаборЗаписей.Прочитать(); СтараяЗапись = НаборЗаписей[0]; Можно ли перебрать значения у СтараяЗапись не зная имён колонок? |
|||
58
Fragster
гуру
11.01.13
✎
15:24
|
(57) можно!
|
|||
59
Gsoom2010
11.01.13
✎
15:30
|
Я уже пол интернета обыскал, ничего не найти как это сделать, посмотрел методы объектов, тоже ничего интересного, зацепился за ВыгрузитьКолонки() но ничего не вышло...
|
|||
60
Reset
11.01.13
✎
15:31
|
(57) В метаданных (набор.метаданные())возьми имена измерений, ресурсов и реквизитов. Или еще проще, перебрать имена у Набор.ВыгрузитьКолонки().Колонки
|
|||
61
Serginio1
11.01.13
✎
15:32
|
(59) Ты 56 читал. Это создание структуры по строке ТЗ. Набор прекрасно выгружается в ТЗ. Кроме того есть метаданные Регистра
|
|||
62
Gsoom2010
11.01.13
✎
15:36
|
Для каждого Ресурс Из НаборЗаписей.Метаданные().Ресурсы Цикл
КонецЦикла; Всё понял, не добрался я до Метаданных немного... |
|||
63
Gsoom2010
11.01.13
✎
15:44
|
Имена Ресурсов я получил, последний унылый вопрос, как мне обратится к ресурсу зная его имя? Естественно что так не работает СтараяЗапись[0].ИмяРесурса где ИмяРесурса строка конечно не будет работать.
|
|||
64
Reset
11.01.13
✎
15:45
|
tt
СтараяЗапись[0][Ресурс.Имя] |
|||
65
Gsoom2010
11.01.13
✎
15:46
|
Всё, понял, спасибо, знал ведь что как-то просто, не использовал ранее этот синтаксический приём...
|
|||
66
Reset
11.01.13
✎
15:48
|
Если набор выгрузить в ТЗ, можно вообще без имен обойтись
ТЗ=Набор.Выгрузить(); Для каждого Значение из ТЗ[0] цикл Четотам=ЧтотоСделатьс(Значение) или Для ИндексКолонки=0 по ТЗ.Колонки.Количество()-1 цикл ТЗ[0][ИндексКолонки]= ТЗ[0][ИндексКолонки]+1 |
|||
67
Reset
11.01.13
✎
15:50
|
а, ты их в структуру выгружаешь, имена нужны (забыл цель первоначальную)
|
|||
68
Reset
11.01.13
✎
15:52
|
Все же, если (51), вся эта возня выглядит сомнительной.
|
|||
69
Gsoom2010
11.01.13
✎
15:53
|
(68) Извини я не заметил (51) сообщение, эта РС ещё для отчётов, в основном.
|
|||
70
Gsoom2010
11.01.13
✎
15:55
|
Если отчёт раньше собирался 15 секунд (за небольшой период) то с такой РС менее секунды. Ну и сам запрос проще выглядит.
|
|||
71
Gsoom2010
11.01.13
✎
15:57
|
Единственный косяк который я и пытаюсь вылечить это гдето одна из 100 строк такой РС иногда не соответствует действительности и построенные отчёты могут быть кривыми, что вообще не позволительно. Так хотябы буду иногда запускать в главном узле проверку этой РС, чтобы вылавливать эти редкие записи и править их.
|
|||
72
Reset
11.01.13
✎
15:57
|
(70) Это понятно, но появилсь накладные расходы по формированию твоего РС, и что хуже в глобальном смысле, не очевидно.
|
|||
73
Reset
11.01.13
✎
15:59
|
Если на 1 изменение исх данных приходится 100 построений отчета, за это однозначно стоит бороться, если наоборот - то навряд ли. Ну тебе виднее в общем
|
|||
74
Gsoom2010
11.01.13
✎
15:59
|
Ну я могу сказать что станций на которых делаются расчёты очень много, и нагрузка расчёта одной строки почти не заметна для станции, а вот когда кто-то начинает собирать отчёт, строки складываются в тысячи и уже расчитать их сложнее. В моей задаче такое распределение нагрузки рентабельно.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |