Деление массива на пакеты размером N для отправки в телеграмм

19.07.24

Интеграция - Мессенджеры и боты

Недавно у нас с коллегами возникла задача раз в сутки (с помощью регламентного задания) отправлять в телеграмм все номенклатурные позиции, у которых реквизит "СтавкаНДС" отличается от значения "Без НДС". И так как таких позиций к этому времени в базе было заведено уже достаточно большое количество, возникла проблема при отправке всей номенклатуры разом (одним сообщением). Поэтому было принято решение поделить выгружаемые данные на пакеты, и вот как мы это сделали.

На первом этапе получаем массив выгружаемых данных. В моем случае это простенький запрос. 
 

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Номенклатура.Представление КАК Представление
		|ИЗ
		|	Справочник.Номенклатура КАК Номенклатура
		|ГДЕ
		|	Номенклатура.СтавкаНДС <> ЗНАЧЕНИЕ(Справочник.СтавкиНДС.БезНДС)
		|	И Номенклатура.СтавкаНДС <> ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)"; 
	
	Результат = Запрос.Выполнить(); 
	
	Если Результат.Пустой() Тогда
		Возврат;
	КонецЕсли; 
	
	МассивНоменклатуры = Результат.Выгрузить().ВыгрузитьКолонку("Представление");

Затем нам эти данные необходимо разделить, так как при отправке слишком длинного сообщения в телеграмм мы получаем ошибку "timed out".

Для этого применяем следующий алгоритм:
 

        РазмерПорции = 20;
	Результат = Новый Массив;
	Счетчик = 0; 
	СчетчикПорции = 0; 
	
	Пока Истина Цикл    
		Если РазмерПорции >= МассивНоменклатуры.Количество() Тогда   
			Если Результат.Количество() <> 0 Тогда
				ОтправитьВтелеграм(Результат);        
			КонецЕсли;
			ОтправитьВтелеграм(МассивНоменклатуры);
			Прервать; 
		КонецЕсли;
		Если СчетчикПорции = РазмерПорции Тогда
			СчетчикПорции = 0;  
			ОтправитьВтелеграм(Результат);
			Результат.Очистить(); 
			
		КонецЕсли;                        
		Результат.Добавить(МассивНоменклатуры[0]);  
		
		МассивНоменклатуры.Удалить(0);
		СчетчикПорции = СчетчикПорции + 1;
	КонецЦикла;         

То есть, мы создаем вечный цикл, условием выхода из которого возможность отправить все оставшиеся номенклатурные позиции одной порцией (размер порции может быть любым, в данном примере было решено взять 20 элементов). И затем последовательно добавляем элементы из основного массива в массив порции, пока не раздуем его до размера самой порции. Параллельно происходит удаление элементов из основного массива, это необходимо для корректной проверки условия выхода из цикла. И на последней итерации, когда размер исходного массива становится равен размеру порции, отправляем его и также, при необходимости, отправляем массив-порцию (так как если число элементов в исходном массиве не кратно порции, то этот массив будет не пустой, и мы потеряем часть выгружаемых данных).

С радостью жду более оптимальных решений данной задачи и обратной связи!

Массив Регламентное задание Телеграмм telegram tg Порция Разделить массив

См. также

SALE! 25%

Мобильная разработка Мессенджеры и боты Платформа 1С v8.3 1С:Конвертация данных Платные (руб)

Теперь создать telegram-бота - элементарно. Достаточно просто нарисовать блок-схему телеграм-бота, и он сразу заработает. Это возможно при использовании Графического конструктора телеграм-ботов. Это единственный конструктор ботов для telegram, чье качество и функционал подтверждены фирмой 1С, есть сертификат 1С:Совместимо. Расширение в интерактивном режиме, с помощью блок-схем, позволяет с минимальными трудозатратами создать телеграм-ботов в любой конфигурации, работающей на платформе «1С:Предприятие 8.3».

13200 9900 руб.

27.12.2021    36716    98    161    

192

Мессенджеры и боты Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Интеграция мессенджера WhatsApp и 1С: УНФ, УТ, КА, ERP - отправка и получение сообщений, картинок, файлов и видео прямо в 1С. Расширение работает с сервисом GreenApi.

15600 руб.

23.06.2023    7937    49    11    

27

Мессенджеры и боты Программист Пользователь Платформа 1С v8.3 Платные (руб)

Мощный модуль для интеграции 1С с чат-ботами: Telegram, Viber, WhatsApp, WhatsApp Business, Instagram, ICQ, Facebook, Vkontakte, Skype, Одноклассники, Яндекс.Алиса, Avito а так же виджеты чата для сайтов: Verbox, Jivochat. Это универсальное и эффективное решение с большими возможностями, простым интерфейсом, наличием визуального конструктора, базовыми сценариями поведения из коробки, позволяющий запустить чат-ботов в течении 1-го дня.

65000 руб.

08.10.2019    59892    35    0    

157

Мессенджеры и боты Системный администратор Программист Бизнес-аналитик Пользователь Руководитель проекта Платформа 1С v8.3 Платные (руб)

Развитие популярного решения для интеграции мессенджера Telegram с нашей любимой 1С - конструктор чат-ботов в Телеграм.

15000 руб.

18.06.2021    63796    307    272    

360

Документооборот и делопроизводство (СЭД) Мессенджеры и боты Учет документов Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 Платные (руб)

Расширение для согласования справочников и документов в основных типовых конфигурациях. Ролевая адресация, условная маршрутизация, чат-бот telegram, интеграция с n8n, последовательное и параллельное согласование, уведомление о новых задачах на почту, блокировка объектов в зависимости от статуса, запрет проведения в зависимости от статуса, автозапуск процессов согласования, отчеты по исполнительской дисциплине. Не требуется снятие конфигурации с поддержки. Настройка без программирования. Версия для 1cfresh.com. Сертификат 1С-Совместимо.

14900 руб.

15.11.2018    29364    33    48    

67

Мессенджеры и боты SMS рассылки Платформа 1С v8.3 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Решение реализовано в виде расширения. Заменяет отправку смс на отправку в WhatsApp через Green-api. Отправка чека картинкой.

7800 руб.

15.05.2024    1190    3    6    

4
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Ins3nsE 19.07.24 17:16 Сейчас в теме
РазмерПорции = 20;
Результат = Новый Массив;

Для Индекс = 0 По МассивНоменклатуры.ВГраница() Цикл

    Результат.Добавить(МассивНоменклатуры.Получить(Индекс));
    
    Если Результат.Количество() = РазмерПорции Или Индекс = МассивНоменклатуры.ВГраница()  Тогда
        ОтправитьВтелеграм(Результат);
        Результат = Новый Массив;
    КонецЕсли;   
    
КонецЦикла;
Показать

https://forum.infostart.ru/forum9/topic253486/
dhurricane; Xershi; +2 Ответить
2. kalyaka 1098 20.07.24 22:49 Сейчас в теме
Деление массива на пакеты размером N
Вот мое решение для данной части заголовка:
//  Создание массива чисел от 1 до 100
ИсходныйМассив = РаботаСМассивом.Диапазон(1, 101);
Сообщить(ОбщийКлиентСервер.ОбъектВJSON(ИсходныйМассив));
//  Формирование подмассивов по 10 чисел
Шаг = 10;
Для Каждого Индекс Из РаботаСМассивом.Диапазон(0, 100, Шаг) Цикл
    Срез = РаботаСМассивом.Срез(ИсходныйМассив, Индекс, Индекс + Шаг);
    Сообщить(ОбщийКлиентСервер.ОбъектВJSON(Срез));
КонецЦикла;
Показать

, где Шаг - размер пакета. Здесь использованы абстракции из моей подсистемы АТДМассив
Оставьте свое сообщение