Showing posts with label 1С. Show all posts
Showing posts with label 1С. Show all posts

Monday, February 1, 2016

Отправка почты из под 1C через outlook

В обще дальнейшая часть автоматизации и веселостей от microsoft.
При отправке почтового сообщения через outlook api возникли проблемы

&НаКлиенте
Процедура Отправить(Команда)
Попытка
objOutlook = Новый COMОбъект("Outlook.Application");
Исключение
objOutlook = НЕопределено;
Возврат;
КонецПопытки;
myItem = objOutlook.CreateItem(0);
myRecipient = myItem.Recipients.Add("pd@rl.ua");
myRecipient.Type=1;
myItem.Subject = "Тест "+ТекущаяДата();
//myItem.Attachments.Add("C:\image.jpg");
myItem.HTMLBODY ="TEST";
myItem.Send();
КонецПроцедуры


при чем этот код работал нормально и письма уходили нормально.

А вот при отправке со стороны сервера была проблема


&НаКлиенте
Процедура Отправить(Команда)
ОтправитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОтправитьНаСервере()

Попытка
objOutlook = Новый COMОбъект("Outlook.Application");
Исключение
objOutlook = НЕопределено;
Возврат;
КонецПопытки;
myItem = objOutlook.CreateItem(0);
myRecipient = myItem.Recipients.Add("pd@rl.ua");
myRecipient.Type=1;
myItem.Subject = "Тест "+ТекущаяДата();
//myItem.Attachments.Add("C:\image.jpg");
myItem.HTMLBODY ="TEST";
myItem.Send();
//myItem.Display();
КонецПроцедуры



Первично проверил по инету, с наскоку решить проблему не удалось
1. http://infostart.ru/public/325873/ выполняем
Заходим на сервер приложений 1С под локальным админом
Запускаем DCOMCNFG (Консоль настроек "Component Services")
Открываем ветку Console Root -> Component Services -> Computers -> My computer -> DCOM Config
Ищем "Microsoft Excel Application"
Если нашли, то переходим к пункту 4 (Настраиваем свойства DCOM компонента "Microsoft Excel Application")
Закрываем "Component Services"
Настройка реестра
Запускаем REGEDIT
Открываем ветку Computer\HKEY_CLASSES_ROOT\AppID\EXCEL.EXE, если ее нет, то создаем
Создаем в ней строковый параметр AppID = {00020812-0000-0000-C000-000000000046}
Выполняем команду "mmc comexp.msc /32", которая делает то же что и DCOMCONFIG, но позволяет видеть 32 битные компоненты.
После этого в Component Services должен появиться "Microsoft Excel Application"
Настраиваем свойства DCOM компонента "Microsoft Excel Application"
Закладка "Security"
"Launch and Activation Permissions" - Customize - Edit
Добавляем пользователя, под которым запускается агент сервера 1С
Назначем ему только следующие права (allow):
Local Launch
Local Activation
"Access Permissions" - Customize - Edit
Добавляем пользователя, под которым запускается агент сервера 1С
Назначаем ему только следующие права (allow):
Local Access
Закладка "Identity"
Должно быть выбрано "The launching user"
Системные папки
Папка "C:\Windows\SysWOW64\config\systemprofile\Desktop\"
Проверяем наличие папки , если нет -то создаем.
Заходим в свойства этой папки.
Закладка Security
Добавляем, если нет, пользователя, под которым запускается агент сервера 1С
Добавляем право "Read" и "Write"
Папка "C:\Windows\System32\config\systemprofile\Desktop\"
Проверяем наличие папки , если нет -то создаем.
Заходим в свойства этой папки.
Закладка Security
Добавляем, если нет, пользователя, под которым запускается агент сервера 1С
Добавляем право "Read" и "Write"

После этого почта все также не уходила, сделал шаг
2. http://stackoverflow.com/questions/3750605/getting-creating-an-outlook-application-in-windows-7
In start menu select Run
Type dcomcnfg and click OK
Component Services window is opened.
Expand the nodes Component Services -> MyComputer -> DCOM Config .
Right click on the application (Outlook Message Attachment) and select properties.
Click on Identity tab whatever necessary.
Click on “The interactive user" then OK

Вот после этого почта стала уходить нормально.

Thursday, December 24, 2015

Получение PDF файла ЕН Новой почты

Простая функция по получению pdf для печати от новой почты

Функция вернутьPDF(знач DocumentRef) Экспорт
 СтрокаJSON = Новый ЗаписьJSON;
 СтрокаJSON.УстановитьСтроку();
 СтруктураЗнч = новый Структура;
 СтруктураЗнч.Вставить("apiKey","апи код новой почты");
 СтруктураЗнч.Вставить("modelName","InternetDocument");
 СтруктураЗнч.Вставить("calledMethod","printMarkings"); 
 Соот = Новый Соответствие;
 массивДокументов = новый Массив;
 массивДокументов.Добавить(DocumentRef);
 Соот.Вставить("DocumentRefs",массивДокументов);
 СтруктураЗнч.Вставить("methodProperties",Соот); 
 Настройка = Новый НастройкиСериализацииJSON;
 
 ЗаписатьJSON(СтрокаJSON, СтруктураЗнч,); 
 исхстрокаJSON = СтрокаJSON.Закрыть();
 
 
 Защищенное = Новый ЗащищенноеСоединениеOpenSSL;
 СоединениеHTTP = Новый HTTPСоединение("api.novaposhta.ua",,,,,,Защищенное);
 ЗапросHTTP = Новый HTTPЗапрос("/v2.0/json/");
 ЗапросHTTP.УстановитьТелоИзСтроки(исхстрокаJSON,КодировкаТекста.UTF8); 
 ЗапросHTTP.Заголовки.Вставить("Host","api.novaposhta.ua"); 
 ЗапросHTTP.Заголовки.Вставить("Content-Type","application/json"); 
 
 Результат = СоединениеHTTP.ВызватьHTTPМетод("POST",ЗапросHTTP);
 //.Получить(ЗапросHTTP);
 
 ВремФайлPDF = ПолучитьИмяВременногоФайла("pdf");
 ДВ = Результат.ПолучитьТелоКакДвоичныеДанные();
 ДВ.Записать(ВремФайлPDF);
 Возврат ВремФайлPDF;
КонецФункции

Friday, October 24, 2014

Добавление в конфигурацию поддержки присоединенных файлов

Для каждого «объекта с файлами» выполнить настройку:

1. Создать справочник для хранения присоединенных файлов. Для этого в качестве заготовки скопировать в конфигурацию справочник _ДемоПроектыПрисоединенныеФайлы из демонстрационной конфигурации и затем, задать ему имя по шаблону:

<Префикс>ПрисоединенныеФайлы,

где <Префикс> – имя объекта метаданных, для которого настраиваются присоединенные файлы. Например, для справочника Номенклатура справочник с файлами должен называться НоменклатураПрисоединенныеФайлы. Задать синоним, например: Присоединенные файлы (Номенклатура).

2. У реквизита ВладелецФайла установить тип – «объект с файлами». Например, СправочникСсылка.Номенклатура.

3. Измерению ОбъектСФайлами регистра сведений НаличиеПрисоединенныхФайлов, установить тип – «объект с файлами». Например, СправочникСсылка.Номенклатура

4. В состав типов измерения ПрисоединенныйФайл регистра сведения ПрисоединенныеФайлы включить справочник, созданный на шаге 1. Например, СправочникСсылка.НоменклатураПрисоединенныеФайлы.

5. Расширить тип параметра общей команды ПрисоединенныеФайлыКОбъекту, добавив в него тип – «объект с файлами». Например: СправочникСсылка.Номенклатура.

6. Расширить состав типов свойства Источник у подписок ПрисоединенныйФайлПередЗаписью, ПрисоединенныйФайлПередУдалением, ПрисоединенныйФайлПриЗаписи, включив в него тип – справочник с файлами, созданный на шаге 1. Например, СправочникОбъект.НоменклатураПрисоединенныеФайлы

7. Расширить состав типов свойства Источник подписки УстановитьПометкуУдаленияПрисоединенныхФайлов включив в него тип – «объект с файлами». Например, СправочникОбъект.Номенклатура.

Tuesday, August 5, 2014

Получение smtp адреса(реального) почты при работе с exchange через outlook

Дальнейшая доработка по работе с прайсами. Исходя из раньше описанной задачи необходимо обработать почту через outlook, а после отправить отправителю ответ уже средствами самой 1С в виде предварительно подготовленного прайса. Посмотрев то что дает в ответ outlook, я увидел вот такой адрес "/O=company/OU=EXCHANGE ADMINISTRATIVE GROUP (FYDIBOHF23SPDLT)/CN=RECIPIENTS/CN=USERBD7FBB0A",что совсем не подходит для работы SMTP. Как итог была переделана процедура из c# в 1с для обработки адреса:

Если ВРег(mail.SenderEmailType) = "EX" тогда
    recip = objNamespace.CreateRecipient(mail.SenderEmailAddress);
    exUser = recip.AddressEntry.GetExchangeUser();
    sAddress = exUser.PrimarySmtpAddress;
Иначе
    sAddress = mail.SenderEmailAddress
КонецЕсли;

Friday, August 1, 2014

Автоматическая загрузка прайса и работа с ФорматированныйДокумент

Есть у меня почтовая рассылка прайс листов из 1с. Сделана она с использованием ФорматированныйДокумент.
Лень, как известно двигатель прогресса, в общем надоело мне грузить картинки в рассылки каждый раз вручную, и задумался я над тем как сделать это все автоматом...
В общем логика состоит в том, что маркетинг высылаем письмо роботу на почту, робот почту анализирует и создает документ рассылки.
Нарвался на трудность в форматируемом документе, это отсутствие возможности отцентровать текст (сделать по центру). Решения в нете не нашел, сделал свое.

