понедельник, 31 октября 2016 г.

Форматы географических координат и их преобразования

Задача: В ПО Мобильная торговля А+ координаты хранятся в виде ГГММ.ММММ, необходимо преобразовать к формату хранения Яндекс/Google, вида ГГ.ГГГГГГ

Решение:
Хорошее описание здесь, в wiki еще одного поставщика решений для мобильной торговли.

Общие понятия о форматах координат
Единого стандарта записи нет, но существует множество вариантов, которые используются на практике. Среди них: 

  • DMS (градусы, минуты, секунды) — наиболее понятная для восприятия запись, в которой раздельно указываются градусы, минуты и секунды (последние обычно указываются с точностью до определенного знака). В этой записи чаще всего полушарие обозначается латинской буквой (N/S и W/E).
  • DD (градусы в десятичном виде) — наиболее простая в числовом выражении запись, в которой целая часть представляет градусы, а дробная (обычно 6 знаков) — все остальное. Полушария обозначаются знаком плюса или минуса (реже буквами). Такая запись менее наглядна, но зато удобна для хранения в информационных системах. Большинство бытовых GPS-устройств и картографических сервисов использует именно это формат.
  • DM, UTM, Geo-Tags и другие менее распространенные и экзотические форматы — используются в различных специализированных системах.

Формат координат в продуктах ST и А+
Как и "А+ Мобильная Торговля 2.0", в программах «ST Чикаго» и «ST Мобильная Торговля» географические координаты в БД хранятся в редко используемом сейчас формате
ГГММ.ММММ.
Где: 
ГГ — градусы; 
ММ.ММММ — минуты и десятитысячные доли минут.
Это одна из GPS-нотаций, иногда обозначаемая как GPS (Dec Min).

ПО фактически получает и использует для своих нужд «нормальный» десятичный формат (DD), в котором снимают данные большинство современных GPS-приемников (в т.ч. в смартфонах и планшетах). Однако в БД координаты записываются уже в формате ГГММ.ММММ .
В интерфейсах, как правило, используется наиболее наглядный формат DMS.

Историческая справка
Формат ГГММ.ММММ был унаследован продуктами А+ и ST от навигатора Garmin в начале 2000-х, когда КПК не имели собственных GPS-приемников.
Этот формат есть упрощенная запись формата ГГ°ММ.СС, рекомендуемый для использования в морском радиообмене. В настоящее время используется реже, чем «нормальный» десятичный формат.

Перевод между форматами
ГГММ.ММММ → ГГ.ГГГГГГ
Для перевода необходимо использовать формулу ГГ + (ММ.ММММ ÷ 60):

ГГ.ГГГГГГ → ГГММ.ММММ
Для перевода необходимо использовать формулу (ГГ × 100) + (0.ГГГГГГ × 60):

Пример для Excel:
В Microsoft® Excel можно использовать формулу: = ЦЕЛОЕ(A1)*100 + ОКРУГЛ((A1-ЦЕЛОЕ(A1))*60;4), где в ячейке A1 находится значение в формате ГГ.ГГГГГГ

Пример для 1С:

// ================================================================================================
// из формата А+ в формат яндекса/гугла (ГГММ.ММММ в ГГ.ГГГГГ)
Функция КонвертироватьКординатуИзАгентПлюс( _коорд )
 
 Градусы = Цел(_коорд / 100);
 Минуты = _коорд - Градусы * 100;
 
 Возврат Окр((Градусы+Минуты/60), 5);
 
КонецФункции


// ================================================================================================
// из формата яндекса/гугла в формат А+ (ГГ.ГГГГГ в ГГММ.ММММ)
Функция КонвертироватьКординатуВАгентПлюс( _коорд )
 
 возврат Цел(_коорд)*100 + Окр((_коорд - Цел(_коорд))*60, 4)
 
КонецФункции


среда, 26 октября 2016 г.

Вывод из 1С 7.7 в Word (OLE, с разбиением страницы на колонки)


Задача: Снова встала задача вывести из 1С в Word немного текста. В этот раз отличительной особенностью стала необходимость вывода шапки на всю ширину страницы, а таблицу - разместить ниже в 2 колонки.

