Сегодня 18 февраля (21 уже близко) 2023 года, 11 часов 46 минут, -7.
Всем доброго дня!
В это раз решил поделиться опытом разбиения большой таблицы значений на маленькие.
Кстати, давно интересовался этой темой, но среди готовых решений ничего выдающегося не нашел.
Итак, приступим.
Имеется документ, в который загружается большая таблица значений. Задача: создать несколько документов на основе таблицы с ограничением в 1500 строк.
исходный код имеет вид
ДокументОбъект.ТаблицаДокумента.Загрузить(ИсходнаяТаблицаЗначений)
Логично, что и нам было бы неплохо использовать аналогичный.
Нам нужен массив таблиц.
Пробегать по таблице и формировать новые не интересно.
Есть такой метод:
ТаблицаЗначений.Скопировать([Строки], [Колонки])
Имя параметра ТипОписание
Строки (необязательный) Массив. Массив строк для копирования. Если параметр не указан, копируются все строки таблицы значений
Колонки (необязательный)Строка. Перечисление имен копируемых колонок через запятую. Если параметр не указан, будут скопированы все колонки
Таким образом, методом копирования исходной таблицы мы сможем получить массив таблиц. Нужно только передать массив нужных строк для копирования.
В этой функции получаем массив необходимых строк для маленькой таблицы значений.
В виде параметров передаем начальную строку таблицы, конечную и саму таблицу. Тут все просто.
Функция ПолучитьМассивСтрокТаблицы(НачальнаяСтрока, КонечнаяСтрока, ПерТаблица)
МассивСтрок = Новый Массив;
Для н = НачальнаяСтрока по КонечнаяСтрока цикл
Стр = ПерТаблица.Получить(н);
МассивСтрок.Добавить(стр);
КонецЦикла;
Возврат МассивСтрок;
КонецФункции
В этой функции логика несколько сложнее. Нужно правильно передать необходимые параметры и помнить, что индекс первой строки начинается с 0. Пришлось повозится с отладчиком, чтобы все четко рассчитать.
Функция ПолучитьМассивТаблиц(перТаблица)
МассивТаблиц = Новый Массив;
КоличествоСтрокВДокументе = 1500;
КоличествоСтрокТаблица = перТаблица.Количество();
НачальнаяСтрока = 0;
ОстатокСтрокВТаблице = КоличествоСтрокТаблица;
КонечнаяСтрока = Мин(КоличествоСтрокВДокументе -1, ОстатокСтрокВТаблице-1);
Пока ОстатокСтрокВТаблице > 0 цикл
МассивСтрок = ПолучитьМассивСтрокТаблицы(НачальнаяСтрока, КонечнаяСтрока, перТаблица);
Таб = перТаблица.Скопировать(МассивСтрок);
МассивТаблиц.Добавить(Таб);
ОстатокСтрокВТаблице = ОстатокСтрокВТаблице - (КонечнаяСтрока-НачальнаяСтрока+1);
НачальнаяСтрока = КонечнаяСтрока + 1;
КонечнаяСтрока = Мин(КонечнаяСтрока+КоличествоСтрокВДокументе, КонечнаяСтрока + ОстатокСтрокВТаблице);
КонецЦикла;
Возврат МассивТаблиц;
КонецФункции
Таким образом, мы имеем массив таблиц и можем с легкостью использовать цикл по массиву.
что-то типа:
Для Каждого СтрокаМассива из МассивТаблиц Цикл
... создаем документ
ДокументОбъект.ТаблицаДокумента.Загрузить(СтрокаМассива);
...дальнейшие действия (сохранение, проведение)
КонецЦикла;
Удачи!
И, напоследок, как видит нейросеть желтую коробку с надписью 1С