Tuesday, December 23, 2014

Android - Enable Google Cloud Messaging in your Android App : Mag Support

Понадобилось подключить сообщения, довольно подробная документация

Android - Enable Google Cloud Messaging in your Android App : Mag Support: "Android - Enable Google Cloud Messaging in your Android App"

'via Blog this'

Sunday, December 7, 2014

Ох и замучал меня parse.com и 1С, схема логирования

Так и хочется написать "Будь проклят тот, кто не соблюдает стандартны", в данном контексте это в разрабам 1С и куча вопросов по решению по работе с web. Как говориться спасибо за кучу потраченного в пустую времени.
В общем пишу на java под андроид. Решил использовать parse.com в разработке, на android вроде проблем нет, а вот в 1С - одни палки в колеса.
Уже жалею что не начал делать велосипед через c# и доп. библиотеки.
В общем код по логированию:


ХТТП = Новый COMОбъект("Microsoft.XMLHTTP");
ХТТП.Open("GET", "https://api.parse.com/1/login?username=cooldude6&password=p_n7!-e8", Ложь);
ХТТП.SetRequestHeader("Host", "api.parse.com");
ХТТП.SetRequestHeader("Content-Type", "application/json");
ХТТП.SetRequestHeader("X-Parse-Application-Id", "**************************");
ХТТП.SetRequestHeader("X-Parse-REST-API-Key","*****************************");
ХТТП.Send("");
Сообщить(ХТТП.Status);
Сообщить( ХТТП.ResponseText);
Сообщить(ХТТП.responseBody);

Thursday, December 4, 2014

1С и все такое: 1С:JSON парсер и сериализатор

1С и все такое: 1С:JSON парсер и сериализатор: JSON парсер и сериализатор c полной поддержкой стандарта, широким набором сериализуемых типов и продвинутым синтаксический анализатором...

Friday, October 24, 2014

1С БСП История изменений

Ссылка на подсистему версионирования объектов http://1clancer.ru/article/bsp_-_podsistema_versionirovanie_obektov_1185

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

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

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.

Tuesday, July 29, 2014

Генератор паролей в 1С с проверкой сложности

Задали мне задачку импортировать пользователей в Битрикс с требование генерации сложных паролей с 1С. Импорт с Битрикс отдельная тема, а вот сложные пароли и их валидность опишу тут.
Фактически требование сводилось к мин количеству символов = 8, должны быть буквы нижнего и верхнего регистра, цифры и спец. символы.
Вот что из этого получилось:

Функция СгенерироватьПароль(МинДлинаПароля=8, СложныйПароль=Истина)
 ПарольВалиден = Ложь;
 
 Пока НЕ ПарольВалиден Цикл
  ГСЧ = Новый ГенераторСлучайныхЧисел(Секунда(ТекущаяДата()));
  ТПароль = СтрЗаменить(Строка(Новый УникальныйИдентификатор()),"-","");
  
  Если не СложныйПароль тогда
   Возврат Лев(ТПароль,МинДлинаПароля);
  Иначе
   НобходимыеСимволяДляСложности = ".,<>/?;:'[]{}\`~!@#$%^&*()-_+=";
   МаксСимволов  =  МинДлинаПароля+ГСЧ.СлучайноеЧисло(0,4);
   ТПароль = Лев(ТПароль,МаксСимволов);
   Для Сим=1 по МаксСимволов Цикл
    Если Сим>1 И Булево(ГСЧ.СлучайноеЧисло(0,1)) И Найти(НобходимыеСимволяДляСложности,Сред(ТПароль,Сим-1,1))=0 тогда
     ТПароль = Лев(ТПароль,Сим)+Сред(НобходимыеСимволяДляСложности,ГСЧ.СлучайноеЧисло(0,30),1)+Сред(ТПароль,Сим+1);
     Сим = Сим+1;
     ТПароль = Сред(ТПароль,1,МаксСимволов);
    КонецЕсли;
    Если Булево(ГСЧ.СлучайноеЧисло(0,1)) тогда
     ТПароль = Лев(ТПароль,Сим-1)+ВРег(Сред(ТПароль,Сим,1))+Сред(ТПароль,Сим+1);
    КонецЕсли;
   КонецЦикла;
  КонецЕсли;
  
  //Проверка валидности пароля
  //((?=.*[a-z])(?=.*\d)(?=.*[\.,<>/\?;:'\[\]\{\}\\`~!@#$%^&*()-_+=])(?=.*[A-Z]).{6,})
  
  RegExp = Новый COMОбъект("VBScript.RegExp");
  //СтруктураФайлов = Новый СписокЗначений;
  RegExp.MultiLine = Истина; // истина — текст многострочный, ложь — одна строка 
  RegExp.Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения 
  RegExp.IgnoreCase = Ложь; // истина — игнорировать регистр строки при поиске 
  RegExp.Pattern = "^((?=.*[a-z])(?=.*\d)(?=.*[\.,<>/\?;:'\[\]\{\}\\`~!@#$%^&\*()-_+=])(?=.*[A-Z]).{8,})$";
  ПарольВалиден = RegExp.Test(ТПароль);
 КонецЦикла;
 Возврат ТПароль;
КонецФункции

Monday, July 21, 2014

Формирование отчета СКД с картинками в управляемых формах 1С УТ11

Поставили мне задачу сформировать отчет с картинками. Очень давно пользуюсь СКД, но как то нормально у системы с картинками не сложилось. поэтому пришлось гуглить.
Как итог вид отчета

Натолкнулся на проблему, в нете все решения сделаны базово. Мне необходимо было сделать так что бы была возможность выводить несколько изображений и они не были привязаны к определенным колонкам.
Фактически необходимо показать изображение которое стоит основным в справочнике номенклатуры, а также все изображения из справочника "ПрисоединенныеФайлы". В этой обработке возможно будет ошибка, так как я не проверяю, это картинка или нет, необходимо доделывать проверку.

В итоге запрос из схемы компоновки данных:

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


Выводим только заполненные дополнительные строки


И код модуля




Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
 СтандартнаяОбработка = Ложь;
 ДокументРезультат.Очистить();
 НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
 КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
 Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);
 ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
 ПроцессорКомпоновки.Инициализировать(Макет, , ДанныеРасшифровки);
 ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
 ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
 
 ИмяКолонкиИзображения = "Файл";
 ШиринаКолонкиИзображения = ВернутьЗначениеПараметраНастройкиСКД(КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы, "ШиринаКолонкиИзображения", 20); 
 
 ПроцессорВывода.НачатьВывод();
 Пока Истина Цикл
  
  ЭлементРезультата = ПроцессорКомпоновки.Следующий();
  
  Если ЭлементРезультата = Неопределено Тогда
   Прервать;
  КонецЕсли; 
  
  ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
  Если ЭлементРезультата.ЗначенияПараметров.Количество() = 0 Тогда
   Продолжить;
  КонецЕсли;
  
  
  Для Каждого ЭлементПараметра Из ЭлементРезультата.ЗначенияПараметров Цикл
   Если ТипЗнч(ЭлементПараметра.Значение) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
    Поля = ДанныеРасшифровки.Элементы[ЭлементПараметра.Значение].ПолучитьПоля();
    Для Каждого Поле Из Поля Цикл
     Если ТипЗнч(Поле.Значение) = Тип("СправочникСсылка.НоменклатураПрисоединенныеФайлы") Тогда
      Если Поле.Значение.Пустая() Тогда Продолжить; КонецЕсли;
      //Поиск номера колонки, с нужным именем ИмяКолонкиИзображения, для таки вывода изображения
      Для НомерКолонки = 1 По ДокументРезультат.ШиринаТаблицы Цикл
       Расшифровка = ДокументРезультат.Область(ДокументРезультат.ВысотаТаблицы, НомерКолонки, ДокументРезультат.ВысотаТаблицы, НомерКолонки).Расшифровка;
       Если Расшифровка = Неопределено Тогда Продолжить; КонецЕсли;
       Поля = ДанныеРасшифровки.Элементы.Получить(Расшифровка).ПолучитьПоля();
       Для Каждого знчПоле Из Поля Цикл
        Если знчПоле.Значение  = Поле.Значение тогда
         ОбластьИзображения = ДокументРезультат.Область(ДокументРезультат.ВысотаТаблицы, НомерКолонки);
         ВывестиИзображениеЭлементаНоменклатуры(ДокументРезультат, Поле.Значение, ОбластьИзображения, ШиринаКолонкиИзображения);   
        КонецЕсли;
       КонецЦикла;
      КонецЦикла;
     КонецЕсли;
    КонецЦикла;
   КонецЕсли;
  КонецЦикла;  
 КонецЦикла;
 ПроцессорВывода.ЗакончитьВывод();
КонецПроцедуры

Процедура ВывестиИзображениеЭлементаНоменклатуры(ТД, ЭлементСправочника, Область, ШиринаКолонкиИзображения)
 Если ЭлементСправочника.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда
  СтуктураРег = РегистрыСведений.ПрисоединенныеФайлы.Получить(Новый Структура("ПрисоединенныйФайл,ВидФайла", ЭлементСправочника,ЭлементСправочника.ВидФайла));
  ДанныеКартинки = СтуктураРег.ХранимыйФайл.Получить();
 Иначе
  ДанныеКартинки = ?(ЗначениеЗаполнено(ЭлементСправочника.Том.ПолныйПутьWindows), ЭлементСправочника.Том.ПолныйПутьWindows, ЭлементСправочника.Том.ПолныйПутьLinux)
  + ЭлементСправочника.ПутьКФайлу;
 КонецЕсли;
 Рисунок = ВывестиИзображениеВОбластиТД(ДанныеКартинки, ТД, Область);
 Область.АвтоВысотаСтроки = Ложь;
 Область.ВысотаСтроки = ШиринаКолонкиИзображения * 1.31 / 0.3759;// Среднее значение пункта 1 пункт = 0.3759 мм (по Wiki)
 Область.Расшифровка = ЭлементСправочника;
 Рисунок.ЦветЛинии = Область.ЦветРамки;
КонецПроцедуры 


Функция ВывестиИзображениеВОбластиТД(ДанныеКартинки, ТД, Область)
 Изображение = ТД.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
 Изображение.РазмерКартинки = РазмерКартинки.АвтоРазмер;
 Индекс = ТД.Рисунки.Индекс(Изображение);
 ТД.Рисунки[Индекс].Картинка = Новый Картинка(ДанныеКартинки, Истина);
 ТД.Рисунки[Индекс].Расположить(Область);
 Возврат ТД.Рисунки[Индекс]; 
КонецФункции


Функция ВернутьЗначениеПараметраНастройкиСКД(КоллекцияЭлементовНастройки, ИмяНастройки, ЗначениеПоУмолчанию = Неопределено)
 
 Настройка = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(ИмяНастройки);
 Если Настройка = Неопределено Тогда Возврат ЗначениеПоУмолчанию; КонецЕсли;
 НастрокаПоИД = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Настройка.ИдентификаторПользовательскойНастройки);
 Если Не ЗначениеЗаполнено(НастрокаПоИД.Значение) Тогда 
  Если Не ЗначениеПоУмолчанию = Неопределено Тогда
   НастрокаПоИД.Значение = ЗначениеПоУмолчанию;
  КонецЕсли;
 КонецЕсли;
 Возврат ?(НастрокаПоИД.Использование, НастрокаПоИД.Значение, ЗначениеПоУмолчанию); 
КонецФункции