Для небольших таблиц в пару сотен строк кода работает прекрасно. Для больших - лучше формировать не через OLE, иначе можно смело оставлять на пару часов.

Решение: Задача старая, много полезных ссылок:
https://helpf.pro/faq8/view/635.html
http://superadm.net/index.php?name=pages&op=view&id=98
http://infostart.ru/public/67727/ - с готовым примером, много комментариев
http://www.delphimaster.ru/articles/dbtoword/index.html - отличные примеры на Дельфи
Самый лучший и полный  - http://scriptcoding.ru !


Под катом моя версия и копия с инфостарта.


1С 7.7: ошибка "Переменная ... не определена" в запросе

Проблема: Предприятие 7.7.027, древняя конфигурация на базе "Торговля и Склад для Украины". При попытки формирования типовых отчетов по регистру "ПартииТоваров" все останавливаются с ошибкой. Суть ошибки - не определена какая-то переменная, например, "Стоимость". Отчеты типовые, никем и никогда не менялись. Переименование переменных  результатов не даёт.

Текст ошибки:
Если Запрос.Выполнить(ТекстЗапроса)=0 тогда
{Отчет.Продажи.Форма.Модуль(784)}: Функция РасхСтоимость=Расход( <> Стоимость);
Запрос[35] : Переменная 'Стоимость' не определена

Решение: В Windows Server 2008 R2 с установленной украинской кодировкой 1С работать не будет. Необходимо поменять в региональных настройках системы стандарты на русские, а в 1С установить "Кодовая страница ИБ": "Использовать текущие настройки системы".

понедельник, 17 октября 2016 г.

Общие сведения о спецификации интерфейса IPMI

Цитата отсюда: http://white55.ru/ipmi.html, по ссылке больше и с картинками :)


IPMI (от англ. Intelligent Platform Management Interface) — интеллектуальный интерфейс управления платформой, предназначенный для автономного мониторинга и управления функциями, встроенными непосредственно в аппаратное и микропрограммное обеспечения серверных платформ. Другими словами IPMI – это средство управления, которое реализовано независимо от основного оборудования сервера и обеспечивает его включение, выключение, сброс, удаленное подключение виртуальных мониторов, клавиатур и мышей, наблюдение за работой оборудования и оповещение о важных событиях, связанных с работоспособностью сервера. Спецификация IPMI версии 1.0 была опубликована еще в 1998г. и базировалась на подключении к модулю IPMI через последовательный интерфейс RS-232. Текущая спецификация IPMI опубликована в 2004 г. и базируется на использовании стандартного сетевого интерфейса.

Ядром системы управления серверной платформой является специализированное устройство - Baseboard Management Controller (BMC), который практически является специализированным компьютером, встроенным в серверную платформу, имеющим свои собственные процессор, память, периферийное оборудование и операционную систему. Спецификация IPMI не задает жестких стандартов по реализации IPMI-устройств. Они могут быть выполнены в виде отдельного адаптера, могут быть распаяны непосредственно на материнской плате или выполнены в виде отдельного микроконтроллера. В настоящее время, наиболее распространены интегрированные в серверные материнские платы контроллеры BMC на базе технологии “система на одном кристалле” (System-on-Chip, SoC), позволяющие реализовать как эффективное взаимодействие с управляемой платформой, так и огромное количество функций по удаленному мониторингу, оповещению о важных событиях по e-mail или SNMP, ведению журналов и т.п.

Контроллеры BMC для серверных материнских плат подключаются к ним через системный интерфейс, названный IPMB (Intelligent Platform Management Bus/Bridge) или к другим контроллерам BMC через интерфейс IPMC (Intelligent Platform Management Chassis). Для удаленного управления оборудованием через контроллер BMC может быть использован специальный протокол прикладного уровня Remote Management Control Protocol (RMCP), обеспечивающий работу через обычную локальную сеть. Как правило, современные контроллеры BMC обеспечивают управление серверными платформами через веб-интерфейс, а также обеспечивают удаленное подключение устройств CD/DVD и работу клавиатуры-видео-мыши по сети ( IP KVM ), что позволяет легко выполнять, например изменять настройки BIOS или выполнять установку операционной системы, не имея физического доступа к оборудованию сервера.

Еще немного по теме:
ссылка 1: Пример конфигурирования IPMI на сервере 
ссылка 2: Настраиваем IPMI на Dell PowerEdgeстатья на wiki: Intelligent Platform Management Interface

пятница, 7 октября 2016 г.

Ошибка «Saving changes is not permitted…» в Microsoft SQL Server 2008 Management Studio при изменении структуры таблицы.

Проблема: В таблице есть колонка nvarchar(60), возникла необходимость увеличить до количество знаков до 75.
При попытке сохранения изменений в дизайнере, SQL Server Management Studio выдает следующее сообщение: "Saving changes is not permitted. The change you have made requires the following table to be dropped and re-created. You have either made changes to a table that can't be recreated or enabled the option prevent saving changes that require the table to be re-created."

Решение:

Вариант 1) Снять чекбокс «Prevent saving changes that require table re-creation» (Tools->Options):

Вариант 2) Выполнить на таблице следующий скрипт:
alter table ИмяНашейТаблицы 
alter column ИмяКолонкиКоторуюНадоУвеличить nvarchar(75)

P.S. Перед выполнением скрипта необходимо удалить индекс по этой колонке - пока этого не сделали, получали сообщение об ошибке.

среда, 5 октября 2016 г.

1С 7.7 + OLE часть 3/3

Копия статьи с http://www.softpoint.ru/article_id90.htm под катом

1С 7.7 + OLE часть 2/3

Копия статьи с мисты под катом:

1С 7.7 + OLE часть 1/3


Подробно описано:

Простой пример:
БазаОле = СоздатьОбъект("V77.Application");
КаталогБазыОЛе  = "D:\base";
ПользовательОле = "";
ПарольОле       = "";
МонопольныйРежимOLE = " /m"; // для немонопольного запуска указать пустую строку!
ЗапускБезЗаставки = 0;    // без заставки 1, с заставкой 0
РезультатПодключения = БазаОле.Initialize(БазаОле.RMTrade , "/d" + СокрЛП(КаталогБазыОле) + " /n" + СокрЛП(ПользовательОле) +
 " /p" + СокрЛП(ПарольОле) + МонопольныйРежимOLE,
 ?(ЗапускБезЗаставки = 1, "NO_SPLASH_SHOW", ""));
Если РезультатПодключения = 0 Тогда
    Предупреждение("Не удалось подключится к указанной базе - проверьте вводные!");
КонецЕсли;
 
//
КонтрагентыOLE = БазаОле.CreateObject("Справочник.Контрагенты");
КонтрагентыOLE.ВыбратьЭлементы();
Пока КонтрагентыOLE.ПолучитьЭлемент()=1 Цикл
   Сообщить(КонтрагентыOLE.Наименование);
КонецЦикла;



Возможные проблемы:
http://www.forum.mista.ru/topic.php?id=395287
При использовании работы ИБ через OLE выдается сообщение: "Действие не может быть завершено, так как другая программа занята. (сервер занят)
Для перехода к этой программе воспользуйтесь кнопкой "Переключиться"."

Время до появления диалога "зашито" в 1С:Предприятие и не может быть изменено из встроенного языка или внешними средствами. Однако согласно документации Микрософт данное сообщение появляется только в случае, если пользователь использовал кливиатуру или мышь во время работы OLE-сервера - поэтому можно посоветовать после запуска обработки дождаться ее завершения, и лишь затем продолжить работу.

Вариант решения: Программа для автоматического закрытия окна "Server busy"
Данная утилита выполняет одну единственную функцию - каждые 5 секунд проверяет наличие окна с заголовком "Server busy" и жмет на кнопку "Retry" до тех пор, пока оно не закроется.
При запуске программы необходимо нажать кнопку "Старт" и свернуть в трей. При наведении курсора мыши на значок в трее программа показывает количество "кликов", если они были, т.е. сколько раз программа "нажимала" на "Retry".

понедельник, 3 октября 2016 г.

Использование службы геокодирования Google в 1С 7.7 + чтение динамических страниц

Задание: В 1С для каждой торговой точки записан адрес, необходимо по адресу торговой точки получить ее координаты, для последующего отображения на карте.

Решение: Для получения координат ТТ по адресу используется Google Maps Geocoding API, описание и документация здесь: https://developers.google.com/maps/documentation/geocoding/intro?hl=ru


"Быстрое" решение - использование функций v7plus.dll:

Функция ПолучитьОтветСлужбыГеокодирования(_Адрес)
 
    Попытка
        Соединение = СоздатьОбъект("Addin.V7HttpReader");
        Соединение.КоличествоПопытокАвторизации = 10;
    Исключение
        Сообщить("Не удалось создать объект Addin.V7HttpReader!");
        Возврат 0;
    КонецПопытки;
   
    //
можем указать json или xml
    Адрес = "http://maps.googleapis.com/maps/api/geocode/xml?address=";
    Адрес = Адрес + "ukraine" + "," + СокрЛП(_Адрес);
    Адрес = Адрес + "&components=country:UA";
 
    Стр = ""; // сюда вернется xml или json ответ сервера, который 
    Попытка
        Соединение.Получить(Адрес, Стр, 2); //строка
    Исключение
        Сообщить("Неудачная попытка соединения.");
    КонецПопытки;
   
    Возврат стр;

   
КонецФункции

"Быстрое" решение было рабочим, однако, периодически ответ сервера усекался до 1-2 килобайт. При этом если строку запроса вставить в браузер - всегда возвращается нормальный ответ.

Оказалось, проблема известная, рассматривалась неоднократно:

1. V7Plus не полностью выкачивает страничку
"AddIn.V7HttpReader прекрасно работает с любыми страницами и качает всю как надо. Проблема в самих страницах, которые не отдают заголовок "Content-length". Поэтому по-умолчанию используется 1Кб."


2.V7HttpReader метод получить файл
"С помощью метода ПолучитьКакФайл пытаюсь с сайта выгрузить файл xml нужного формата. Проблема - файл не загружается полностью. ... Пробовал по всякому и через ПолучитьКакСтроку и с циклом после получения (типа для докачивания, если оно в фоне).
Все-равно файл загружается не полностью. Если через браузер все скачивается без проблем."

"Это не работает, когда динамически генерируется страница через пост-запрос. ПолучитьКакФайл работает для скачивания ТОЛЬКО статического содержимого."

И приводится код решения:
    Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
    Скрипт.language = "vbscript";
          
    x = CreateObject("Microsoft.XMLHTTP");
    x.Open("GET", АдресСтраницы, 0,"","");
    x.Send();
          
    s = CreateObject("ADODB.Stream");
    s.Mode = 3;
    s.Type = 1;
    s.Open();
          
    Скрипт.AddObject("s",s);
    Скрипт.AddObject("x",x);
    Скрипт.Eval("s.Write(x.responseBody)");
          
    s.SaveToFile(ИмяФайлаЗагрузки, 2);
3. Наиболее подробно и полно вопрос рассматривается здесь: Мои опыты чтения динамических WEB-страниц
  • Вариант 1-5 - различные модификации использования V7HttpReader, и делается вывод, что внешняя компонента v7plus.dll и ее объект AddIn.V7HttpReader не годятся для чтения  динамических WEB-страниц.
  • Вариант 6:  ФС.КопироватьФайл(Адрес,Результат) - нерабочий
  • Вариант 7: WinHttp.WinHttpRequest.5.1
  • Вариант 8: InternetExplorer.Application
  • Вариант 9. MSXML2.XMLHTTP
  • Вариант 10. WinHttp.WinHttpRequest.5.1 + MSScriptControl
  • Вариант 11.MSXML2.XMLHTTP +  MSScriptControl  + VBScript
  • Вариант 12. MSXML2.XMLHTTP (http-test.vbs + WScript.Shell)
  • Вариант 13. Microsoft.XMLHTTP+ MSScriptControl+ADODB.Stream

В итоге, пришлось переписать процедуру на вариант с использованием Microsoft.XMLHTTP +
ADODB.Stream + MSScriptControl.ScriptControl.

Код функции под катом: