Вход | Регистрация


1С:Предприятие ::

Метки: 

Сериализация строки регистра

Я
   Gsoom2010
 
10.01.13 - 15:35
Добрый день.

У меня есть следующий код:

НаборЗаписей = РегистрыСведений.Кэш.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Документ.Установить(Документ);
НоваяЗапись = НаборЗаписей.Добавить();
 // Заполняю реквизиты записи
 
НаборЗаписей.Записать();

Для проверки актуальности записей кэша я хотел бы сериализовать строку регистра и получить от неё md5 сумму, что-то вроде уникального идентификатора который меняется при изменении данных. Без проблем нашёл как это делать с объектами, но не получается сделать это с Записью регистра.
 
 
   Gsoom2010
 
1 - 10.01.13 - 15:38
Ну что-то вроде "Строка регистра" -> "Строка" -> "md5 от строки"
Если строка изменится то и md5 будет другой...
   Reset
 
2 - 10.01.13 - 15:41
А "Строка регистра"->"Структура"->"Строка"->"md5" не подойдет?
   Gsoom2010
 
3 - 10.01.13 - 15:41
Подойдёт, как долбануть в структуру?
   Reset
 
4 - 10.01.13 - 15:43
Структура=Новый Структура("Поле1,Поле2");
ЗаполнитьЗначенияСв-в(Структура,Запись)
   Reset
 
5 - 10.01.13 - 15:43
Строка регистра - это запись
   Gsoom2010
 
6 - 10.01.13 - 15:58
А как можно заполнить структуру не зная имён Поле1 и Поле2?
   Gsoom2010
 
7 - 10.01.13 - 15:59
Предположим мне не известны имена поле регистра
   Gsoom2010
 
8 - 10.01.13 - 16:01
Оппа, попробовал сделать так и вышло:

   // Сериализуем объект
 
    Структура = Новый Структура();
    Структура = НоваяЗапись;
   //Записываем набор записей
 
    НаборЗаписей.Записать();
   Fragster
 
9 - 10.01.13 - 16:01
из РС - фиговый кэш, правильный кэш в 8.1 - параметр сеанса с ХЗ, в 8.2 - общий модуль с повторным использованием возвращаемых значений
   Gsoom2010
 
10 - 10.01.13 - 16:02
Про общий модуль с повторным использованием возвращаемых значений можно подробнее?
 
 Рекламное место пустует
   Gsoom2010
 
11 - 10.01.13 - 16:05
У меня 1С 8.2.13.219, самописная конфигурация. Распределённая база. Информация долго считается и я её кэширую. Всё было хорошо, но начались колизии при обменах, из за чего некоторые записи кэша не соответствуют реальности, я озаботился написанием процедуры проверки кэша...
   Gsoom2010
 
12 - 10.01.13 - 16:07
Это не совсем кэш в привычном понимании, скорее это агрегация данных...
   Fragster
 
13 - 10.01.13 - 16:07
подробнее
   Gsoom2010
 
14 - 10.01.13 - 16:12
У меня есть Документ. По нему производятся разные операции, ведутся регистры движений этого документа, регистры оплаты, и прочее. Чтобы получить полную информацию по такому документу мне не достаточно обратится к документу или даже регистрам. Нужны промежуточные, долгие расчёты, а смысл в том чтобы эта информация получалась как можно быстрее. Я сделал РС который консолидирует записи по этим документам в уже рассчитанном виде. Всё устраивает, но происходят иногда отклонения этого РС от действительного состояния БД.
   Gsoom2010
 
15 - 10.01.13 - 16:13
Например одна или две строки не обновились по какой-то причине, я думаю на обмен данными, из за коллизий скорее всего. Бороться с коллизиями не хочу, хочу сделать проверку кэша без его пересчёта, сравнивать по значением не хочу, уныло это, думаю сделать через md5 от строки.
   Fragster
 
16 - 10.01.13 - 16:16
что такое "регистры оплаты"?
   Gsoom2010
 
17 - 10.01.13 - 16:17
Независимый регистр сведений со ссылкой на документ и статусом его оплаты
   Gsoom2010
 
18 - 10.01.13 - 16:17
И таких независимых регистров несколько, у каждого своя функция.
   Fragster
 
19 - 10.01.13 - 16:21
и почему выборка из таких РС должна тормозить?
   mikecool
 
20 - 10.01.13 - 16:22
может ключ записи спасет?
   Gsoom2010
 
21 - 10.01.13 - 16:23
(19) Тормозили когда я в журнале делал ПриВыводеСтроки :)
   Gsoom2010
 
22 - 10.01.13 - 16:26
(20) Если я правильно понимаю то ключ записи не зависит от состава данных самой записи, а md5 от записи регистра преобразованной в строку зависит
   Fragster
 
23 - 10.01.13 - 16:29
(21) т.е. когда переделал на ПриПолученииДанных тормозить перестало?
   Gsoom2010
 
24 - 10.01.13 - 16:30
(8) Теперь осталось Структуру в строку долбануть, пробовал:

