При переходе с версии 1С 7.7 на платформу 1С 8.3 разработчики часто сталкиваются с различиями в синтаксисе обхода коллекций данных. Старые методы, такие как ВыбратьСтроки() и ПолучитьСтроку(), в восьмой версии платформы больше не применяются. Разберем, как правильно организовать выборку из таблицы значений для отправки электронных писем контрагентам и прикрепления файлов вложений.
В платформе 1С 7.7 выборка строк из таблицы значений выполнялась с помощью явного открытия выборки и цикла по текущим строкам. В 1С 8.3 работа с объектом ТаблицаЗначений устроена иначе: платформа предоставляет прямую коллекцию строк, для перебора которой используется цикл Для каждого ... Из ... Цикл.
Рассмотрим основные ошибки, с которыми можно столкнуться при переписывании старого кода:
ВыбратьСтроку() или ПолучитьСтроку() вызовет ошибку отсутствия метода.Значение или напрямую к реквизиту формы.ВыбФайл = "") с последующей проверкой на число (Если ВыбФайл = 0) приводит к ошибкам приведения типов.Проанализируем задачу: на форме обработки расположены две таблицы значений — одна со списком дилеров (получателей), вторая со списком прикрепляемых файлов. Нам необходимо пройти по всем получателям, сформировать для каждого текст письма и прикрепить пути к файлам вложений.
Посмотрим на рабочий пример процедуры обработки нажатия кнопки отправки:
Процедура ОтправитьНажатие()
КоличествоСтрок = ЭлементыФормы.ВыбДилеры.Значение.Количество();
Если КоличествоСтрок <> 0 Тогда
Сообщить("Количество получателей: " + КоличествоСтрок);
// Внешний цикл по таблице получателей (дилеров)
Для каждого СтрокаТаблицы Из ВыбДилеры Цикл
Текст = ТекстПисьма;
ТемаОтправки = ТемаПисьма;
ФайлыСтрокой = "";
// Внутренний цикл по таблице вложений
Для каждого СтрФайл Из ВыбФайлы Цикл
ФайлыСтрокой = ФайлыСтрокой + СтрФайл.Путь + ";";
КонецЦикла;
// Вызов процедуры отправки письма
глОтправитьОтчетПоПочте(ФайлыСтрокой, СтрокаТаблицы.Дилер, ТемаОтправки, 0, Текст, 2);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Разберем данный код по шагам:
Количество() проверяем, есть ли строки в таблице получателей.Для каждого СтрокаТаблицы Из ВыбДилеры Цикл позволяет последовательно получить доступ к каждой строке коллекции без явного управления индексами.СтрокаТаблицы.Дилер или СтрФайл.Путь.ВыбФайлы, формируя список путей для передачи в процедуру отправки.При организации почтовой рассылки средствами 1С важно учитывать несколько технических нюансов работы с объектами электронной почты:
1. Кодирование файлов вложений в Base64. При добавлении бинарных файлов в почтовое сообщение (ИнтернетПочтовоеСообщение.Вложения) они кодируются в формат MIME Base64. Это увеличивает объём отправляемых данных примерно на 30–35%. Файл размером 4.5 МБ в письме будет занимать порядка 6 МБ, что может превысить допустимый лимит исходящего сообщения на SMTP-сервере.
2. Обработка ошибок в цикле. Чтобы сбой при отправке одному контрагенту не прерывал рассылку всем остальным, вызов отправки следует оборачивать в блок Попытка ... Исключение:
Для каждого СтрокаТаблицы Из ВыбДилеры Цикл
Попытка
глОтправитьОтчетПоПочте(ФайлыСтрокой, СтрокаТаблицы.Дилер, ТемаОтправки, 0, Текст, 2);
Исключение
Сообщить("Ошибка отправки дилеру " + СтрокаТаблицы.Дилер + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
3. Время ожидания соединения (Таймаут). При передаче крупных вложений почтовому серверу может потребоваться больше времени на загрузку. В свойствах объекта ИнтернетПочтовыйПрофиль рекомендуется увеличивать параметр Таймаут (например, до 60–120 секунд).