Жизнь замечательных грибов
Данная обработка может пригодится тем, кому необходимо в справочнике номенклатуры массово поменять реквизит «Вид номенклатуры». Мне например это понадобилось, чтобы в разделе «Дополнительно», для каждого вида номенклатуры были заданы свои характеристики.
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
&НаКлиенте Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) ОбработкаВыбораПодборНаСервере(ВыбранноеЗначение); КонецПроцедуры &НаКлиенте Процедура ПодборНоменклатуры(Команда) ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("РежимПодбораБезСуммовыхПараметров", Истина); ПараметрыФормы.Вставить("Дата", ТекущаяДата()); ОткрытьФорму("Обработка.ПодборТоваров.Форма", ПараметрыФормы, ЭтаФорма, УникальныйИдентификатор); КонецПроцедуры &НаСервере Функция ОбработкаВыбораПодборНаСервере(ВыбранноеЗначение) ТаблицаТоваров = ПолучитьИзВременногоХранилища(ВыбранноеЗначение.АдресТоваровВХранилище); для каждого стр из ТаблицаТоваров цикл сс=объект.СписокНоменклатуры.Добавить(); сс.номенклатура=стр.номенклатура; конеццикла; КонецФункции &НаСервере Процедура изменитьвид(ном,вид) об=ном.ПолучитьОбъект(); об.ВидНоменклатуры=вид; об.Записать(); КонецПроцедуры &НаКлиенте Процедура ИзменитьВидНоменклатуры(Команда) если объект.ВидНоменклатуры=объект.ВидНоменклатуры.Пустая() тогда сообщить("Не выбран вид номенклатуры!"); иначе для каждого стр из объект.СписокНоменклатуры цикл изменитьвид(стр.номенклатура,объект.ВидНоменклатуры); конеццикла; сообщить("Готово!"); конецесли; КонецПроцедуры |
В продолжение предыдущей статьи о работе с Атол чрез python. Там описывалась работа с драйверами из ветки ДТО 9.х Всё хорошо, но в них не поддерживаются «электронные чеки». Собственно из-за чего всё и затевалось у меня. К сожалению работа с драйверами 10.х существенно отличается от 9.х Но к счастью есть ресурс http://integration.atol.ru, в котором достаточно всё хорошо разжевано с примерами. Правда без учета специфики Linux.
Итак, что нужно для того что-бы «поработать» с драйверами в Ubuntu.
1) Штатно установить драйвера deb из папки installer
2) В зависимости от того, скольки битная система, скопировать в папку проекта содержимое linux-86 или linux-x64. Если драйвера установлены верно, то при запуске fptr10_t.sh можно будет увидеть что-то вроде:
, то получим ошибку:
1 2 3 4 5 |
root@pavelpc:~/reserved/getcoding/atol/test/ver10# ./kkt_10.py Traceback (most recent call last): File "./kkt_10.py", line 7, in <module> from libfptr10 import IFptr ImportError: dynamic module does not define init function (initlibfptr10) |
На сколько мне, не сильно подкованному в python и cpp, удалось выяснить, проблема в не верно скомпилированном libfptr10.so Возможно в следующих версиях драйвера она уйдет.
А пока, выходом у меня является дописание функционального кода в конце файла libfptr10.py, после описания класса IFptr
Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
LIBRARY_PATH = os.path.dirname(os.path.abspath(__file__)) fptr = IFptr(os.path.join(LIBRARY_PATH, "libfptr10.so")) print (fptr) fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_MODEL, str(IFptr.LIBFPTR_MODEL_ATOL_55F)) fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_PORT, str(IFptr.LIBFPTR_PORT_TCPIP)) fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_IPADDRESS, "192.168.0.99") fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_IPPORT,"5555") fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_LIBRARY_PATH,"/home/pavel/reserved/getcoding/atol/test/ver10") fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_ACCESS_PASSWORD,"0") fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_USER_PASSWORD,"30") res=fptr.applySingleSettings() print (res); fptr.open() isOpened = fptr.isOpened() print ("Opened:"+str(isOpened)); fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_STATUS) fptr.queryData() operatorID = fptr.getParamInt(IFptr.LIBFPTR_PARAM_OPERATOR_ID) print (operatorID) logicalNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_LOGICAL_NUMBER) shiftState = fptr.getParamInt(IFptr.LIBFPTR_PARAM_SHIFT_STATE) serialNumber = fptr.getParamString(IFptr.LIBFPTR_PARAM_SERIAL_NUMBER) modelName = fptr.getParamString(IFptr.LIBFPTR_PARAM_MODEL_NAME) firmwareVersion = fptr.getParamString(IFptr.LIBFPTR_PARAM_UNIT_VERSION) print (modelName) |
Кое-что уже выводит:
Редко, но бывает необходимо из скрипта на PHP, вызвать на исполнение скрипт на python с передачей неких параметров и данных.
Мне например понадобилось потому что основной код у меня на PHP, а вот часть которая отвечает за взаимодействие с онлайн кассой Атол — на python, и переписывать эту часть на PHP нет возможности (без большого гемороя) — заголовки драйвера Атола под Linux есть только на python (dto9fptr.py и dto9base.py — поставляются в комплекте с драйвером).
Ниже приведен один из способов:
PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php $idkkm= _POST("idkkm"); $sql = "SELECT * FROM online_kkm where id='$idkkm'"; $result = $sqlcn->ExecuteSQL($sql) or die("Не могу выбрать список настроек!" . mysqli_error($sqlcn->idsqlconnection)); $param=array(); $param["mode"]="getinfo"; while ($row = mysqli_fetch_array($result)) { $param["ipaddress"] = $row['ipaddress']; $param["ipport"] = $row['ipport']; $param["model"] = $row['model']; $param["accesspass"] = $row['accesspass']; $param["userpass"] = $row['userpass']; $param["protocol"] = $row['protocol']; $param["logfilename"] = $row['logfilename']; $param["testmode"] = $row['testmode']; $param["libpath"] = $row['libpath']; $param["version"] = $row['version']; $ppath= $row['ppath']; }; $jsonparam= base64_encode(json_encode($param)); $command = "/usr/bin/env python $ppath $jsonparam 2>&1"; $pid = popen( $command,"r"); while( !feof( $pid ) ) { echo fread($pid, 256); flush(); ob_flush(); usleep(100000); } pclose($pid); ?> |
Python:
1 2 3 4 5 6 7 |
#!/usr/bin/env python2 #encoding: UTF-8 import sys, json,base64 prm=json.loads(base64.b64decode(sys.argv[1])) print prm["ipaddress"] |
Т.е. что мы сделали?
Профит.
Иногда попадаются письма, которые не удается распарсить средствами модуля imap на php — вложения он упорно видит одним файлом winmail.dat . Это «подарок» от Microsoft Outlook, который когда пользователь выбирает тип письма RTF, не заморачиваясь завертывает в файл winmail.dat и письмо, и вложения и с письмом помимо заголовков отправляет только это вложение. А люди — которые не пользуются Outlook — по мнению Microsoft — это ваши проблемы 😉
Решение — использование консольной утилиты tnef. Например:
1 |
tnef -f /usr/local/www/apache24/ssl/data/pays/1/rpost/winmail.dat -C /usr/local/www/apache24/ssl/data/pays/1/rpost |