Как организовать обход таблицы значений в 1С 8.3 для рассылки электронных писем?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При переходе с версии 1С 7.7 на платформу 1С 8.3 разработчики часто сталкиваются с различиями в синтаксисе обхода коллекций данных. Старые методы, такие как ВыбратьСтроки() и ПолучитьСтроку(), в восьмой версии платформы больше не применяются. Разберем, как правильно организовать выборку из таблицы значений для отправки электронных писем контрагентам и прикрепления файлов вложений.

Различия в обходе коллекций между 1С 7.7 и 1С 8.3

В платформе 1С 7.7 выборка строк из таблицы значений выполнялась с помощью явного открытия выборки и цикла по текущим строкам. В 1С 8.3 работа с объектом ТаблицаЗначений устроена иначе: платформа предоставляет прямую коллекцию строк, для перебора которой используется цикл Для каждого ... Из ... Цикл.

Рассмотрим основные ошибки, с которыми можно столкнуться при переписывании старого кода:

  1. Использование устаревших методов: вызов функций вроде ВыбратьСтроку() или ПолучитьСтроку() вызовет ошибку отсутствия метода.
  2. Некорректное обращение к элементам формы: для получения самой таблицы значений из элемента формы обычных приложений обращаются к свойству Значение или напрямую к реквизиту формы.
  3. Смешение типов данных: инициализация переменных строковым значением (например, ВыбФайл = "") с последующей проверкой на число (Если ВыбФайл = 0) приводит к ошибкам приведения типов.

Реализация обхода таблиц значений получателей и файлов

Проанализируем задачу: на форме обработки расположены две таблицы значений — одна со списком дилеров (получателей), вторая со списком прикрепляемых файлов. Нам необходимо пройти по всем получателям, сформировать для каждого текст письма и прикрепить пути к файлам вложений.

Посмотрим на рабочий пример процедуры обработки нажатия кнопки отправки:


Процедура ОтправитьНажатие()
    КоличествоСтрок = ЭлементыФормы.ВыбДилеры.Значение.Количество();
    
    Если КоличествоСтрок <> 0 Тогда
        Сообщить("Количество получателей: " + КоличествоСтрок);
        
        // Внешний цикл по таблице получателей (дилеров)
        Для каждого СтрокаТаблицы Из ВыбДилеры Цикл
            Текст = ТекстПисьма;
            ТемаОтправки = ТемаПисьма;
            ФайлыСтрокой = "";
            
            // Внутренний цикл по таблице вложений
            Для каждого СтрФайл Из ВыбФайлы Цикл
                ФайлыСтрокой = ФайлыСтрокой + СтрФайл.Путь + ";";
            КонецЦикла;    
            
            // Вызов процедуры отправки письма
            глОтправитьОтчетПоПочте(ФайлыСтрокой, СтрокаТаблицы.Дилер, ТемаОтправки, 0, Текст, 2);
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

Разберем данный код по шагам:

  1. Сначала с помощью метода Количество() проверяем, есть ли строки в таблице получателей.
  2. Конструкция Для каждого СтрокаТаблицы Из ВыбДилеры Цикл позволяет последовательно получить доступ к каждой строке коллекции без явного управления индексами.
  3. Для каждой строки доступ к колонкам таблицы значений осуществляется напрямую через имя колонки, например: СтрокаТаблицы.Дилер или СтрФайл.Путь.
  4. Внутри главного цикла выполняется перебор второй таблицы с файлами ВыбФайлы, формируя список путей для передачи в процедуру отправки.

Важные особенности при массовой рассылке писем

При организации почтовой рассылки средствами 1С важно учитывать несколько технических нюансов работы с объектами электронной почты:

1. Кодирование файлов вложений в Base64. При добавлении бинарных файлов в почтовое сообщение (ИнтернетПочтовоеСообщение.Вложения) они кодируются в формат MIME Base64. Это увеличивает объём отправляемых данных примерно на 30–35%. Файл размером 4.5 МБ в письме будет занимать порядка 6 МБ, что может превысить допустимый лимит исходящего сообщения на SMTP-сервере.

2. Обработка ошибок в цикле. Чтобы сбой при отправке одному контрагенту не прерывал рассылку всем остальным, вызов отправки следует оборачивать в блок Попытка ... Исключение:


Для каждого СтрокаТаблицы Из ВыбДилеры Цикл
    Попытка
        глОтправитьОтчетПоПочте(ФайлыСтрокой, СтрокаТаблицы.Дилер, ТемаОтправки, 0, Текст, 2);
    Исключение
        Сообщить("Ошибка отправки дилеру " + СтрокаТаблицы.Дилер + ": " + ОписаниеОшибки());
    КонецПопытки;
КонецЦикла;

3. Время ожидания соединения (Таймаут). При передаче крупных вложений почтовому серверу может потребоваться больше времени на загрузку. В свойствах объекта ИнтернетПочтовыйПрофиль рекомендуется увеличивать параметр Таймаут (например, до 60–120 секунд).

← На главную