Top.Mail.Ru
Меню
Каталог Программы 1С Опыт и отзывы Услуги Компания Интересное Контакты

Преобразовать динамический список в таблицу значений 1С 8.5 / 8.3

Основатель и генеральный директор компании MoscowSoft, Сорокин Сергей
Сорокин Сергей, Генеральный директор MoscowSoft  15.04.2025 Актуальность проверена: 30.04.2026   5 мин.
Содержание

Отличия между объектами в « Динамический список » и «Таблица значений»

Согласно документации , динамический список – это специальный реквизит формы, позволяющий отображать набор данных из базы или регистров. Такой список строится на основе Системы Компоновки Данных, то есть вы сами выбираете таблицу или пишете произвольный запрос. Система при этом автоматически читает строки порциями при навигации пользователя – список не хранится целиком. Иными словами, динамический список не имеет «итоговой» коллекции, которую можно сразу обойти. Интересно? Да, всё так: весь набор показывается постепенно. И если требуется работать с ним «на полном разгоне», лучше преобразовать динамический список в ТаблицуЗначений . Тогда все методы таблиц значений становятся доступны.

Зачем конвертировать динамический список в таблицу значений 1С

Задача извлечь все строки из динамического списка встречается часто. Например, может потребоваться обработать каждый элемент списка по очереди, или подсчитать итоговые данные (суммы, количество) по всем документам. Преобразование в ТаблицуЗначений решает задачу, когда необходимо применять любые методы, доступные для таблицы значений. Проще говоря, имея таблицу значений, мы можем обойти её построчно, суммировать поля, фильтровать данные и т.д. Например, если нужно найти сумму по колонке «СуммаДокумента» для всех строк, однотипные методы таблицы сделают это легко. Всё становится однородно и прозрачно: привычный цикл Для Каждого или методы подсчёта вместо сложных итераторов динамического списка. Кстати, повторим: после преобразования результат – обычная ТаблицаЗначений, а значит вы уже умеете с ней работать.

Как конвертировать динамический список в таблицу значений 1С

Чтобы «распаковать» данные списка, используем СКД: получаем его схему (запрос) и применяем ГенераторМакета для коллекции значений. Алгоритм выглядит так:

В итоге функция возвращает заполненную ТаблицуЗначений, содержащую все строки списка. Благодаря этому алгоритму динамический список превращается в обычную таблицу, и с ней можно работать привычно.

Пример кода «превращения» динамического списка в таблицу значений 1С

Ниже приведён полный пример серверной функции, которая читает данные элемента формы Элементы.Список и возвращает результат в виде таблицы значений (мы назвали её ТаблицаРезультат):

&НаСервере
Функция ДинСписокВТаблицу()
	// Получаем схему запроса и пользовательские настройки
	Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
	Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
	// Собираем макет СКД с генератором для коллекции значений
	Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
	Макет = Компоновщик.Выполнить(Схема, Настройки,,,
			Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	// Инициализируем процессор компоновки и выводим результат
	Процессор = Новый ПроцессорКомпоновкиДанных;
	Процессор.Инициализировать(Макет);
	ТаблицаРезультат = Новый ТаблицаЗначений;
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат);
	ПроцессорВывода.Вывести(Процессор, Истина);
	Возврат ТаблицаРезультат;
КонецФункции

В этом примере Элементы.Список – это ссылка на элемент формы динамического списка (его имя в форме). Функция должна быть серверной, так как обращается к объектам формы и СКД. После выполнения вызова пользователь получит готовую таблицу значений со всеми данными.

Особенности версий платформы 8.5/8.3

Метод, описанный выше, доступен в актуальных версиях платформы. Начиная с 1С:Предприятие 8.3.6.1977 появился «простой способ» получить таблицу значений из списка. В обновлениях 8.3.х и 8.5 (примерно 8.5.1+) соответствующие классы и генераторы поддерживаются. То есть предложенный код будет работать и на 8.5, и на 8.3 при условии, что версия платформы достаточно новая. Если же система старее (до 8.3.6), понадобится иная реализация или эмуляция – например, программная отрисовка ВременногоДокумента. Но для современных конфигураций ограничений нет. Просто скопируйте шаблон функции и замените Элементы.Список на ваш элемент формы.

Производительность конвертации динамического списка в таблицу значений 1С

Платформа оптимизирует работу с динамическими списками: данные загружаются порциями, чтобы экономить память. Однако описанный алгоритм сразу выполняет полный запрос по всем строкам. Это означает, что на больших объёмах данных потребуется больше ресурсов. Впрочем, как отмечают эксперты, даже при тысячах строк алгоритм работает довольно быстро. То есть для средних списков (несколько сотен строк) он безопасен и эффективен. Но важно помнить: если у вас действительно большая выборка (десятки тысяч записей), прямое преобразование может замедлить систему. Иногда лучше добавить ограничения (отборы) или загружать и обрабатывать данные партиями. Главное – не швырять весь документ одним махом, если можно его разбить.

Кстати, на скорую руку: всегда проверяйте реальные потребности. Опыт подсказывает, что начинающие часто удивляются, сколько же строк на самом деле скрывается за интерфейсом. Легко забыть, что 1000+ записей – это уже не тот «список дня», который можно безболезненно держать в памяти. Думается: разве не лучше сразу работать с запросами, отдающими оптимальные данные? Как бы там ни было, обеспечив корректную фильтрацию и сортировку, мы раз и навсегда связываем динамический список с ТаблицейЗначений – и это удобно.

Практические советы по конвертации списка в таблицу

При использовании этого приёма учтите несколько нюансов. Во-первых, функции ПолучитьИсполняемуюСхемуКомпоновкиДанных и ПолучитьИсполняемыеНастройкиКомпоновкиДанных вызывают элемент формы – функция должна быть серверной. То есть её логично разместить в модуле формы или общем модуле, но вызывать с сервера (например, из модуля формы или обработки). Во-вторых, задайте переменные осмысленные имена. В примерах часто используют ТекущийДинамическийСписок или просто ЭлементСписка для обозначения ссылки на форму, а ТаблицаРезультат или ТЗ – для результирующей таблицы значений. Это облегчит чтение кода. В-третьих, если дело идёт о нескольких списках на форме – убедитесь, что получаете именно тот элемент (Элементы.МойСписок), который нужен.

Наконец, не забывайте про нагрузку: чем больше строк, тем осторожнее нужно подходить к подобным «глобальным» операциям. Иногда проще сперва уточнить выборку через запрос «как надо» и лишь потом загружать остаток. В любом случае, наличие ТаблицыЗначений дает мощный инструмент анализа — вы можете сохранить результат, вывести в табличный документ, отправить на клиент – всё как с обычным отчётом. Ещё раз повторим: динамический список -> таблица значений – это почти всегда правильный шаг, когда вы хотите обрабатывать весь набор данных в памяти, а не кусками. Повторяю: после преобразования каждая строка списка станет строкой таблицы значений, и все стандартные методы станут доступны.

MoscowSoft логотип

Подпишитесь на телеграм-канал MoscowSoft!
QR-код (ссылка приглашение) в канал MoscowSoft

https://t.me/MoscowSoft

Публикуем:
- инструкции и советы по разработке на 1С;
- рекомендации по интеграции 1С;
- бесплатно делимся своими обработками;
- публикуем секретные спецпредложения только для подписчиков.

Возврат к списку