При разработке на платформе 1С:Предприятие часто возникает задача получить данные из результата запроса или таблицы значений не в виде обычного массива, а в виде объекта СписокЗначений. Метод таблицы значений ВыгрузитьКолонку() всегда возвращает тип Массив. Разберем, как быстро загрузить полученные данные в список значений и выполнить обратное преобразование без использования циклов обхода.
Рассмотрим стандартную ситуацию, когда после выполнения запроса выгружается колонка таблицы. Чтобы не организовывать ручной перебор элементов через цикл Для Каждого, воспользуемся встроенным методом объекта СписокЗначений — ЗагрузитьЗначения().
Посмотрим на пример кода:
Рез = Запрос.Выполнить().Выгрузить();
ОфигенныйСписок = Новый СписокЗначений;
ОфигенныйСписок.ЗагрузитьЗначения(Рез.ВыгрузитьКолонку("ЗаказПокупателя"));
Разберем по шагам, как работает этот механизм:
ВыгрузитьКолонку("ИмяКолонки") у объекта ТаблицаЗначений формирует и возвращает одномерный Массив со всеми значениями указанной колонки.Новый СписокЗначений.ЗагрузитьЗначения() принимает массив в качестве параметра и заполняет список значениями элементов этого массива за один вызов.Важно: Метод ЗагрузитьЗначения() полностью очищает существующий список перед добавлением новых элементов. При этом заполняется исключительно свойство Значение каждого созданного элемента списка. Свойства Представление, Пометка и Картинка остаются с значениями по умолчанию.
Проанализируем обратную задачу, когда у нас уже есть заполненный СписокЗначений, и требуется быстро получить из него одномерный Массив значений.
Для этого в платформе предусмотрен парный метод ВыгрузитьЗначения(). Посмотрим на пример вызова:
МассивЗаказов = ОфигенныйСписок.ВыгрузитьЗначения();
Этот метод возвращает новый Массив, содержащий только свойства Значение элементов списка значений. Представления, пометки и картинки в массив не переносятся.
Рассмотрим особенности использования памяти при цепочке вызовов Выгрузить() -> ВыгрузитьКолонку() -> ЗагрузитьЗначения(). При обработке больших выборок данных создание промежуточной таблицы значений и промежуточного массива приводит к повышенному расходу оперативной памяти.
Если требуется заполнить список значений напрямую из запроса (особенно с установкой пользовательских представлений), эффективнее использовать прямой обход выборки:
СписокЗаказов = Новый СписокЗначений;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СписокЗаказов.Добавить(Выборка.ЗаказПокупателя, Выборка.ЗаказПокупателяПредставление);
КонецЦикла;
Выясним практические различия между типами коллекций:
ГДЕ Ссылка В (&Параметр) одинаково успешно передаются и Массив, и СписокЗначений).