Мощность коллекции 1с8

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

Иногда при отладке нужно посчитать мощность коллекции. В 1С8 коллекции должны быть ограничены в размерах.

В сложных структурах сложно на глаз вычислить размер, а он все растет, и растет, причем непонятно где. Поэтому возможность вычислить мощность коллекции очень полезна.

Код по вычислению мощности выглядит так:

Функция обМощностьКоллекции(К) Экспорт

Перем Р, Эл, Кол;

Р = 0;

Попытка

Для Каждого Эл Из К Цикл //Список, Структура, Соответствие, ТЗ

Попытка

Р = Р + обМощностьКоллекции(Эл.Значение); //Список, Структура, Соответствие

Исключение

КонецПопытки;

Попытка

Для Каждого Кол Из К.Колонки Цикл

Р = Р + обМощностьКоллекции(Эл[Кол.Имя]);

КонецЦикла;

Исключение

КонецПопытки;



Р = Р + 1; //Один элемент есть

КонецЦикла;

Исключение

КонецПопытки;

Возврат Р;



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



Для проверки можно использовать структуру мощностью 10:

П = Новый Структура();

П.Вставить("ТЗ", Новый ТаблицаЗначений());

П.ТЗ.Колонки.Добавить("Зн");

Стр = П.ТЗ.Добавить();

Стр.Зн = Новый СписокЗначений();

Стр.Зн.Добавить(1);

Стр.Зн.Добавить(2);



СС = Новый Структура();

СС.Вставить("Ага", 1);

СС.Вставить("БугАга", 2);



Стр = П.ТЗ.Добавить();

Стр.Зн = Новый Соответствие();

Стр.Зн.Вставить(1,1);

Стр.Зн.Вставить(2, СС);



Стр = П.ТЗ.Добавить();

Стр.Зн = "Маша";



Сообщить(обМощностьКоллекции(П));

 

Буду благодарен за выявленные ошибки.

15 Comments

  1. sCHTASS

    Эмм… Что-то никак не могу придумать практическое применение расчета мощности коллекции 1с.

    Reply ↓
  2. fixin

    (1) я использовал в отладчике. Чтобы понимать, большая у меня структура или нет. Это в некоторых случаях важно.

    Reply ↓
  3. serega3333

    похоже на очередной пример по применению рекурсии

    Reply ↓
  4. amiralnar

    СтрДлина(ЗначениеВСтрокуВнутр(Коллекция))

    Reply ↓
  5. fixin

    (3) рекурсия — один из мощных инструментов программирования, не удивительно что она тут применяется.

    Reply ↓
  6. fixin

    (4) это в чем? в условных байтах? Меня интересует количество вложенных объектов.

    Кстати, попробуй зацикленную структуру преобразовать во внутреннюю строку и вылетишь из программы.

    Правда я не помню, я учитываю циклы или нет.

    Reply ↓
  7. WaterSmith

    С «попытками» не аккуратненько как-то, может лучше было бы все же проверять типы значений?

    И понятие «большой» структуры очень расплывчато. Если важна например нагрузка на память, то мне кажется, вариант предложенный (4) информативнее. Ну а то, что он банально проще, это и так видно всем =)

    А как образец рекурсии конечно пойдет.

    Reply ↓
  8. WaterSmith

    (6) «Зацикленная структура», это как? Нет умом я понимаю, чисто теоретически, это структура содержащая в одном из элементов себя, ссылку на саму себя. Только вот как создать такое из списков, структур, соответствий и ТЗ?

    Reply ↓
  9. fixin

    (8)

    С = Новый Структура();

    С.Вставить(«С», С);

    Reply ↓
  10. WaterSmith

    (9) Хм, допустим, а зачем? Я к тому, что это ведь уже ошибочная ситуация?

    Reply ↓
  11. fixin

    (10) вы что, программирование не изучали? Не знаете где применяются рекурсивные ссылки?

    подумайте, или вам сразу разжевать. Пример — закольцованный список, например (Prev, Next)

    Reply ↓
  12. Трактор

    (10)

    это ведь уже ошибочная ситуация?

    Ошибочная или нет — не важно. Главное что это возможная ситуация.

    Reply ↓
  13. WaterSmith

    (11) Не изучал. Подумаю =)

    Но если у вас была закольцованная структура, то где в вашем алгоритме условие выхода? По моему ваш алгоритм зациклиться при закольцованной структуре.

    Reply ↓
  14. fixin

    (7) честно говоря, уже не помню, зачем мне это нужно было. видимо, нужна была нагрузка на память. но структура точно была закольцована.

    Reply ↓
  15. amiralnar

    (6)

    Меня интересует количество вложенных объектов.

    СтрЧислоВхождений(ЗначениеВСтрокуВнутр(Новый Структура(«Стркутура», Новый Структура(«Структура»))), «{«»#»»») = 2

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *