gifts2017

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

Опубликовал Сергей Ожерельев (Поручик) в раздел Программирование - Практика программирования

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

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

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

// Универсальная функция для определения размера данных (хранилища значения, двоичных данных, картинки, строки)
// Алгоритм расчета размера данных взят отсюда 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. Евгений Люлюк (Evg-Lylyk) 06.10.09 19:47
<Данные> - данные любого типа
Судя по коду для типа структура результат 9 для ТаблицаЗначений - 15 вообщем не любой тип
2. gilv (Gilev.Vyacheslav) 06.10.09 20:55
осталось эту функцию воткнуть в типовые конфигурации для проверки записываемых объемов памяти <=2Gb, чтобы потом платформа не падала.
3. Сергей Ожерельев (Поручик) 06.10.09 23:55
(1) ну в вобще-то да, не любого типа, а любого из указанных. На web-сервер таблицу или структуру 1С вы не передаёте, туда по сути уходят строковые данные
4. Trakt0risT Trakt0risT (Trakt0risT) 15.09.10 07:38
Есть только один вопрос! А какой максимальный может быть размер?
5. Яков Коган (Yashazz) 18.01.11 21:50
Или я чего-то не понял, или это лажа. Для строки функция возвращает обычную СтрДлина, а нифига не в байтах. Автор, тут есть хитрость?
6. Александр Цегельников (markers) 03.11.11 18:46
(5)Создайте текстовый файлик, в него набейте к примеру 10 символов, а теперь сохраните и посмотрите сколько он весит.
7. Никита Коротаев (bforce) 20.06.14 10:42
Неправильно считать размер строки в байтах по ее длине.
Например, строка "ЙЙ ШШ ЯЯ" будет иметь длину 8 символов, но размер 14 байт. Для этого ее просто нужно записать в файл в Юникоде.
У меня сейчас проблема как раз такая. Я формирую sql запрос и должен контролировать его размер, чтобы сервер его принял. Так как в запросе много русскоязычных символов, то реальный размер запроса превышает пороговое значение, не смотря на то, что по длине строки все было посчитано правильно.
8. Сергей Ожерельев (Поручик) 20.06.14 11:05
(7) Для тупыхДля тех, кто не понял. Создание темы 06.10.09, то есть в то время 8.2. была в зачаточном состоянии, а 8.1. не работала с юникодом.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа