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

19.07.24

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

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

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

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

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

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

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

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

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

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

См. также

Мессенджеры и боты Платформа 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    9747    59    13    

35

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

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

13200 руб.

27.12.2021    38449    109    163    

203

SALE! 25%

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

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

15000 11250 руб.

18.06.2021    65818    312    272    

369

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

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

14900 руб.

15.11.2018    30403    35    49    

71

Телефония, SIP Мессенджеры и боты Платформа 1С v8.3 Конфигурации 1cv8 Россия Управленческий учет Платные (руб)

Интеграция 1С с телефонией и чатами WhatsApp и Telegram автоматизирует работу оператора со звонками и чатами и добавит вашей 1С элементы CRM системы. Храните всю историю взаимоотношений в 1С, не теряйте звонки, скачивайте, прослушивайте в любое время из карточки клиента или журнала звонков, держите руку на пульсе, используя блок отчетов по звонкам. Интегрируйте вашу 1С и чатами WhatsApp и Telegram, общайтесь с клиентами с единого номера и в одном окне. Теперь чаты с клиентами хранятся в карточке партнера в 1С, а не в личных мобильных ваших менеджеров.

4100 руб.

28.04.2022    16028    18    10    

41

Мессенджеры и боты Пользователь Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Данное расширение представляет собой интерфейс взаимодействия 1С с сервисом Wazzup. Данный сервис позволяет вести беседу с использованием номера телефона, привязанного к Whatsapp. Почитать о сервисе и его условиях использования можно по ссылке https://wazzup24.com/. На данный момент расширение поддерживает почти все доступные через API функции. Обновление от 19.05.2023, версия 2.1!

14400 руб.

30.11.2020    13689    8    13    

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

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

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

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

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