ТелоРассылки.ПолучитьHTML(ТекстHTML,Вложения);
			ТекстHTML = СтрЗаменить(ТекстHTML,"","
"center"">
"
); ТелоРассылки.УстановитьHTML(ТекстHTML,Вложения);

А ниже уже обработка по загрузке с почты прайсов.


Процедура КомандаGetНаСервере()
	//НЕ забываем проверить как запускает оутглюк!!!!  runas /user:rl\usr1cv82 "C:\Program Files\Microsoft Office\Office15\outlook.exe"
	//
	
	
	RegExp = Новый COMОбъект("VBScript.RegExp");
	//СтруктураФайлов = Новый СписокЗначений;
	RegExp.MultiLine = Истина; // истина — текст многострочный, ложь — одна строка 
	RegExp.Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения 
	RegExp.IgnoreCase = Истина; // истина — игнорировать регистр строки при поиске 	
	RegExp.Pattern = "Дата:.*(\d{4})/(\d{1,2})/(\d{1,2})";
	
	
	
	olFolderInbox = 6;
	Попытка
		objOutlook = Новый COMОбъект("Outlook.Application");
	Исключение
		objOutlook = НЕопределено;
		//Сообщить("Не удалось создать объект Outlook.Application. Outlook установлен на компьютер?");
		Возврат;
	КонецПопытки;
	
	objNamespace = objOutlook.GetNamespace("MAPI");
	objFolderInbox = objNamespace.GetDefaultFolder(olFolderInbox);
	colMails = objFolderInbox.Items.Restrict("[unread] = true");
	Для каждого mail из colMails Цикл
		попытка
			Body = mail.HTMLBody;
		Исключение
			Body = mail.Body;
		КонецПопытки;
    	Matches=RegExp.Execute(Body);
		Если RegExp.Test(Body) тогда
			Год = Matches.Item(0).SubMatches.Item(0);
			Если СтрДлина(Год)=2 тогда
				Год="20"+Год;
			КонецЕсли;
			Месяц = Формат(Matches.Item(0).SubMatches.Item(1),"ЧН=0; ЧВН=");	
			День = Формат(Matches.Item(0).SubMatches.Item(2),"ЧН=0; ЧВН=");	
			Path = "\\srv-1c-01.rl.int\Price\"+Год+Месяц+День;
			for each File in НайтиФайлы(Path,,true) do
				If не File.Name="Thumbs.db" then
					УдалитьФайлы(File.FullName);
				Endif;
			EndDo;
			Если НайтиФайлы(Path).Количество()=0 тогда
				СоздатьКаталог(Path);
			КонецЕсли;
			
			ДокСсылка  = ПроверкаДокументаВБазе(Дата(Год,Месяц,День));
			Если НЕ ДокСсылка.Пустая() тогда
				ДокОбъект = ДокСсылка.ПолучитьОбъект();
			Иначе
				ДокОбъект = Документы.РассылкаПрайсЛистов.СоздатьДокумент();
			КонецЕсли;
			ДокОбъект.Дата = Дата(Год,Месяц,День);
			ДокОбъект.ДатаОтправки = Дата(Год,Месяц,День)+8*60*60;
			ДОкОбъект.Ответственный = Справочники.Пользователи.ПолучитьСсылку(Новый УникальныйИдентификатор("d57cf6b5-3dcd-11e1-80e4-00155d040a09"));
			ДОкОбъект.Автор = Справочники.Пользователи.ПолучитьСсылку(Новый УникальныйИдентификатор("d57cf6b5-3dcd-11e1-80e4-00155d040a09"));
			ДокОбъект.Статус = Перечисления.СтатусыРассылкиПрайса.Согласован;
			ДокОбъект.Комментарий = "Сформирован автоматом "+ Формат(ТекущаяДата(),"ДФ='dd.MM.yyyy HH:mm:ss'");
			ДокОбъект.Тема = "Ежедневная рассылка прайс-листа  "+Формат(ДокОбъект.Дата,"ДФ='ддд dd/MM/yyyy'");
			ТелоРассылки = Новый ФорматированныйДокумент;
			ТекстHTML = Неопределено;
			Вложения = Неопределено;
						
			ТелоРассылки.ПолучитьHTML(ТекстHTML,Вложения);
			ТекстHTML = СтрЗаменить(ТекстHTML,"","
"center"">
"
); ТелоРассылки.УстановитьHTML(ТекстHTML,Вложения); ЕстьЧтоДобавлять = Ложь; For each Att in mail.Attachments do If Lower(Left(Att.FileName,5))="image" then Continue; EndIf; If Find("jpg,png,bmp,gif",Right(Att.FileName,3))> 0 then ЕстьЧтоДобавлять = Истина; Att.SaveAsFile(Path+"\"+Att.FileName); ТелоРассылки.Добавить(,ТипЭлементаФорматированногоДокумента.ПереводСтроки); ТелоРассылки.Добавить(Новый Картинка(Path+"\"+Att.FileName), ТипЭлементаФорматированногоДокумента.Картинка); endif; EndDo; ДокОбъект.Тело = Новый ХранилищеЗначения(ТелоРассылки,Новый СжатиеДанных(9)); ДокОбъект.Записать(РежимЗаписиДокумента.Проведение); КонецЕсли; КонецЦикла; //закрываем соединение Попытка objNamespace.Logoff(); objOutlook.Quit(); Исключение КонецПопытки; objNamespace = Неопределено; objFolderInbox = неопределено; objOutlook = НЕопределено; colMails = Неопределено; КонецПроцедуры Функция ПроверкаДокументаВБазе(ДатаДок) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 | РассылкаПрайсЛистов.Ссылка |ИЗ | Документ.РассылкаПрайсЛистов КАК РассылкаПрайсЛистов |ГДЕ | НЕ РассылкаПрайсЛистов.ПометкаУдаления | И НАЧАЛОПЕРИОДА(РассылкаПрайсЛистов.Дата, ДЕНЬ) = &Дата"; Запрос.УстановитьПараметр("Дата", ДатаДок); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Если ВыборкаДетальныеЗаписи.Следующий() Тогда Возврат ВыборкаДетальныеЗаписи.Ссылка; КонецЕсли; Возврат Документы.РассылкаПрайсЛистов.ПустаяСсылка(); КонецФункции
Работает это все на Windows 2008R2 x64 c Microsoft Office x64, outlook x64. и работает нормально, главное не забыть отключить безопасность в outlook.

Friday, August 30, 2013

УТ 11. Формирования отчета по всем доп. реквизитам и сведениям и свойствам

М-дя, на морочили 1С-цы с доп. реквизитами. очень долго искал как сделать что бы красиво и хорошо, но нету нет даже детальных предложений или вариантов что бы посмотреть кто как делал, поэтому предлагаю свою версию. Первоначально это только отчет, а уже автоматическая система ввода и изменения будет сделана после.
Покопавшись в конфигурации, решил делать все на СКД, так быстрее и проще, поэтому запрос по выборке данных будет такой:

ВЫБРАТЬ
 СпрНоменклатура.Ссылка КАК Номенклатура,
 НаборыДополнительныхРеквизитовИСведенийДополнительныеРеквизиты.Свойство,
 НоменклатураДополнительныеРеквизиты.Значение
ИЗ
 Справочник.Номенклатура КАК СпрНоменклатура
  ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК НаборыДополнительныхРеквизитовИСведенийДополнительныеРеквизиты
  ПО СпрНоменклатура.ВидНоменклатуры.НаборСвойств = НаборыДополнительныхРеквизитовИСведенийДополнительныеРеквизиты.Ссылка
  ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
  ПО СпрНоменклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка
   И (НаборыДополнительныхРеквизитовИСведенийДополнительныеРеквизиты.Свойство = НоменклатураДополнительныеРеквизиты.Свойство)
ГДЕ
 НЕ СпрНоменклатура.ЭтоГруппа 
В данном случае выбираем всю номенклатуру, цыпляем справочник НаборыДополнительныхРеквизитовИСведений, и уже после к табличной части номенклатуры ДополнительныеРеквизиты. Получаем полную информацию что заполнено, а что нет.


Теперь настройки


Ну и как итог постоитель

Saturday, June 1, 2013

Функция для 1С Предприятие 8.х проверки правильности e-mail

&НаСервере
Функция ПроверитьEmail(СтрокаПочты)
                  Pattern = "^[-a-z0-9!#$%&'*+/=?^_`{|}~]+(?:\.[-a-z0-9!#$%&'*+/=?^_`{|}~]+)*@(?:[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?\.)*";
                  RegExp = Новый COMОбъект("VBScript.RegExp");
                  RegExp.IgnoreCase = Истина;
                  RegExp.Global = Истина;
                  RegExp.MultiLine = Ложь;
                  RegExp.Pattern = Pattern;
                  Возврат RegExp.Test(СтрокаПочты);
КонецФункции

Friday, April 19, 2013

Функция для возврата только числа из любой строки

Возникла ситуация, когда необходимо преобразовать в число любую строку из 1с или другого com объекта (excel,word и т.п.) при чем строки могут быть разные и содержать разные данные, функция написана, что бы быстро преобразовать в число.

Функция ВернутьЧисло(Знач ВхСтрока)

Если ТипЗнч(ВхСтрока) = Тип("Число") Тогда
Возврат ВхСтрока;
КонецЕсли;

Если НЕ ЗначениеЗаполнено(ВхСтрока) Тогда
Возврат 0;
КонецЕсли;
Если ТипЗнч(ВхСтрока) <> Тип("Строка") Тогда
Возврат 0;
КонецЕсли;

ВхСтрока = СтрЗаменить(ВхСтрока, ",", ".");

RegExp = Новый COMОбъект("VBScript.RegExp");

RegExp.MultiLine = Истина; // истина — текст многострочный, ложь — одна строка
RegExp.Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения
RegExp.IgnoreCase = Ложь; // истина — игнорировать регистр строки при поиске

RegExp.Pattern = "[^0-9\.-]";

Реплайс = RegExp.Replace(ВхСтрока,"");
Если пустаяСтрока(Реплайс) тогда
возврат 0;
КонецЕсли;

RegExp.Pattern = "[+-]?\d+\.?\d*";
Matches = RegExp.Execute(Реплайс);
Если Matches.Count>0 тогда
Возврат Число( Matches.Item(0).Value);
КонецЕсли;
Возврат 0;
КонецФункции

Thursday, March 14, 2013

Изменение стандартных кнопок на командной панели 1С 8.х обычное приложение

Столкнулся с проблемой, необходимо была к привязной к таблице командной панели, оставить только часть необходимых кнопок, + добавить часть своих. На просторах нета нашел решение данной проблемы, правда только для одной кнопки, в данном случае предлагаю код для нескольких. Если необходимо добавить другие кнопки, в конфигураторе на необходимой панели включаем АвтоЗаполнение, сщелкаем на кнопках которые появились на панели и вписываем их номер ("Действие1") в массив.

Мас=Новый Массив;
Мас.Добавить(ЭлементыФормы.КоманднаяПанель2.Кнопки.Действие5.Действие);
Мас.Добавить(ЭлементыФормы.КоманднаяПанель2.Кнопки.Действие6.Действие);
Мас.Добавить(ЭлементыФормы.КоманднаяПанель2.Кнопки.Действие7.Действие);
Мас.Добавить(ЭлементыФормы.КоманднаяПанель2.Кнопки.Действие8.Действие);
ЭлементыФормы.КоманднаяПанель2.АвтоЗаполнение = Ложь;
Для каждого знчМас из Мас Цикл
ЭлементыФормы.КоманднаяПанель2.Кнопки.Добавить(СтрЗаменить(Строка(знчМас)," ",""),ТипКнопкиКоманднойПанели.Действие,СтрЗаменить(Строка(знчМас)," ",""),знчМас);
КонецЦикла;

Friday, February 22, 2013

1С СКД Проблемы при программной работе с настройкой компоновщика настроек

Сталкиваюсь постоянно с одной и той же ситуацией в работе в СКД, при программном генерации отчетов в управляемых формах, необходимо инициализировать настройки пользователя.
Фактически после прорисовки пользовательских настроек не возможно установить значения, так как при выборе значений дает выбирать базовые типы.

КомпоновщикНастроек.Инициализировать(Отчеты[НазваниеОтчета].ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"));
КомпоновщикНастроек.ЗагрузитьНастройки(Отчеты[НазваниеОтчета].ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных").ВариантыНастроек[ВаринтНастроек].Настройки);

Не знаю, что думал в 1С, но порывшись в нете нашел правильную схему формирования настроек

АдресСКД = ПоместитьВоВременноеХранилище(Отчеты[НазваниеОтчета].ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"), ЭтаФорма.УникальныйИдентификатор);
ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСКД);

КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек);
КомпоновщикНастроек.ЗагрузитьНастройки(Отчеты[НазваниеОтчета].ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных").ВариантыНастроек[ВаринтНастроек].Настройки);

Monday, February 11, 2013

Формирование отчета с использованием СКД и внешних наборов данных

Очень странно, но единой схемы в интернете по работе в системе компоновки данных я не нашел и на вылетающие ошибки пришлось потратить время, а так имеем задачу соединить остатки 2 разных баз "Управленческой" и бухгалтерской. Так как синхронизация в базах выполняется регулярно имеем одинаковые уникальные идентификаторы.
Начинаем
1. Создаем внешний отчет



1.1. В "наборы данных" добавляем "Набор данных - объединение"
1.2. В созданный набор добавляем "Набор данных - запрос" И формируем необходимый нам запрос с помощью конструктора.
1.3. В набор объединение добавляем также "Набор данных - объект" и прописываем поля которые будут загружены с таблицызначений, не забываем что поля должны совпадать с полями из набора данных запрос

2. После этого переходим в модуль объекта, и добавляем стандартную процедуру "ПриКомпоновкеРезультата". 1С автоматически генерирует процедуру со всеми входящими параметрами. И начинаем формировать заполнение процедуры



Exported from Notepad++




Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// При формирование отключаем стандартную обработку, в противном случае постоянно будет выдавать следующую ошибку
// Ошибка исполнения отчета
//по причине:
//Ошибка инициализации
//по причине:
//Ошибка создания набора данных "НаборДанных"
//по причине:
//Не найден внешний набор данных "ТаблОст"

СтандартнаяОбработка = Ложь;


//Формируем подключение к внешней базе 1с
Подкл = Новый COMОбъект("V82.COMConnector");
COMОбъект = Подкл.Connect("Srvr=""mws-01"";Ref=""GlobalBase"";Usr=""*****"";Pwd=""******""");

//Формируем запрос во внешней базе

Запрос = COMОбъект.NewObject("Запрос");

Запрос.Текст = "ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура,
| ТоварыНаСкладахОстатки.ВНаличииОстаток КАК КоличествоОстаток,
| ТоварыНаСкладахОстатки.ВРезервеОстаток КАК ВРезерве
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
|ГДЕ
| ТоварыНаСкладахОстатки.Склад В
| (ВЫБРАТЬ
| Склады.Ссылка
| ИЗ
| Справочник.Склады КАК Склады
| ГДЕ
| Склады.Родитель.Наименование = ""Центральные Склады"")"
;



Результат = Запрос.Выполнить();
//Получаем результат и создаем и заполняем таблицу значений в текущей
ТаблОст = Новый ТаблицаЗначений;
ТаблОст.Колонки.Добавить("Номенклатура",новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТаблОст.Колонки.Добавить("Организация",ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(10));
ТаблОст.Колонки.Добавить("КоличествоОстаток", ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(15,3));
ТаблОст.Колонки.Добавить("СуммаОстаток", ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(15,2));
Табл = Результат.Выгрузить();
Для х=0 по Табл.Количество()-1 Цикл
ЗначСтр = Табл.Получить(х);
НоваяСтрока = ТаблОст.Добавить();
//По уникальному идентификатору получаем значение и преобразуем в ссылку в текущей базе
НоваяСтрока.Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(COMОбъект.String(ЗначСтр.Номенклатура.УникальныйИдентификатор())));
НоваяСтрока.Организация = "Упр"; // формируем левое название, так как управленческой базы нет в бухгалтерии
НоваяСтрока.СуммаОстаток = 0;
НоваяСтрока.КоличествоОстаток = Число(ЗначСтр.КоличествоОстаток);
КонецЦикла;
COMОбъект = неопределено;
Подкл = неопределено;


ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ТаблОст",ТаблОст); // Формируем структуру для передечи в СКД


КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

НастройкиКомпоновкиДанных = КомпоновщикНастроек.ПолучитьНастройки();

ТекСхема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

МакетКомпоновки = КомпоновщикМакета.Выполнить(
ТекСхема,
НастройкиКомпоновкиДанных,
ДанныеРасшифровки
);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(
МакетКомпоновки,
ВнешниеНаборыДанных,
ДанныеРасшифровки
);

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.НачатьВывод();
ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
ПроцессорВывода.ЗакончитьВывод();

КонецПроцедуры



3. Далее, заполняем настройки, ресурсы и параметры

Как итог получаем отчет с нужными данными





Friday, February 8, 2013

Функция формирования навигационной ссылки для внешнего соединения 1С 8.2 Управляемые формы

У меня возникла ситуация, при рассылки сообщений при изменений статусов документов, через почту, с необходимостью указывать ссылку на документ, так как в работе используем 1С управляемые формы, до хватало ссылки на активацию через браузер, внизу сама функция формирования ссылки:



Exported from Notepad++




Функция ВернутьНавигационнуюСсылку(СсылкаНаОбъект) Экспорт
Возврат "http://ТутУказываетсяАдресСервера/ТутНазваниеБазы/#"+СтрЗаменить(ПолучитьНавигационнуюСсылку(СсылкаНаОбъект),"""","%22");
КонецФункции

Рассылка СКД отчетов из 1С с помощью фоновых заданий.

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

1. И самое основное для создания рассылки необходимо создать фоновое задание и процедуру формирования рассылки. Для этого я создал общий модуль "ПочтовыеРассылки" и установил в свойствах что он является "Серверным" и свойствах "Вызов сервера=Истина" + "Привилегированный=Истина".
Далее в него добавил 2 процедуры:

С процедурой отправить, думаю все понятно.


Exported from Notepad++



//Требование к запуску процедуры
//1.ДанныеПисьма = Структура
//1.1 ДанныеПисьма.Кому = массив адресат
//1.2 ДанныеПисьма.Вложения = массив строчный на файлы для вложения
//1.3 ДанныеПисьма.Тема - Тема письма
//1.4 Тело
//1.5 ОбратныйАдрес
//ДанныеПисьма = Новый Структура("Тема,Тело,Кому,Вложения");

Процедура Отправить(ДанныеПисьма) экспорт
//для получения доступа к набору свойств для соединения с сервером
//создадим новый объект
УстановитьПривилегированныйРежим(Истина);
Профиль = Новый ИнтернетПочтовыйПрофиль;

//Пропишем параметры соединения
//ip адрес или имя SMTP сервера
Профиль.АдресСервераSMTP = "*********";

//Порт SMTP сервера
Профиль.ПортSMTP = "***";

//Имя пользователя почтового ящика
Профиль.Пользователь = "***********";

//Пароль доступа к почтовому ящику
Профиль.Пароль = "******************";

//При необходимости добавляем аутентификацию
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.БезАутентификации;
//Профиль.ПарольSMTP = Профиль.Пароль;
//Профиль.ПользовательSMTP = Профиль.Пользователь;
// Создаем объект для работы с почтой
Почта = Новый ИнтернетПочта;

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

//Создаем новое письмо (сообщение)
Сообщение = Новый ИнтернетПочтовоеСообщение;
Если ДанныеПисьма.Свойство("ОбратныйАдрес") И ТипЗнч(ДанныеПисьма.ОбратныйАдрес)= Тип("Строка") тогда
Сообщение.ОбратныйАдрес.Добавить(ДанныеПисьма.ОбратныйАдрес);
Сообщение.Отправитель = ДанныеПисьма.ОбратныйАдрес;
КонецЕсли;

//Указываем отправителя
//Сообщение.Отправитель = "*********@*****";

Если ТипЗнч(ДанныеПисьма.Кому)= Тип("Строка") тогда
Сообщение.Получатели.Добавить(ДанныеПисьма.Кому);
ИначеЕсли ТипЗнч(ДанныеПисьма.Кому) = Тип("Массив") тогда
Для Каждого ЗначКому из ДанныеПисьма.Кому Цикл
Сообщение.Получатели.Добавить(ЗначКому);
КонецЦикла;
Иначе
//Если какая-то жопа то шлем мне
Сообщение.Получатели.Добавить("********@******");
КонецЕсли;


//Пишем тему письма
Сообщение.Тема = ДанныеПисьма.Тема;

//Формируем текст письма,указываем тип письма
Сообщение.Тексты.Добавить(ДанныеПисьма.Тело,ТипТекстаПочтовогоСообщения.HTML);

//При необходимости делаем вложение с файлом
Если ДанныеПисьма.Свойство("Вложения") тогда
Если ТипЗнч(ДанныеПисьма.Вложения)= Тип("Строка") тогда
Сообщение.Вложения.Добавить(ДанныеПисьма.Вложения);
ИначеЕсли ТипЗнч(ДанныеПисьма.Вложения) = Тип("Массив") тогда
Для Каждого Файл из ДанныеПисьма.Вложения Цикл
Сообщение.Вложения.Добавить(Файл);
КонецЦикла;
КонецЕсли;
КонецЕсли;

//Непосредственно отправка сообщения
Почта.Послать(Сообщение);

//После отправки закрываем соединение
Почта.Отключиться();
Сообщение = Неопределено;
Почта = Неопределено;
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры



// Передаем
//1. СхемаКомпоновкиДанных
//2. КомпоновщикНастроекКомпоновкиДанных
//3. СтрктуруПисьма - см. процедуру Отправить
//4. СтруктуруФайла отправки
//4.1. Файлом = Истина (если доп. вложением) Если ложь то html4 и вставляем в тело письма
//4.2 Типом файла

Процедура СформироватьИОтправитьОтчетПоПочте(СтруктураФормирования) Экспорт

УстановитьПривилегированныйРежим(Истина);
СхемаКомпоновкиДанных=СтруктураФормирования.СхемаКомпоновкиДанных;
//Настройки=СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
//Если СтруктураНастроек=Неопределено тогда
// КомпоновщикНастроекКомпоновкиДанных = СтруктураФормирования.КомпоновщикНастроекКомпоновкиДанных;
//Иначе
// КомпоновщикНастроекКомпоновкиДанных = СтруктураНастроек.КомпоновщикНастроекКомпоновкиДанных;
//КонецЕсли;


КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных;
//МакетКомпоновки=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроекКомпоновкиДанных.Настройки);
МакетКомпоновки=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, СтруктураФормирования.КомпоновщикНастроекКомпоновкиДанныхНастройки);
ПроцессорКомпоновки=Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ТабДок=Новый ТабличныйДокумент;
ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

ТемпФайл=ПолучитьИмяВременногоФайла(Строка(СтруктураФормирования.СтруктураФайла.ТипФайлаТабличногоДокумента));

//ТабДок.Записать(ТемпФайл,ТипФайлаТабличногоДокумента.HTML4);
ТабДок.Записать(ТемпФайл,СтруктураФормирования.СтруктураФайла.ТипФайлаТабличногоДокумента);
Если СтруктураФормирования.СтруктураФайла.Файлом тогда
СтруктураФормирования.СтрктуруПисьма.Вставить("Вложения",ТемпФайл);
Иначе
Текст = Новый ЧтениеТекста(ТемпФайл);
СтруктураФормирования.СтруктураПисьма.Вставить("Тело",Текст.Прочитать());
Текст = Неопределено;
КонецЕсли;

//Требование к запуску процедуры
//1.ДанныеПисьма = Структура
//1.1 ДанныеПисьма.Кому = массив адресат
//1.2 ДанныеПисьма.Вложения = массив строчный на файлы для вложения
//1.3 ДанныеПисьма.Тема - Тема письма
//1.4 Тело
//1.5 ОбратныйАдрес
//ДанныеПисьма = Новый Структура("Тема,Тело,Кому,Вложения");

//Отправить(ДанныеПисьма)

ПочтовыеРассылки.Отправить(СтруктураФормирования.СтруктураПисьма);
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры




А вот вторую процедуру опишу более подробно.
Процедура "СформироватьИОтправитьОтчетПоПочте" получает на входе в структуре следующие значения
1. СхемаКомпоновкиДанных - Схему компоновки данных СКД
2. КомпоновщикНастроекКомпоновкиДанныхНастройки - Настройки схемы компоновки данных, пробывал передавать компоновщик настроек, но по непонятным причинам при выполнении на сервере в структуру вместо компоновщика, передавалась схема. Поигравшись с разными вариантами, стал передавать только настройки, так как сам компоновщик мне и не нужен.
3. СтруктураФайла - в этой структуре я описываю, информацию по вложениям
3.1. СтруктураФайла.ТипФайлаТабличногоДокумента - Передается значение ТипФайлаТабличногоДокумента, если же формируем отчет в теле письма то передаем html4.
3.2. СтруктураФормирования.СтруктураФайла.Файлом - Булево, если значение = Истина, тогда файл передается вложением, если = Ложь - тогда в теле письма.
3.3. СтруктураФормирования.СтруктураПисьма - Передается структура для отправки.

Как итог создаем фоновую задачу для рассылки почты с необходимыми отчетами, в данном случае использую внешнуюю обработку как тестовый вариант, дабы не засорять конфигурацию иногда временными отчетами, как пример - акции для менеджеров.



Exported from Notepad++



Процедура ВыполнитьНаСервереТестовоеСоздание()
Обработка = ВнешниеОтчеты.Создать("c:\Work\UT11\МаркетинговыйОтчет.erf");



СтруктураРаботы = Новый структура;
СхемаКомпоновкиДанных=Обработка.СхемаКомпоновкиДанных;
СтруктураРаботы.Вставить("СхемаКомпоновкиДанных",СхемаКомпоновкиДанных);


КомпоновщикНастроекКомпоновкиДанных = Новый КомпоновщикНастроекКомпоновкиДанных;
//КомпоновщикНастроекКомпоновкиДанных.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
//КомпоновщикНастроекКомпоновкиДанных.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);




КомпоновщикНастроекКомпоновкиДанных.ЗагрузитьНастройки(СхемаКомпоновкиДанных.ВариантыНастроек.Основной.Настройки);
КомпоновщикНастроекКомпоновкиДанных.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));



КомпоновщикНастроекКомпоновкиДанных.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", НачалоДня(Дата(2013,02,05)));
КомпоновщикНастроекКомпоновкиДанных.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", КонецДня(Дата(2013,03,29)));
КомпоновщикНастроекКомпоновкиДанных.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Организация", Справочники.Организации.НайтиПоНаименованию("Опт"));
КомпоновщикНастроекКомпоновкиДанных.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("СегментНоменклатурыАкция", Справочники.СегментыНоменклатуры.НайтиПоНаименованию("Акция"));
КомпоновщикНастроекКомпоновкиДанных.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("СегментПартнеровАкция", Справочники.СегментыПартнеров.НайтиПоНаименованию("Рабочие"));



СтруктураРаботы.Вставить("КомпоновщикНастроекКомпоновкиДанных",КомпоновщикНастроекКомпоновкиДанных);

СтруктураФайла = Новый Структура;
СтруктураФайла.Вставить("Файлом",Ложь);
СтруктураФайла.Вставить("ТипФайлаТабличногоДокумента",ТипФайлаТабличногоДокумента.HTML4);
СтруктураРаботы.Вставить("СтруктураФайла",СтруктураФайла);

СтруктураПисьма = Новый Структура;
СтруктураПисьма.Вставить("Кому","*****@*********");
СтруктураПисьма.Вставить("Тема","Акция SOX");
//Новый Структура("Кому,Тема,Тело","********@********","График оплат",СтрHTML)
СтруктураРаботы.Вставить("СтруктураПисьма",СтруктураПисьма);
СтруктураРаботы.Вставить("КомпоновщикНастроекКомпоновкиДанныхНастройки",КомпоновщикНастроекКомпоновкиДанных.Настройки);
//ПочтовыеРассылки.СформироватьИОтправитьОтчетПоПочте(СтруктураРаботы);

Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание(Метаданные.РегламентныеЗадания.ПочтовыеРассылкиОтчетов);
Задание.Использование = Ложь;
Задание.Наименование = "Почтовая рассылка Акция";

ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(СтруктураРаботы);
ПараметрыЗадания.Добавить(Новый Структура("КомпоновщикНастроекКомпоновкиДанных",КомпоновщикНастроекКомпоновкиДанных));
Задание.Параметры = ПараметрыЗадания;

Задание.Записать();



КонецПроцедуры


После создания фонового задания можно установить регламент, активировать в обработке по работе с фоновыми заданиями.