ЗначениеВСтрокуВнутр(Структура);

Выдаёт всегда одно и тоже значение независимо от состава строки, возможно что-то не так делаю...
   Gsoom2010
 
25 - 10.01.13 - 16:33
(23) ПриВыводеСтроки я сейчас делаю запрос к РС который я назвал Кэш (агрегатор), и вытягиваю все дополнительные данные к документу одним запросом (одна строка - один запрос). А про ПриПолученииДанных не знаю пока ничего, сейчас почитаю.
   Jaap Vduul
 
26 - 10.01.13 - 16:35
А ты чего этим кодом хотел добиться?
Структура = Новый Структура();
Структура = НоваяЗапись;
   Gsoom2010
 
27 - 10.01.13 - 16:36
(26) Ну походу я туплю, по всему виду НоваяЗапись и есть Структура, теперь бы понять мне как её преобразовать в строку чтобы взять от неё md5
   Fragster
 
28 - 10.01.13 - 16:37
(25) а что мешает одним запросом вытягивать данные из >1 РС?
   Reset
 
29 - 10.01.13 - 16:37
Имхо велосипед квадратный изобретаешь.
Нужно было начать с перенесения запроса из ПриВыводеСтроки в ПриПолученииДанных
   Gsoom2010
 
30 - 10.01.13 - 16:39
(29) а в ПриПолученииДанных можно заполнять значения строк?
   Reset
 
31 - 10.01.13 - 16:40
(30) Не понял про заполнение значений.

Делать можно все то же самое, что и ПриВыводеСтроки
   Reset
 
32 - 10.01.13 - 16:41
Но достигается существенное ускорение за счет сокращения (укрупнения) запросов к БД
   Reset
 
33 - 10.01.13 - 16:41
сокращения количества*
 
 
   Gsoom2010
 
34 - 10.01.13 - 16:42
(29) Угу, велосипед и есть, но из плюсов что я сократил джоины.
   Gsoom2010
 
35 - 10.01.13 - 16:43
Вернёмся к насущному, пойду в интернеты искать как структуру преобразовать в строку...
   Fragster
 
36 - 10.01.13 - 16:46
(35) не надо оно тебе
   Gsoom2010
 
37 - 10.01.13 - 16:46
(36) а как быть?
   Reset
 
38 - 10.01.13 - 16:47
(35) Строка=ЗначениеВСтрокуВнутр(Структура);
   Reset
 
39 - 10.01.13 - 16:47
но (36)=Истина
   Reset
 
40 - 10.01.13 - 16:48
Впрочем, хочешь изобретать - изобретай, конечно
   Gsoom2010
 
41 - 10.01.13 - 16:48
(38) ЗначениеВСтрокуВнутр(Структура); выдаёт всегда одно и тоже независимо от состава структуры
   Gsoom2010
 
42 - 10.01.13 - 16:48
(40) Не вы подтолкните на идею, я разовью :)
   Reset
 
43 - 10.01.13 - 16:49
(41) = Ложь
   Reset
 
44 - 10.01.13 - 16:49
(42) Начать с (29)
   Gsoom2010
 
45 - 10.01.13 - 16:50
(44) Можно будет потом, это много работы, надо сперва дожать то что сейчас есть
   Gsoom2010
 
46 - 10.01.13 - 16:51
(44) А что ты писал про "общий модуль с повторным использованием возвращаемых значений"
   Reset
 
47 - 10.01.13 - 16:52
(46) Это не я писал ;p
   Gsoom2010
 
48 - 10.01.13 - 16:53
Fragster, а что ты писал про "общий модуль с повторным использованием возвращаемых значений"?
   Fragster
 
49 - 10.01.13 - 16:55
(48) сначала надо разобраться с ПриПолученииДанных и одним запросом на получение всех данных
 
 Рекламное место пустует
   Gsoom2010
 
50 - 10.01.13 - 16:55
Использую код:

    НоваяЗапись.СтатусОплаты = "0";
    Сообщить("0: " + ЗначениеВСтрокуВнутр(НоваяЗапись)); 
    НоваяЗапись.СтатусОплаты = "1";
    Сообщить("1: " + ЗначениеВСтрокуВнутр(НоваяЗапись));


Результат:

0: {"#",9f9955f6-c0d9-404d-acde-e883e30233d2}
 
1: {"#",9f9955f6-c0d9-404d-acde-e883e30233d2}
   Fragster
 
51 - 10.01.13 - 16:57
этот РС только для вывода в список?
   acsent
 
52 - 10.01.13 - 16:58
а если в хмл сериализировать?
   Reset
 
53 - 10.01.13 - 16:58
(50) Что есть НоваяЗапись?
   Reset
 
54 - 10.01.13 - 16:59
(53) Явно не структура, в ней нельзя так менять свойства
   Reset
 
