|   |   | 
| 
 | Счетчик вызова в регистре сведений | ☑ | ||
|---|---|---|---|---|
| 0
    
        Повелитель 09.06.23✎ 12:31 | 
        В регистре сведений КэшКартинок есть Измерение = Номенклатура, Ресурс = Картинка(Тип ХранилищеЗначений) и Реквизит = Счетчик.
 Допустим в КэшКартинок лежит картинка размером 10 Мб. Каждый раз при чтений этой картинки, я хочу увеличивать счетчик + 1. Чтобы знать, сколько раз была прочитана эта картинка. Это нужно для того, чтобы знать, какие картинки редко читают и можно их удалить из кэша, а какие часто и можно их там оставить навсегда. Вопрос такой. Будет ли распухать база если я вызову 1000 раз вот такой код: НоваяЗапись = РегистрыСведений.КэшКартинок .СоздатьМенеджерЗаписи(); НоваяЗапись.Номенклатура = ТекНоменклатура; НоваяЗапись.Картинка = Новый ХранилищеЗначения(ТекКартинка 10 Мб); НоваяЗапись.Счетик = СтароеЗначениеСчетчик + 1; НоваяЗапись.Записать(); Где, ТекНоменклатура и ТекКартинка одни и те же. | |||
| 1
    
        oslokot 09.06.23✎ 12:39 | 
        Вам всего лишь нужно обновить запись, прочитав ее через набор     | |||
| 2
    
        2S 09.06.23✎ 12:40 | 
        вызови один раз и поставь значение 1000 )))     | |||
| 3
    
        Повелитель 09.06.23✎ 12:41 | 
        (1) Согласен, через набор будет правильнее. А через набор не будет распухать? 
 (2) Шутку оценил. Но это будет вызвано многократно в течении дня разными пользователями. | |||
| 4
    
        lodger 09.06.23✎ 12:43 | 
        имхо, 
 блок А) 1) счетчик статистики должен жить отдельно от данных по которым ведется статистика. 2) голые данные статистики не должны содержать никаких механизмов или агрегатов или сумматоров. 3) все циферки и графики можно посчитать позже, а raw-данные подчищать опосля расчёта. имхо, блок Б) не надо кешировать в СУБД. надо кешировать в памяти. | |||
| 5
    
        oslokot 09.06.23✎ 12:46 | 
        (3) Да вроде не замечал такого. Несложно и проверить - обновить на тестовой 100500 записей и сравнить размеры     | |||
| 6
    
        Повелитель 09.06.23✎ 12:46 | 
        (4) Я не знаю как кэшировать в памяти мою задачу.
 Пост навеян вот этим моим постом: Отображение картинки с подвисанием, как решить? Решения я там не нашел. Рекомендовали положить картинки локально и читать их сервером и передавать на клиент. Я так и сделал, но проблема осталась. На данный момент. Картинку буду получать картинку фоновым задание на сервере. Проблема передать её потом на клиента. В данном случае ничего другого не придумал как через регистр сведений. | |||
| 7
    
        Повелитель 09.06.23✎ 12:46 | 
        (5) Понял, спасибо, вроде логично. Но попробую в копии прогнать и посмотреть.     | |||
| 8
    
        mikecool 09.06.23✎ 12:55 | 
        (0) "Будет ли распухать база если я вызову 1000 раз вот такой код: " - с какого перепугу?     | |||
| 9
    
        Повелитель 09.06.23✎ 13:04 | 
        (8) Ну как с какого, удаление из таблицы SQL не сразу происходит, она просто помечается и в дальнейшем удаляется регламентыми заданиями SQL.
 А новая запись с +10 Мб добавляется. Разве не так? | |||
| 10
    
        H A D G E H O G s 09.06.23✎ 13:09 | 
        (0) Отдельный РС.
 (6) На сервере формируем ТабДоки, с пустыми картинками, в поле "Имя" картинки добавляем путь до файла на расшаренной папке, на Клиенте дозаполняем пустые картинки в табдоке картинками из файлов. | |||
| 11
    
        Повелитель 09.06.23✎ 13:15 | 
        (10) Я как раз изначально и столкнулся с проблемой получения картинки вот таким методом:
 Картинка = Новый Картинка(\\192.168.0.250\image\catalog\catalog\2021\c5\c5eeef43-8617-11eb-ab5b-1c1b0deed3a9_0.jpg) Несколько раз в день в этом месте, происходит подвисание при получении картинки. Никаких закономерностей почему так не нашел. При этом путь может быть и локальным. Картинок много, около 500 000. | |||
| 12
    
        H A D G E H O G s 09.06.23✎ 13:18 | 
        (11) Жесткий диск разгоняется     | |||
| 13
    
        H A D G E H O G s 09.06.23✎ 13:18 | 
        А, не, это SSD     | |||
| 14
    
        Повелитель 09.06.23✎ 13:23 | 
        (13) Да проблему к сожалению не решил. Так и не могу понять в чем она. Думал это из-за сети, а когда переложил локально, то получил ту же проблему. Диски да SSD. Разные компьютеры, разные ОС, разные сети.     | |||
