BItrix CIBlockElementRights расширенные права — blog.t2er.com:
'via Blog this'
Tuesday, January 20, 2015
Установка 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
добавляем следующий строки
П.С. Вот только после этого у меня заработало...
Для открытия и разделения доступа к папкам по 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
Creating an Alternate-Colored List View in Android
Как сделать брал тут Creating an Alternate-Colored List View in Android | Androidie:
'via Blog this'
Доступно и понятно как разукрасить listview, пришлось поискать как разукрасить
мини код моей реализации
'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'
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# и доп. библиотеки.
В общем код по логированию:
В общем пишу на 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. Расширить состав типов свойства Источник подписки УстановитьПометкуУдаленияПрисоединенныхФайлов включив в него тип – «объект с файлами». Например, СправочникОбъект.Номенклатура.
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,"","Работает это все на Windows 2008R2 x64 c Microsoft Office x64, outlook x64. и работает нормально, главное не забыть отключить безопасность в outlook."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 | РассылкаПрайсЛистов.Ссылка |ИЗ | Документ.РассылкаПрайсЛистов КАК РассылкаПрайсЛистов |ГДЕ | НЕ РассылкаПрайсЛистов.ПометкаУдаления | И НАЧАЛОПЕРИОДА(РассылкаПрайсЛистов.Дата, ДЕНЬ) = &Дата"; Запрос.УстановитьПараметр("Дата", ДатаДок); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Если ВыборкаДетальныеЗаписи.Следующий() Тогда Возврат ВыборкаДетальныеЗаписи.Ссылка; КонецЕсли; Возврат Документы.РассылкаПрайсЛистов.ПустаяСсылка(); КонецФункции
Subscribe to:
Posts (Atom)