Отправка почты через CDO (работает c SSL) &НаСервереБезКонтекста
Функция ПолучитьДанныеЯщикаСистемнойЗаписи()
СистемнаяУчетнаяЗаписьЭлектроннойПочты = Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты;
СтруктураНастроек = Новый Структура;
СтруктураНастроек.Вставить("СерверSMTP", СокрЛП(СистемнаяУчетнаяЗаписьЭлектроннойПочты.СерверИсходящейПочтыSMTP));
СтруктураНастроек.Вставить("ПользовательSMTP",СокрЛП(СистемнаяУчетнаяЗаписьЭлектроннойПочты.ПользовательSMTP));
СтруктураНастроек.Вставить("ПарольSMTP", СокрЛП(СистемнаяУчетнаяЗаписьЭлектроннойПочты.ПарольSMTP));
СтруктураНастроек.Вставить("ПортSMTP", СистемнаяУчетнаяЗаписьЭлектроннойПочты.ПортSMTP);
СтруктураНастроек.Вставить("Отправитель", СокрЛП(СистемнаяУчетнаяЗаписьЭлектроннойПочты.АдресЭлектроннойПочты));
СтруктураНастроек.Вставить("ИспользоватьSSL", СистемнаяУчетнаяЗаписьЭлектроннойПочты.ИспользоватьSSL);
Возврат СтруктураНастроек;
КонецФункции
//обработка, пример который приведен содержит ТЧ "НаОтправку" с реквизитами "Контрагент" - ссылка на справочник и "Файл" - строка, путь к файлу
//ПолучитьМассивКлиентов() - функция возвращает перечень всех клиентов из данной ТЧ
//
//АдресПолучателя(ЭлементМассива) - функция возвращает e-mail клиента
&НаКлиенте
Процедура ОтправкаПисем()
//тут был прочий код, не относящийся к отправке, он удален
МассивКлиенты = ПолучитьМассивКлиентов();
Для Каждого ЭлементМассива Из МассивКлиенты Цикл
//***************************************
Если АдресПолучателя(ЭлементМассива) = "" Тогда
Сообщить("У контрагента "+ЭлементМассива+" не указан email, письмо отправлено не будет!");
Продолжить;
КонецЕсли;
Кому = АдресПолучателя(ЭлементМассива);
Тема = "Документы";
Текст = "Документы";
СтруктураНастроек = ПолучитьДанныеЯщикаСистемнойЗаписи();
CDO_СерверSMTP = СтруктураНастроек.СерверSMTP;
CDO_ПользовательSMTP = СтруктураНастроек.ПользовательSMTP;
CDO_ПарольSMTP = СтруктураНастроек.ПарольSMTP;
CDO_ПортSMTP = СтруктураНастроек.ПортSMTP;
Отправитель = СтруктураНастроек.Отправитель;
ИспользоватьSSL = СтруктураНастроек.ИспользоватьSSL;
Письмо = Новый COMОбъект("CDO.Message");
Письмо.to = Кому;
Письмо.from = Отправитель;
Письмо.Sender = Отправитель;
//Письмо.cc=Копия;
//Письмо.bcc=СкрКопия;
Отбор = Новый Структура();
Отбор.Вставить("Контрагент",ЭлементМассива);
НайденныеСтроки = Объект.НаОтправку.НайтиСтроки(Отбор);
Для КАЖДОГО СтрДокументы ИЗ НайденныеСтроки ЦИКЛ
Письмо.AddAttachment(СокрЛП(СтрДокументы.Файл));
КонецЦикла;
Письмо.Subject = Тема;
Письмо.TextBody = Текст;
Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = 2;
Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = CDO_СерверSMTP;
Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value = 1;// 0 - Do not authenticate; 1 - basic (clear-text) authentication; 2 - NTLM
Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername").Value = CDO_ПользовательSMTP;
Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value = CDO_ПарольSMTP;
Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = CDO_ПортSMTP;
Если ИспользоватьSSL Тогда
Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl").Value = True;
КонецЕсли;
//Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl").Value = ИспользоватьSSL;
Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout").Value = 60;
Попытка
Письмо.Configuration.Fields.Update();
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Попытка
Письмо.Send();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Сообщить("Все...");
КонецПроцедуры
Категория:
Работа с Интернет, Почтой (Mail), FTP Табличная часть ~ Как получить массив строк по условию (отбору)? Для УП:
Код 1C v 8.3
&НаКлиенте
. . . .
ФМ= Новый ФиксированнаяСтруктура( "КлючСвязи" , Элементы. ДанныеБезКоррекции. ТекущиеДанные. КлючСвязи) ;
Элементы. СписокПодразделений. ОтборСтрок= ФМ;
Код 1C v 8.3
Функция ПолучитьЗаписиСогласноОтбору(ТабличноеПолеИсточник)
ОтборСтрок = ТабличноеПолеИсточник. ОтборСтрок;
ПостроительЗапроса = Новый ПостроительЗапроса;
ПостроительЗапроса. ИсточникДанных = Новый ОписаниеИсточникаДанных( ТабличноеПолеИсточник. Значение) ;
Для Каждого ЭлементОтбора Из ОтборСтрок Цикл
Если ЭлементОтбора. Использование Тогда
НовыйОтбор = ПостроительЗапроса. Отбор. Добавить( ЭлементОтбора. Имя) ;
НовыйОтбор. Использование = Истина ;
НовыйОтбор. ВидСравнения = ЭлементОтбора. ВидСравнения;
НовыйОтбор. ЗначениеС = ЭлементОтбора. ЗначениеС;
НовыйОтбор. ЗначениеПо = ЭлементОтбора. ЗначениеПо;
НовыйОтбор. Значение = ЭлементОтбора. Значение;
КонецЕсли ;
КонецЦикла ;
Таблица = ПостроительЗапроса. Результат. Выгрузить( ) ;
МассивСтрок = Новый Массив;
Для Каждого Стр ИЗ Таблица Цикл
СтруктураПоиска = Новый Структура;
Для Каждого Колонка Из Таблица. Колонки Цикл
СтруктураПоиска. Вставить( Колонка. Имя, Стр[Колонка. Имя]) ;
КонецЦикла ;
НайденыеСтроки = ТабличноеПолеИсточник. Значение. НайтиСтроки( СтруктураПоиска) ;
Если НайденыеСтроки. Количество( ) > 0 Тогда
МассивСтрок. Добавить( НайденыеСтроки[0 ]) ;
КонецЕсли ;
КонецЦикла ;
Возврат МассивСтрок;
КонецФункции
Для Обычных форм:
Код 1C v 8.х ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("ДокСсылка", ДанныеПоШК.Объект);
НайденныеСтроки = ПакетДокументов.НайтиСтроки(ПараметрыОтбора);
// Подробнее
СтруктураОтбора = Новый Структура("ВидДокумента, Контрагент", ПФ, ?(Контр = Неопределено, Справочники.Контрагенты.ПустаяСсылка(), Контр));
ПакетДокументов = ЗадачаОбъект.ПакетДокументов;
МассивСтрок = ПакетДокументов.НайтиСтроки(СтруктураОтбора);
Если МассивСтрок.Количество() Тогда
Для Каждого СтрокаМассива Из МассивСтрок Цикл
СтрокаМассива.ДобавленоПользователем = Истина;
СтрокаМассива.Пользователь = ПараметрыСеанса.ТекущийПользователь;
СтрокаМассива.ДатаВремя = ТекущаяДата();
КонецЦикла;
КонецЕсли;
//или
ТЧ = ПромежуточнаяНакладная.Выгрузить();
ТЧ.Свернуть("СхемаПродажи");
СтрокаСПустойСП = ТЧ.НайтиСтроки(Новый Структура("СхемаПродажи", Справочники.СхемыПродаж.ПустаяСсылка()));
Если ТЧ.Количество() - СтрокаСПустойСП.Количество() > 1 Тогда
Если Вопрос("Сбросить все схемы в строках?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
НесколькоСхем = Истина;
Возврат;
КонецЕсли;
КонецЕсли;
Для каждого СтрокаПН из ПромежуточнаяНакладная Цикл
Если СтрокаПН.Номенклатура.ВидНоменклатуры.ТипНоменклатуры <> Перечисления.ТипыНоменклатуры.Услуга Тогда
СтрокаПН.СхемаПродажи = СхемаПродажи;
КонецЕсли;
КонецЦикла;
Категория:
Работа с Формой (Диалог) и её элементами Поиск в таблице значений по двум и более полям Двумя способами: объектным и запросом
Код 1C v 8.х ТЗ = Новый ТаблицаЗначений;
ТЗ. Колонки. Добавить( "Наименование" , Новый ОписаниеТипов( "Число" ) ) ;
ТЗ. Колонки. Добавить( "Серия" , Новый ОписаниеТипов( "Число" ) ) ;
НоваяСтрока = ТЗ. Добавить( ) ;
НоваяСтрока. Наименование = 123 ;
НоваяСтрока. Серия = 456 ;
НоваяСтрока = ТЗ. Добавить( ) ;
НоваяСтрока. Наименование = 123 ;
НоваяСтрока. Серия = 789 ;
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора. Вставить( "Наименование" , 123 ) ;
ПараметрыОтбора. Вставить( "Серия" , 789 ) ;
НайденныеСтроки = ТЗ. НайтиСтроки( ПараметрыОтбора) ;
Код 1C v 8.х
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ВТ_ТаблицаЗначений.Наименование,
| ВТ_ТаблицаЗначений.Серия
|ПОМЕСТИТЬ ВТ_ТаблицаЗначений
|ИЗ
| &ТЗ КАК ВТ_ТаблицаЗначений
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ТаблицаЗначений.Наименование,
| ВТ_ТаблицаЗначений.Серия
|ИЗ
| ВТ_ТаблицаЗначений КАК ВТ_ТаблицаЗначений
|ГДЕ
| ВТ_ТаблицаЗначений.Наименование = &Наименование
| И ВТ_ТаблицаЗначений.Серия = &Серия" ;
Запрос. УстановитьПараметр( "ТЗ" , ТЗ) ;
Запрос. УстановитьПараметр( "Наименование" , 123 ) ;
Запрос. УстановитьПараметр( "Серия" , 456 ) ;
Результат = Запрос. Выполнить( ) . Выгрузить( ) ;
Категория:
Работа с Таблицей Значений Как произвести поиск нескольких строк в "ТаблицаЗначений" по двум и более полям? Для поиска нескольких строк предназначен метод НайтиСтроки.
В платформе он определен таким образом.
Код 1C v 8.х НайтиСтроки( < Параметры_Отбора> )
Где
<Параметры_Отбора> представляют структуру, в которой ключ структуры определяет имя колонки, а значение структуры - искомое значение. Возвращает этот метод массив строк ТаблицыЗначений.
Стоит помнить, что массив содержит не копии строк, а ссылки на строки таблицы источника! Т.е. внеся изменения в строку из массива, вы изменяете строки в таблице.
Добавляя в структуру несколько записей вы, соответственно, устанавливаете отбор по нескольким полям.
Выглядит это примерно вот так:
Код 1C v 8.х ТЗРабочихДнейПоГрафику = Новый ТаблицаЗначений;
ТЗРабочихДнейПоГрафику. Колонки. Добавить( "месяцИнтервала" ) ;
ТЗРабочихДнейПоГрафику. Колонки. Добавить( "График" ) ;
ТЗРабочихДнейПоГрафику. Колонки. Добавить( "РабочихДней" ) ;
. . .
ОтборПоГрафику = Новый Структура;
ОтборПоГрафику. Вставить( "месяцИнтервала" , СтрокаПериода. МесяцПериода) ;
ОтборПоГрафику. Вставить( "График" , Групп_Задача. График) ;
НайденныеСтроки = ТЗРабочихДнейПоГрафику. НайтиСтроки( ОтборПоГрафику) ;
Автор: Андрей Окипний
Категория:
Работа с Таблицей Значений Соединение таблиц значений по ключевым полям Иногда при разработке большых отчётов и различных шахмоток приходится соединять таблицы из разных выборок по определенному полю, например выборка по продаже и выборка по производству объединяем по номенклатуре, в запросе бывает это делать неудобно т.к. в Таблицу можно присваивать различные структуры для расшифровок.
Сделал функцию которая объеденяет 2 таблицы в одну, на подобии полного соединения в запросе.
Код 1C v 8.х
Функция ПОЛНОЕ_СОЕДИНЕНИЕ(ТЗ1,ТЗ2,KEYт_str)
ТЗ = новый ТаблицаЗначений;
str = "" + KEYт_str;
KEYт_mas = новый Массив;
str = СтрЗаменить( str, "," , Символы. ПС) ;
Для N= 1 по СтрЧислоСтрок( str) Цикл
name = СтрПолучитьСтроку( str, N) ;
KEYт_mas. Добавить( name) ;
КонецЦикла ;
Для каждого KEYт из KEYт_mas Цикл
Если ( ТЗ1 . Колонки. Найти( KEYт) = неопределено )
ИЛИ ( ТЗ2 . Колонки. Найти( KEYт) = неопределено ) Тогда
Сообщить( "нет ключевой колонки" ) ;
возврат неопределено ;
КонецЕсли ;
КонецЦикла ;
Для каждого К Из ТЗ1 . Колонки Цикл
ТЗ. Колонки. Добавить( К. Имя) ;
КонецЦикла ;
Для каждого К Из ТЗ2 . Колонки Цикл
Если KEYт_mas. Найти( К. Имя) < > неопределено тогда
Продолжить;
КонецЕсли ;
ТЗ. Колонки. Добавить( К. Имя) ;
КонецЦикла ;
Для каждого стр1 Из ТЗ1 Цикл
Отбор = Новый Структура;
Для каждого KEYт из KEYт_mas Цикл
Отбор. Вставить( KEYт, стр1 [KEYт]) ;
КонецЦикла ;
Если ТЗ2 . НайтиСтроки( Отбор) . Количество( ) = 0 тогда
стр = ТЗ. Добавить( ) ;
Для каждого К Из ТЗ1 . Колонки Цикл
стр[К. Имя] = стр1 [К. Имя];
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
Для каждого стр1 Из ТЗ1 Цикл
Отбор = Новый Структура;
Для каждого KEYт из KEYт_mas Цикл
Отбор. Вставить( KEYт, стр1 [KEYт]) ;
КонецЦикла ;
НайденныеСтроки = ТЗ2 . НайтиСтроки( Отбор) ;
Если НайденныеСтроки. Количество( ) > 0 тогда
Для каждого стр2 Из НайденныеСтроки Цикл
стр = ТЗ. Добавить( ) ;
Для каждого К Из ТЗ1 . Колонки Цикл
стр[К. Имя] = стр1 [К. Имя];
КонецЦикла ;
Для каждого К Из ТЗ2 . Колонки Цикл
стр[К. Имя] = стр2 [К. Имя];
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
Для каждого стр2 Из ТЗ2 Цикл
Отбор = Новый Структура;
Для каждого KEYт из KEYт_mas Цикл
Отбор. Вставить( KEYт, стр2 [KEYт]) ;
КонецЦикла ;
Если ТЗ1 . НайтиСтроки( Отбор) . Количество( ) = 0 тогда
стр = ТЗ. Добавить( ) ;
Для каждого К Из ТЗ2 . Колонки Цикл
стр[К. Имя] = стр2 [К. Имя];
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
возврат ТЗ;
КонецФункци
Автор:
sashapere Категория:
Работа с Таблицей Значений