| 15
    
        lodger 09.06.23✎ 15:02 | 
        (14) начал ты в правильную сторону работать - нужно кешировать. и нужно кеш очищать. и для этого хотелось бы статистику.
 но статистика не должна касаться самих данных. чтение и запись вместе с ХЗ - намного хуже, чем нарисовать рядом таблицу, которая вместо ХЗ будет содержать дату\счетчик. в 1сДокументообороте есть непериодический и независимый РС ПротоколРаботыСотрудников, по смыслу тебе подходит. в измерениях ДатаЗаписи, субъект кеширования\протоколирования и сотрудник, который юзал субъект. туда просто вкидываются данные по мере чтения\записи реальных данных. аналитику проводят позже, отчетами. это кеш между файлом на диске и субд. потом второй уровень кеширование - Повторное использование данных в общих модулях. один делаешь серверный, другой клиентский и один дергаешь через другой :) можно ещё третий уровень дорисовать - кеширование на диске конечного юзера. | |||
| 16
    
        Повелитель 09.06.23✎ 17:03 | 
        (15) Благодарю     | |||
| 17
    
        Повелитель 13.06.23✎ 08:27 | 
        Протестировал запись в регистр через СоздатьМенеджерЗаписи и СоздатьНаборЗаписей.
 Создал пустую базу с одним регистром сведений КэшКартинокНоменклатуры Исходный размер базы MS SQL: 102 400 Кб Записывал картинку в рс размером 6 750 Кб. После записи в цикле 100 раз СоздатьМенеджерЗаписи Размер базы: 326 656 Кб После записи в цикле 100 раз СоздатьНаборЗаписей Размер базы: 289 792 Кб Подробно с кодом: https://disk.yandex.ru/i/Fjp0pV79l9o8Jg Результат огорчил. Ожидаем было, что СоздатьМенеджерЗаписи будет увеличивать размер базы. Но то, что СоздатьНаборЗаписей увеличивал размер базы, разочарован, при этом я перезаписывал только реквизит "Счетчик". Вывод база будет распухать. Правильно советовали, статистику писать в отдельный регистр. | |||
| 18
    
        KJlag 13.06.23✎ 10:22 | 
        (17) это при условии, что у тебя ключ "Номенклатура" и ты перетирал одну запись 100 раз?
 хм, учту на будущее | |||
| 19
    
        lodger 13.06.23✎ 11:06 | 
        (17) тут дело не в "СоздатьМенеджерЗаписи и СоздатьНаборЗаписей", а в принципах работы СУБД.     | |||
| 20
    
        Admin_Net_1C 13.06.23✎ 12:01 | 
        (17) (19) я тоже не понял, почему разный размер базы при использовании "СоздатьМенеджерЗаписи и СоздатьНаборЗаписей"     | |||
| 21
    
        lodger 13.06.23✎ 12:28 | 
        (20) 
 а) при перезаписи одной строчки, субд всё равно добавляет новую строчку в таблицу и метит прошлую невалидной. то есть размер будет расти неизбежно. б) почему есть разница между МЗ и НЗ - https://its.1c.ru/db/metod8dev/content/2722/hdoc "При этом менеджер записи использует для выполнения записи два набора записей, устанавливая им соответствующие значения отборов." © то есть, мало того, что СУБД сама по себе просто добавляет правильную строчку в таблицу вместо перезаписи, так ещё и МЗ подкидывает второй пустой набор для затирания старых данных. | |||
| 22
    
        Повелитель 13.06.23✎ 12:39 | 
        (18) Так как создал пустую базу для эксперимента, то Изменение "Номенклатура" это Строка(10), как видно на скрине пустая при этом.     | |||
| 23
    
        oslokot 13.06.23✎ 12:53 | 
        (17) зачем во втором тесте выгружать и загружать набор?     | |||
| 24
    
        Повелитель 13.06.23✎ 12:59 | 
        (23) Да, можно было и не выгружать.
 Для чистоты эксперимента переделал код: //Первый раз записываем НоваяЗапись = РегистрыСведений.КэшКартинокНоменклатуры.СоздатьМенеджерЗаписи(); НоваяЗапись.Номенклатура = Номенклатура; ХранилищеКартинки = Новый ХранилищеЗначения(Новый Картинка("C:\111.jpg")); НоваяЗапись.Картинка = ХранилищеКартинки; //НоваяЗапись.Счетчик = аа; НоваяЗапись.Записать(Истина); //Теперь перезаписываем набором Для аа = 1 По Длительность - 1 Цикл НаборЗаписей = РегистрыСведений.КэшКартинокНоменклатуры.СоздатьНаборЗаписей(); //Так как одна запись, то без отбора НаборЗаписей.Прочитать(); //ТаблицаНабора = НаборЗаписей.Выгрузить(); НаборЗаписей[0].Счетчик = аа; //НаборЗаписей.Загрузить(ТаблицаНабора); НаборЗаписей.Записать(); Сообщить(аа); КонецЦикла; Результат: testRC.mdf стал размером 283 648 Кб | |||
| 25
    
        Кир Пластелинин 13.06.23✎ 13:21 | 
        (24) а автоприрост у базы какой установлен?     | |||
| 26
    
        Кир Пластелинин 13.06.23✎ 13:25 | 
        +(24) а точно увеличился в размере именно mdf (если автоприрост "игнорировать")? по идее должен распухнуть чутка ldf     | |||
| 27
    
        Повелитель 13.06.23✎ 13:34 | ||||
| 28
    
        Кир Пластелинин 13.06.23✎ 13:39 | 
        (27) отсюда и увеличение размера mdf. а вот как sql рассчитывает - хватает ли ему места или нет - хз.     | |||
| 29
    
        Eiffil123 13.06.23✎ 16:28 | 
        (21) п.а - это только для файловой базы? или для скульной тоже?     | |||
| 30
    
        Повелитель 14.06.23✎ 08:35 | 
        (29) Я на MS SQL делаю, как видно из примеров, база растет, значит новые строчки добавляются.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |