Функция для определения размера данных для 1С: Предприятия 8.Х

09.08.10

Разработка - Универсальные функции

Универсальная функция, позволяющая определить размер данных (хранилища значения, двоичных данных, картинки, строки)

Разработана в ходе реализации проекта по взаимодействию  с веб-сервером для контроля размера передаваемых данных.

Источник алгоритма расчёта: Как рассчитать размер данных помещенных в объект ХранилищеЗначения.

// Универсальная функция для определения размера данных (хранилища значения, двоичных данных, картинки, строки)
// Алгоритм расчета размера данных взят отсюда http://kb.mista.ru/article.php?id=386
//
// Параметры
//  <Данные>  - данные типа
хранилище значений, двоичные данные, картинка, строка
//
// Возвращаемое значение:
//   РазмерДанных   - числовое значение в байтах
//
Функция ПолучитьРазмерДанных(Знач Данные)

    Если
ТипЗнч(Данные) = Тип("ХранилищеЗначения") Тогда
       
ДанныеХранилища = Данные.Получить();
        Если
ДанныеХранилища = Неопределено Тогда
            Возврат
0;
        КонецЕсли;
        Если
ТипЗнч(ДанныеХранилища) = Тип("Картинка") Тогда
           
ДанныеХранилища = ДанныеХранилища.ПолучитьДвоичныеДанные();
        ИначеЕсли
ТипЗнч(ДанныеХранилища) = Тип("Строка") Тогда
            Возврат
СтрДлина(ДанныеХранилища);
        КонецЕсли;
       
ДанныеBase64 = Base64Строка(ДанныеХранилища);
    ИначеЕсли
ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
       
ДанныеBase64 = Base64Строка(Данные);
    ИначеЕсли
ТипЗнч(Данные) = Тип("Картинка") Тогда
       
ДанныеBase64 = Base64Строка(Данные.ПолучитьДвоичныеДанные());
    Иначе
        Возврат
СтрДлина(XMLСтрока(Данные));
    КонецЕсли;

   
//Base64 - специальный формат хранения данных в текстовом формате
   
РазмерДанных = СтрДлина(ДанныеBase64) - ?(Прав(ДанныеBase64, 1) = "=", 1, 0) - ?(Прав(ДанныеBase64, 2) = "==", 1, 0);
   
РазмерДанных = Цел(РазмерДанных / 4 * 3); // в байтах

   
Возврат РазмерДанных;

КонецФункции

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    5428    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    46375    dimanich70    83    

164

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    6855    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    57449    atdonya    31    

68

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    8627    ke.92@mail.ru    17    

68

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    22795    YA_418728146    8    

174
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Evg-Lylyk 5218 06.10.09 19:47 Сейчас в теме
<Данные> - данные любого типа
Судя по коду для типа структура результат 9 для ТаблицаЗначений - 15 вообщем не любой тип
sviriduk; +1 Ответить
3. Поручик 4598 06.10.09 23:55 Сейчас в теме
(1) ну в вобще-то да, не любого типа, а любого из указанных. На web-сервер таблицу или структуру 1С вы не передаёте, туда по сути уходят строковые данные
2. Gilev.Vyacheslav 1921 06.10.09 20:55 Сейчас в теме
осталось эту функцию воткнуть в типовые конфигурации для проверки записываемых объемов памяти <=2Gb, чтобы потом платформа не падала.
4. Trakt0risT 111 15.09.10 07:38 Сейчас в теме
Есть только один вопрос! А какой максимальный может быть размер?
5. Yashazz 4886 18.01.11 21:50 Сейчас в теме
Или я чего-то не понял, или это лажа. Для строки функция возвращает обычную СтрДлина, а нифига не в байтах. Автор, тут есть хитрость?
6. markers 278 03.11.11 18:46 Сейчас в теме
(5)Создайте текстовый файлик, в него набейте к примеру 10 символов, а теперь сохраните и посмотрите сколько он весит.
7. bforce 484 20.06.14 10:42 Сейчас в теме
Неправильно считать размер строки в байтах по ее длине.
Например, строка "ЙЙ ШШ ЯЯ" будет иметь длину 8 символов, но размер 14 байт. Для этого ее просто нужно записать в файл в Юникоде.
У меня сейчас проблема как раз такая. Я формирую sql запрос и должен контролировать его размер, чтобы сервер его принял. Так как в запросе много русскоязычных символов, то реальный размер запроса превышает пороговое значение, не смотря на то, что по длине строки все было посчитано правильно.
8. Поручик 4598 20.06.14 11:05 Сейчас в теме
(7) Для тупыхДля тех, кто не понял. Создание темы 06.10.09, то есть в то время 8.2. была в зачаточном состоянии, а 8.1. не работала с юникодом.
PlatonStepan; rovenko.n; +2 2 Ответить
9. alexandr_astafiev 68 05.02.18 14:20 Сейчас в теме
Оказывается сейчас есть команда Файл.Размер() :
Файл (File)
Размер (Size)
Синтаксис:
Размер()
Возвращаемое значение:
Тип: Число.
Описание:
Определяет размер файла (в байтах).
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Примечание:
Применим только к файлам, которые реально существуют.
Для работы метода на веб-клиенте необходимо предварительно подключить расширение работы с файлами.
10. CaSH_2004 374 30.05.18 06:46 Сейчас в теме
(9) Данный метод у объекта Новый Файл существует наверное с 8.0
Однако такой же метод есть у объекта Новый ДвоичныеДанные(), однако описание у него совершенно другое так что вы явно не его имели ввиду и вот он как раз дает верный результат!

