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