Мощность коллекции 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 не будет опубликован. Обязательные поля помечены *