А теперь про сам метод предложенного вычисления
(0) Уважаемый автор, я понимаю что вы привели источник и вроде заслуживающий доверие - сам сто раз пользовался Мистой, однако я привык такие точные данные проверять практически, чем вы явно не озаботились (если я ошибаюсь - докажите и я извинюсь)

Странно то ли с 2009 года 1С по другому считать начало но я при проверки получил просто погрешность просто колоссального размера для таких расчетов - более 3%!!! (проверил множество раз).

Я вот долго пользовался этим методом, а потом решил проверить на примере PDF файл-а

ИмяФайла = "g:\мой файл.PDF";
Файл = Новый Файл(ИмяФайла);
Сообщить("Размер файловой системы:" + Файл.Размер());
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
Сообщить("Размер двоичных данных:	" + ДвоичныеДанные.Размер());
ХранилищеЗначения = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(0));
ДанныеBase64 = Base64Строка(ХранилищеЗначения.Получить());
ДлинаФайла = СтрДлина(ДанныеBase64) - ?(Прав(ДанныеBase64,1) = "=",1,0) - ?(Прав(ДанныеBase64,2) = "==",1,0);
Сообщить("Размер вычисляемый:		" + Цел(ДлинаФайла/4*3));
Показать


Результат:

Размер файловой системы:25 567 558
Размер двоичных данных: 25 567 558
Размер вычисляемый: 26 366 544


Проверял на 1С:Предприятие 8.2 (8.2.19.130), но сомневаюсь что в этом беда.
Неизвестно как эта погрешность зависит от размера файла - не вижу практического смысла даже измерять насколько неверный инструмент если он неверный.
На основании предложенного алгоритма написано много обработок которые измеряют размер и все ими пользуются - а в результате оказывается что все это неверно.
Я правда проверял только на ДвоичныхДанных но мне хватило и этого, я все таки не ученый а практик - мне нужен верно работающий код, а не разбираться насколько он неверно работает.
Более того что вычисляется неверно, но явно присутствуют лишние вычисления. ДвоичныеДанные.Размер() дают верный размер без всяких дополнительных махинаций - ПОЛЬЗУЙТЕСЬ!

Мне сложно поверить что почти 10 лет эту ошибку никто не заметил, так что просьба кого-нибудь написать опровержение, иначе придется перепроверять все источники, что очень печально.
RidelAV; truba; kild; +3 Ответить
11. mikukrnet 182 03.06.20 15:52 Сейчас в теме
Туфта. Размер сжатых данных не покажет, только распакованный
12. mikukrnet 182 03.06.20 16:05 Сейчас в теме
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
	
	ЗначениеВФайл(ИмяВременногоФайла, Хранилище);
	
	Файл = Новый Файл(ИмяВременногоФайла);
        Размер = Файл.Размер();
        УдалитьФайлы(ИмяВременногоФайла);
	
Возврат Размер;
Показать
RidelAV; Zevzm; Goggy; sulfur17; +4 Ответить
20. RidelAV 17 22.11.23 11:02 Сейчас в теме
(12) У меня этот вариант тоже искажает истинный размер

Точнее получается вариант: ДвоичныеДанные.Размер()

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	//РеквизитСправочника  ФайлКартинки (Тип ХранилищеЗначения)
	
	ДД = ТекущийОбъект.Ссылка.ФайлКартинки.Получить();
	Размер = ДД.Размер();
	//Здесь правильный размер в байтах (Картинка размером 123153 Байт)
	
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
    ЗначениеВФайл(ИмяВременногоФайла, ТекущийОбъект.Ссылка.ФайлКартинки);
    Файл = Новый Файл(ИмяВременногоФайла);
        Размер = Файл.Размер();
        УдалитьФайлы(ИмяВременногоФайла);	
	//Здесь НЕ правильный размер в байтах (Картинка размером 170851 Байт)
КонецПроцедуры
Показать
13. Поручик 4598 04.06.20 09:24 Сейчас в теме
Здесь 90% туфты, и что теперь?
14. Milanick 01.02.23 18:01 Сейчас в теме
@Поручик, а подскажи, как определить размер документа в базе?

Обычно спрашивают у меня , когда хотят спрогнозировать рост базы от объема документов.
Я обычно беру размер таблицы и делю на количество документов - 5% на потери. Методика так себе, а есть что нибудь по эффектней?
15. tango 548 07.07.23 22:43 Сейчас в теме
(14) вы можете ещё взять таблицы табличных частей. индексы опять же. еще какая-нибудь скульная лабуда
16. tango 548 07.07.23 22:44 Сейчас в теме
(15) вот, кстати, а Поручик жив еще?
Арчи?
Шепот?
ау!
18. Поручик 4598 08.07.23 00:15 Сейчас в теме
(16) Не дождётесь. Живее всех живых.
popro; ivnik; +2 Ответить
19. tango 548 10.07.23 12:34 Сейчас в теме
17. tango 548 07.07.23 22:46 Сейчас в теме
(14) ага. есть еще "кастомизованный" обычай подвязывать к документу какие-нибудь левые регистры. и даже справочники
21. portal80 05.06.25 21:54 Сейчас в теме
Помещаю ТабличныйДокумент в хранилище Значений как узнать его размер?
Для отправки сообщения требуется регистрация/авторизация