55 - 10.01.13 - 16:59
Структура=Новый Структура("Поле1,Поле2",1,Истина);
Строка=ЗначениеВСтрокуВнутр(Структура);
Структура2=Новый Структура("Поле1,Поле2",2,Истина);
Строка2=ЗначениеВСтрокуВнутр(Структура2);
Сообщить(Строка=Строка2);// даст ложь
   Serginio1
 
56 - 10.01.13 - 17:10
Функция СтрокаТаблицыЗначенийВСтруктуру(СтрокаТаблицыЗначений) Экспорт
    
    Структура = Новый Структура;
    Для каждого Колонка Из СтрокаТаблицыЗначений.Владелец().Колонки Цикл
        Структура.Вставить(Колонка.Имя, СтрокаТаблицыЗначений[Колонка.Имя]);
    КонецЦикла;
    
    Возврат Структура;
    
КонецФункции
   Gsoom2010
 
57 - 11.01.13 - 15:16
НаборЗаписей = РегистрыСведений.Кэш.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Документ.Установить(Документ);
НаборЗаписей.Прочитать();

СтараяЗапись = НаборЗаписей[0];

Можно ли перебрать значения у СтараяЗапись не зная имён колонок?
   Fragster
 
58 - 11.01.13 - 15:24
(57) можно!
   Gsoom2010
 
59 - 11.01.13 - 15:30
Я уже пол интернета обыскал, ничего не найти как это сделать, посмотрел методы объектов, тоже ничего интересного, зацепился за ВыгрузитьКолонки() но ничего не вышло...
   Reset
 
60 - 11.01.13 - 15:31
(57) В метаданных (набор.метаданные())возьми имена измерений, ресурсов и реквизитов. Или еще проще, перебрать имена у Набор.ВыгрузитьКолонки().Колонки
   Serginio1
 
61 - 11.01.13 - 15:32
(59) Ты 56 читал. Это создание структуры по строке ТЗ. Набор прекрасно выгружается в ТЗ. Кроме того есть метаданные Регистра
   Gsoom2010
 
62 - 11.01.13 - 15:36
Для каждого Ресурс Из НаборЗаписей.Метаданные().Ресурсы Цикл

КонецЦикла;

Всё понял, не добрался я до Метаданных немного...
   Gsoom2010
 
63 - 11.01.13 - 15:44
Имена Ресурсов я получил, последний унылый вопрос, как мне обратится к ресурсу зная его имя? Естественно что так не работает СтараяЗапись[0].ИмяРесурса где ИмяРесурса строка конечно не будет работать.
   Reset
 
64 - 11.01.13 - 15:45
tt
СтараяЗапись[0][Ресурс.Имя]
   Gsoom2010
 
65 - 11.01.13 - 15:46
Всё, понял, спасибо, знал ведь что как-то просто, не использовал ранее этот синтаксический приём...
   Reset
 
66 - 11.01.13 - 15:48
Если набор выгрузить в ТЗ, можно вообще без имен обойтись
ТЗ=Набор.Выгрузить();
Для каждого Значение из ТЗ[0] цикл
  Четотам=ЧтотоСделатьс(Значение)

или
Для ИндексКолонки=0 по ТЗ.Колонки.Количество()-1 цикл
   ТЗ[0][ИндексКолонки]=   ТЗ[0][ИндексКолонки]+1
   Reset
 
67 - 11.01.13 - 15:50
а, ты их в структуру выгружаешь, имена нужны (забыл цель первоначальную)
   Reset
 
68 - 11.01.13 - 15:52
Все же, если (51), вся эта возня выглядит сомнительной.
   Gsoom2010
 
69 - 11.01.13 - 15:53
(68) Извини я не заметил (51) сообщение, эта РС ещё для отчётов, в основном.
   Gsoom2010
 
70 - 11.01.13 - 15:55
Если отчёт раньше собирался 15 секунд (за небольшой период) то с такой РС менее секунды. Ну и сам запрос проще выглядит.
   Gsoom2010
 
71 - 11.01.13 - 15:57
Единственный косяк который я и пытаюсь вылечить это гдето одна из 100 строк такой РС иногда не соответствует действительности и построенные отчёты могут быть кривыми, что вообще не позволительно. Так хотябы буду иногда запускать в главном узле проверку этой РС, чтобы вылавливать эти редкие записи и править их.
   Reset
 
72 - 11.01.13 - 15:57
(70) Это понятно, но появилсь накладные расходы по формированию твоего РС, и что хуже в глобальном смысле, не очевидно.
   Reset
 
73 - 11.01.13 - 15:59
Если на 1 изменение исх данных приходится 100 построений отчета, за это однозначно стоит бороться, если наоборот - то навряд ли. Ну тебе виднее в общем
   Gsoom2010
 
74 - 11.01.13 - 15:59
Ну я могу сказать что станций на которых делаются расчёты очень много, и нагрузка расчёта одной строки почти не заметна для станции, а вот когда кто-то начинает собирать отчёт, строки складываются в тысячи и уже расчитать их сложнее. В моей задаче такое распределение нагрузки рентабельно.



Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует