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