Friday, April 10, 2015

1С БСП И РЛС

"Будь проклят тот день, когда я сел за баранку этого автомобиля" - наверное каждый скажет этим слова в благодарность 1с и РЛС.
Меня мучает только один вопрос, почему так мало описаний и нет обработок позволяющих быстро проверить всю работу с правами.
Вот возникла у меня проблема, необходимо сделать доступ к документам через РЛС, но часть реквизитов в документе может быть не заполнена, в общем не буду описывать историю радости по поводу поиска как это сделать, сама процедура:

#ПоЗначениямРасширенный( "Документ.Посылка","Чтение","",
"",
"",
"Организации","Т.Организация","И",
"Подразделения","Т.Подразделение","И( ВЫБОР КОГДА Т.СкладОтправитель=Значение(Справочник.Склады.ПустаяСсылка) тогда Истина Иначе ",
"Склады","Т.СкладОтправитель","Конец ИЛИ ВЫБОР КОГДА Т.СкладПолучатель=Значение(Справочник.Склады.ПустаяСсылка) тогда Истина Иначе ",
"Склады","Т.СкладПолучатель","Конец )",
"","","","","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","" )

Tuesday, March 31, 2015

Обмен с Excel

Для продактов часто приходиться выгружать данные в Excel.
Для этого формирую быструю выгрузку

СтрокаПодключения = "
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source="+ИмяФайлаЭксель+";
|Extended Properties=""Excel 12.0 XML;HDR=YES;"";";


// Создаем соединение
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрокаПодключения);
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = Connection;
Command.CommandType = 1;
//создаем таблицу

Command.CommandText = "CREATE TABLE [Данные_ОтгрузкаБонусы]
|(Менеджер TEXT(100) WITH Compression
|,НаправленияДеятельности TEXT(100) WITH Compression
|,Месяц date
|,ВыручкаUSD Decimal(12,2)
|,ВыручкаUAH Decimal(12,2)
|,СебестоимостьUSD Decimal(12,2)
|,СебестоимостьUAH Decimal(12,2)
|,ВаловаяПрибыльUSD Decimal(12,2)
|,ВаловаяПрибыльUAH Decimal(12,2));";

//И заполняем ее
Command.CommandText = "INSERT INTO [Данные_ОтгрузкаБонусы] VALUES ("
+"'"+СтрЗаменить(СтрокаТабл.НоменклатураОсновнойМенеджер,"'","''") + "'" //Менеджер
+",'"+СтрЗаменить(СтрокаТабл.НоменклатураНаправленияДеятельности,"'","''")+"'" //НаправленияДеятельности
+","+Формат((МесяцыНачало+(2*60*60*24)-Дата(1900,1,1))/(60*60*24),"ЧГ=0")+"" //Месяц
+","+Формат(СтрокаТабл.Выручка,"ЧЦ=12; ЧДЦ=2; ЧРД=.; ЧН=0; ЧГ=0")+"" //ВыручкаUSD
+","+Формат(СтрокаТабл.ВыручкаУпр1,"ЧЦ=12; ЧДЦ=2; ЧРД=.; ЧН=0; ЧГ=0")+"" //ВыручкаUAH
+","+Формат(СтрокаТабл.ОбщаяСебестоимость,"ЧЦ=12; ЧДЦ=2; ЧРД=.; ЧН=0; ЧГ=0")+"" //СебестоимостьUSD
+","+Формат(СтрокаТабл.ОбщаяСебестоимостьUAH,"ЧЦ=12; ЧДЦ=2; ЧРД=.; ЧН=0; ЧГ=0")+"" //СебестоимостьUAH
+","+Формат(СтрокаТабл.ВаловаяПрибыль,"ЧЦ=12; ЧДЦ=2; ЧРД=.; ЧН=0; ЧГ=0")+"" //ВаловаяПрибыльUSD
+","+Формат(СтрокаТабл.ВаловаяПрибыльУпр1,"ЧЦ=12; ЧДЦ=2; ЧРД=.; ЧН=0; ЧГ=0")+"" //ВаловаяПрибыльUAH
+");"+Символы.ПС;
Command.Execute();

Вот принципе и все.
Для расчета даты для excel в 1с использую следующую формулу
(Необходима дата + два дня - 1/1/1900) / (Количество секунд в сутках)
(МесяцыНачало+(2*60*60*24)-Дата(1900,1,1))/(60*60*24)

Wednesday, March 25, 2015

Простая схема передачи данных между 1с и битрикс используя post запросы

Используем битрикс как сайт. И для несложных схем обмена использую php скрипты. С Get проблем не было, с Post пришлось поковыряться. Простое решение

Код 1с 8.2

 ИФ = ПолучитьИмяВременногоФайла();
 ЗФ = Новый ЗаписьТекста(ИФ);
 ЗФ.ЗаписатьСтроку("Привет1");
 ЗФ.ЗаписатьСтроку("Привет2");
 ЗФ.ЗаписатьСтроку("Привет3");
 ЗФ.ЗаписатьСтроку("Привет4");
 ЗФ.ЗаписатьСтроку("Привет5");
 ЗФ.ЗаписатьСтроку("Привет6");
 ЗФ.Закрыть();
 //Фл = Новый Файл(ИФ);
 ХТТП = Новый COMОбъект("Microsoft.XMLHTTP");
 adoStream = Новый COMОбъект("ADODB.Stream");
 
 adoStream.Mode = 3;          // read write
 adoStream.Type = 1;          // adTypeBinary
 
 adoStream.Open();
 adoStream.LoadFromFile(ИФ);
 adoStream.Position = 0;
 
 connectstring = Константы.ПорталB2BАдресСайта.Получить()+"/tools/get_users_info.php";
 request = "POST";
 ХТТП.Open(request, connectstring, Ложь);  
 ХТТП.SetRequestHeader("Content-Type", "application/upload");
 //ХТТП.SetRequestHeader("X-File-Name", "input.txt");
 //ХТТП.SetRequestHeader("X-File-Size", Фл.Размер());
 ХТТП.Send(adoStream.Read(adoStream.Size));
 Сообщить(ХТТП.Status);
 Сообщить( ХТТП.ResponseText);


код на сервере php
<?php
$data = file_get_contents('php://input');//ile_get_contents("input.txt"); //read the file
$convert = explode("\n", $data); //create array separate by new line

for ($i=0;$i<count($convert);$i++)  
{
    echo $convert[$i].', '; //write value by index
}
?>

Итого, создаем файл запихиваем в него 6 приветов и отправляем, от сервера получаем ответ.

Wednesday, March 11, 2015

Конверт таблицы excel в BB code (Convert Excel table to bb code)

Имеем проблему для сайта (в нашем случае для Bitrix) необходимо разместить "красивую" табличку с данными.
Для этого делаем следующие шаги
1. Копируем таблицу

2. Переходим на сайт http://www.avalanche.kiev.ua/site/free/convert-table-html.html и конвертим таблицу в html
3. Копируем исходный код html
4. Переходим на сайт http://onlinehtmltools.com/bbcode-html-convertor/#sthash.UyEuMmUL.dpbs
5. Выбираем "галку" html и после вставляем код



6. Снимаем галку html

7. Жмем "Switch On/Off WYSIWYG Mode" и получаем необходимый нам BB code




После этого вставляем в bitrix КП, вспоминая разрабов не злым тихим словом.

Sunday, February 22, 2015

Coolors - The super fast color palettes generator!

Coolors - The super fast color palettes generator!:

Хороший генератор, пробел сгенерировать новые палеты.
Иногда не срабатывает замок, необходимо быть более внимательным!

'via Blog this'

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'