Имя: Пароль:
1C
1С v8
Сериализация строки регистра
,
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
Ну я могу сказать что станций на которых делаются расчёты очень много, и нагрузка расчёта одной строки почти не заметна для станции, а вот когда кто-то начинает собирать отчёт, строки складываются в тысячи и уже расчитать их сложнее. В моей задаче такое распределение нагрузки рентабельно.