Tuesday, January 20, 2015

BItrix CIBlockElementRights расширенные права — blog.t2er.com

BItrix CIBlockElementRights расширенные права — blog.t2er.com:

'via Blog this'

Установка ftp на VM Bitrix

Делаем так, взято тут

Для открытия и разделения доступа к папкам по ftp мы сделали следующее:

1. установка ftp демона для Centos

yum install proftpd

2. Ставим эту службу в автозагрузку

chkconfig proftpd on

3. Стартуем сервис

service proftpd start

4. Узнаем id группы и id пользователя, под которым работает Apache. По умолчанию логин и группа этого пользователя - bitrix

[root@CentOS-65-64-minimal ~]# id bitrix
uid=501(bitrix) gid=501(bitrix) groups=501(bitrix)

5. Создаем пользователя с идентификаторами пользователя и группы bitrix для нужной нам директории

adduser userlogin -g501 -o -u501 -d /home/bitrix/www/
6. Задаем пароль пользователю

passwd userlogin

Все. Теперь у нас есть ftp пользователь с доступом только на определенный сайт или раздел сайта в зависимости от заданного пути.

Далее, взято тут

Как правило, режим передачи (активный/пассивный) определяется в настройках FTP-клиента. Большинство клиентов, к сожалению, используют пассивный режим по умолчанию.

Если по какой-то причине активный режим использовать не получается, например, из-за ограничений клиента, или настроек сетевого фильтра на стороне клиента, то на стороне сервера необходимо выполнить дополнительные действия, как то:
Отредактировать шестую строку в файле /etc/sysconfig/iptables-config: заменить IPTABLES_MODULES="" на IPTABLES_MODULES="ip_conntrack_ftp".
Перезапустить iptables:
Код
service iptables save
service iptables restart

После этого FTP заработает в обоих режимах.

После этого в файлике /etc/sysconfig/iptables
добавляем следующий строки
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT.
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT.

П.С. Вот только после этого у меня заработало...

Wednesday, January 14, 2015

Android Expandable List View Tutorial

Android Expandable List View Tutorial:

'via Blog this'

Get Device ID Example in Android | Javatechig

Get Device ID Example in Android | Javatechig:

'via Blog this'

Creating an Alternate-Colored List View in Android

Как сделать брал тут Creating an Alternate-Colored List View in Android | Androidie:

'via Blog this'

Доступно и понятно как разукрасить listview, пришлось поискать как разукрасить
мини код моей реализации

public class ParseGroupViewAdapter extends ParseQueryAdapter<ParseGroups> {
    private final int[] bgColors = new int[]{Color.rgb(245, 245, 245), Color.rgb(224, 255, 255)};
    private Context context;
    private LayoutInflater inflater;
    private ImageLoader imageLoader;
    private LinkedHashSet mySet;


    public ParseGroupViewAdapter(Context context) {
        super(context, new ParseQueryAdapter.QueryFactory<ParseGroups>() {
            public ParseQuery create() {
                ParseQuery query = ParseGroups.getQuery();
                query.setMaxCacheAge(TimeUnit.HOURS.toMillis(4));
                query.setCachePolicy(ParseQuery.CachePolicy.CACHE_ELSE_NETWORK);
                query.whereEqualTo("parentid", "00000000-0000-0000-0000-000000000000");
                query.whereEqualTo("Enable", true);
                query.orderByAscending("sortcode");
                return query;
            }
        });
        this.context = context;
        inflater = LayoutInflater.from(context);
        this.imageLoader = ImageLoader.getInstance();
        this.mySet = new LinkedHashSet();
    }

    public ParseGroupViewAdapter(Context context, final String parentId) {
        super(context, new ParseQueryAdapter.QueryFactory<ParseGroups>() {
            public ParseQuery create() {
                ParseQuery query = ParseGroups.getQuery();
                query.setMaxCacheAge(TimeUnit.HOURS.toMillis(4));
                query.setCachePolicy(ParseQuery.CachePolicy.CACHE_ELSE_NETWORK);
                query.whereEqualTo("parentid", parentId);
                query.orderByAscending("sortcode");
                return query;
            }
        });
        this.context = context;
        inflater = LayoutInflater.from(context);
        this.imageLoader = ImageLoader.getInstance();
        this.mySet = new LinkedHashSet();
    }

    /**
     * Notifies the attached observers that the underlying data has been changed
     * and any View reflecting the data set should refresh itself.
     */
    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
    }

    @Override
    public View getItemView(ParseGroups object, View view, ViewGroup parent) {
        final ViewHolder holder;
        if (view == null) {
            holder = new ViewHolder();
            view = inflater.inflate(R.layout.groupview, null);
            holder.tvGroupName = (TextView) view.findViewById(R.id.tvName);
            holder.ivGroup = (ParseImageView) view.findViewById(R.id.imageView3);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();

        }
        super.getItemView(object, view, parent);
        mySet.add(object);
        int colorPosition = new ArrayList<ParseItems>(mySet).indexOf(object) % bgColors.length;
        view.setBackgroundColor(bgColors[colorPosition]);

        holder.tvGroupName.setText(object.getString("name"));
        ParseFile photoFile = object.getParseFile("image");
//        holder.ivGroup.setParseFile(photoFile);
//        holder.ivGroup.loadInBackground();
        ImageLoader imageLoader = ImageLoader.getInstance();
        if (photoFile != null) {

            imageLoader.displayImage(photoFile.getUrl(), holder.ivGroup);
        }
//        else
//        {
//            holder.ivGroup = null;
//        }

        return view;
    }

    public class ViewHolder {
        TextView tvGroupName;
        ParseImageView ivGroup;
    }

}

Saturday, January 3, 2015

Публикация картинок на parse.com

Решил переделать схему работы на мобильных устройствах в связи с проблемами в работе SOAP, постоянная не хватка памяти и проблемы в работе с 1С (Скорость и ключи). Возникла проблема в передаче на parse.com картинок в правильном формате, заставила данная проблема повозиться и поискать решений, итого код:


ХТТП = Новый COMОбъект("Microsoft.XMLHTTP");
  
 ХТТП.Open("GET", "https://api.parse.com/1/login?username=1&password=F7/83?b5bf", Ложь);
 ХТТП.SetRequestHeader("Host", "api.parse.com");
 ХТТП.SetRequestHeader("Content-Type", "application/json");
 ХТТП.SetRequestHeader("X-Parse-Application-Id", "*********************************************");
 ХТТП.SetRequestHeader("X-Parse-REST-API-Key","****************************************");
 ХТТП.Send(""); 
 Ses = json.ПрочитатьJSON(ХТТП.ResponseText);
 
 sessionToken = Ses.Получить("sessionToken");
 
 
 ТНом = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор("c564fdf4-247e-11e4-9dd2-000c29ce19d5"));
 СсылкаНаФайл = РаботаСПрайсами.ПолучениеКартинкиНоменклатуры(ТНом,"png",200,200,50,true);
 Если не СсылкаНаФайл=неопределено тогда
  adoStream = Новый COMОбъект("ADODB.Stream");
    
     adoStream.Mode = 3;          // read write
     adoStream.Type = 1;          // adTypeBinary
    
     adoStream.Open();
     adoStream.LoadFromFile(СсылкаНаФайл);
  adoStream.Position = 0;
  
  connectstring = "https://api.parse.com/1/files/"+Строка(ТНом.УникальныйИдентификатор())+".png";
  request = "POST";
  ХТТП.Open(request, connectstring, Ложь);
  ХТТП.SetRequestHeader("Host", "api.parse.com");
  ХТТП.SetRequestHeader("Content-Type", "image/png");
  ХТТП.SetRequestHeader("X-Parse-Application-Id", "***********************************");
  ХТТП.SetRequestHeader("X-Parse-REST-API-Key","******************************");
  ХТТП.SetRequestHeader("X-Parse-Session-Token",sessionToken);
  ХТТП.Send(adoStream.Read(adoStream.Size));
  Сообщить(ХТТП.Status);
  Сообщить( ХТТП.ResponseText);
  ТСО =  json.ПрочитатьJSON(ХТТП.ResponseText);
  fileName = ТСО.Получить("name");
  
  
  
  
 КонецЕсли;

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.