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

19.07.24

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

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

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

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

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

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

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

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

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

Вступайте в нашу телеграмм-группу Инфостарт

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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

SALE! 50%

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

Расширение 1С с полным набором инструментов для качественных транзакционных, триггерных и маркетинговых рассылок Email, SMS, MAX, WhatsApp, Telegram. Даже простые уведомления об оплате счетов способны существенно упростить сбор дебиторской задолженности. Применение всех возможностей прямого маркетинга выводит коммуникацию с клиентами, уровень сервиса и лояльность на новый уровень.

6100 3050 руб.

07.04.2014    98268    89    205    

172

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

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

30500 руб.

23.06.2023    18074    60    27    

62

Мессенджеры и боты 1С 8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Готовый чат-бот MAX для 1С виде расширения. Клиенты проверяют остатки и заказы прямо в мессенджере. Ролевая модель, гибкое меню, отправка файлов, диалоги. Подключайте свою логику через внешние обработки.

14640 руб.

26.03.2026    2842    4    0    

7

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

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

14900 руб.

15.11.2018    43179    58    60    

87

Мессенджеры и боты 1С:Предприятие 8 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Управление голосовыми ботами TWIN из 1С. Автоматизация звонков. Расширение позволяет разрабатывать свои обработки, которые могут программно создавать и запускать Задания для TWIN и получать из них результаты звонков.

12200 руб.

17.12.2024    1797    1    0    

1

Логистика, склад и ТМЦ Интеграция Роли и права Мессенджеры и боты Пользователь 1С:Предприятие 8 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 Платные (руб)

Готовое решение для 1С:УТ 11.5 и 1С:УНФ 3.0, которое дает менеджерам, торговым представителям и руководителям быстрый доступ к остаткам, ценам и данным по номенклатуре прямо в MAX и Telegram. Поиск по наименованию, артикулу, коду и штрихкоду, избранное, персональные настройки складов и видов цен для каждого пользователя. База 1С не обязательно должна публиковаться в открытый интернет для конечных пользователей: решение может работать во внутреннем контуре компании через опубликованный HTTP-сервис 1С и отдельную серверную часть бота. Экономичная альтернатива отдельному мобильному приложению для отдела продаж: быстрее запуск, ниже затраты, меньше ручных уточнений между менеджером, складом и офисом. По запросу доступны демонстрация, проверка совместимости и обсуждение адаптации под ваши процессы.

5978 руб.

10.03.2026    1115    1    0    

2

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

Модуль отправки уведомлений и документов из 1С в мессенджер MAX. Счета, статусы заказов, автоподстановка данных. Без абонентской платы и скрытых комиссий.

5490 руб.

10.04.2026    1663    1    4    

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

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

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

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

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