Доброго времени суток! В статье постараюсь рассказать о решении задачи учета простоев и поломок на производстве.
Между операторами и механиками всегда существовала разница в отчетности по простоям на производстве. Одни пытались показать, какие они молодцы и быстро устраняют неисправности, вторые для объяснения невыполнения плана и улучшения показателей валили все на механиков. При этом был куплен и настроен ТОиР, но механикам как-то удобней было показывать свои отчеты в экселе. Выходило так, что все неисправности на производстве - это плановые остановки на техобслуживание. Что, естественно, не устраивало руководство по известным причинам.
Было решено разработать систему оперативного учета и оповещения по событиям на производстве. И попробовать ее связать с ТОиР (редакция 1.3 (1.3.63.2)). Про связь с ТОиР в основном и пойдет речь.
На момент начала работы над этим проектом 1С:ТОиР работал в стандартной связке: 1С Сервер + MSSQL. Чтобы не ломать работающую связку, было решено эксперименты проводить на линуксе. Была развернута следующая стандартная схема на виртуальной машине 1С 8.3 сервер + PostgreSQL 9.4. Операционная система CentOS Linux 6.7, Postgres из поставки 1С (PostgreSQL version 9.4.2). Веб сервер естественно был поднят Apache. Единственное что так и не удалось победить - сквозную аутентификацию пользователей по протоколу kerberos.
Первое, что нужно сделать, чтобы поглотить веб-сервис ТОиРа - это опубликовать его, чтобы он был виден снаружи (начать помогла вот эта статья https://habrahabr.ru/post/136684/). Объекты для взаимодействия конфигурации ТОиР с внешним миром описаны в пакете ПакетXDTO1. Так понимаю, что изначально он был создан для работы с мобильными устройствами. Сам же веб сервис называется exchange.
Публикация веб-сервиса в линуксе выглядит следующим образом:
1. Установка apache;
2. Добавление модуля 1С в веб-сервер и прописывания настроек публикации в /etc/httpd/conf/httpd.conf;
3. Создание .vrd.
С первым пунктом все понятно - ставится из основного репозитария (не помню, чтобы делал лишние движения).
Со вторым пунктом сложнее - книга от 1С для администрирования говорит, что нужно просто расставить галки в клиенте запущенном на сервере, но мой сервер без иксов, да и вообще кто ставит сервера линукс с иксами?!
Можно вручную указать апачу, где находится модуль 1С для работы с веб-сервером. Если мне не изменяет память, то эти записи создаст утилита webinst, но на всякий случай привожу, как должно быть в файле /etc/httpd/conf/httpd.conf.
LoadModule _1cws_module "/opt/1C/v8.3/x86_64/wsap22.so"
Добавляется к остальным модулям апача. Потом добавляется запись о публикации:
# 1c publication
Alias "/Toir" "/var/www/html/Toir/"
<Directory "/var/www/html/Toir/">
AllowOverride All
Options None
Order allow,deny
Allow from all
SetHandler 1c-application
ManagedApplicationDescriptor "/var/www/html/Toir/default.vrd"
</Directory>
Третьим пунктом создаем файл default.vrd. Сделать это можно несколькими способами - вручную (тогда придется и вручную прописывать в настройках сервера), либо при помощи утилиты webinst.
Пример из книги (неверный для нашей конфигурации):
webinst -publish -apache22 -wsdir demo-ws -dir /var/www/demo-ws -connstr "Srvr=server:1741;Ref=demo;" -confpath /etc/apache2/httd.conf -descriptor apache22-template.vrd
Правильный пример:
webinst -publish -apache22 -wsdir Toir -dir /var/www/html -connstr "Srvr=server:1741;Ref=Toir;" -confpath /etc/httpd/conf/httd.conf -descriptor default.vrd
Полученный файл должен иметь сходную структуру:
<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/Toir"
ib="Srvr=xxx.xxx.xxx.xxx;Ref=Toir;"
enableStandardOData="true"
allowexecutescheduledjobs="">
<ws>
<point name="exchange"
alias="ws1.1cws"
enable="true"/>
</ws>
</point>
Для поглощения в проекте ASP.Net MVC5 кликаем правой клавишей мыши на проект, выбираем (Add)--->(Service Reference), далее следуем указаниям на картинке.
В результате должны получить такую же структуру, что находится слева от окон создания Web Reference. При добавлении пути в пункте 4 спрашивает пароль, указываем пользователя 1С с правами админа (может можно и нужно ниже, не проверял).
Теперь можно обращаться к нашему веб-сервису ТОиР.
Делается это следующим образом:
try
{
using (var service = new exchange())
{
service.SoapVersion = System.Web.Services.Protocols.SoapProtocolVersion.Soap12;
service.Credentials = new NetworkCredential("USER", "PASSWORD");
var выявленныйДефект = new ВыявленныйДефект //creating document object
{
Дата = ((DateTime)ev.StartDateE).ToString("yyyy-MM-ddTHH:mm:sszzzzzz"), //important
ДатаSpecified = true,
ДефектВыявленВПроцессе = "000000002",
Подразделение = "000000013",
Комментарий = "Из веб приложения, оборудование: " + ev.Equipment,
ДатаОбнаружения = ((DateTime)ev.StartDateE).ToString("yyyy-MM-ddTHH:mm:sszzzzzz"), //important
ДатаОбнаруженияSpecified = true,
Организация = "000000001",
Передан = false
};
var tableDefects = new ТЧВыявленныйДефект[1];
tableDefects[0] = new ТЧВыявленныйДефект
{
ID = "1",
ВидДефекта = "000000011",
ДефектВыявленВПроцессе = "000000002",
ДефектОписание = "",
ДефектПричина = "7",
КритичностьДефекта = "000000002",
ОбъектРемонта = repository.GetEquipmentbyID((int)ev.EquipmentID).ToirID.ToString(),
ОтказавшийЭлемент = repository.GetEquipmentbyID((int)ev.EquipmentID).ToirID.ToString()
};
выявленныйДефект.ТЧВыявленныйДефект = tableDefects;
try
{
var res = service.ПередатьДефект(выявленныйДефект); //adding data to toir
}
catch (Exception)
{
logger.Error("Error adding toir event");
}
}
}
catch (Exception)
{
logger.Error("Adding toir equipment");
}
Оттестировав можно и уменьшить количество блоков try-catch.
Следует обратить внимание на места //important. Связано это с тем, что существует несовместимость типов данных поля DateTime C# и 1С dateTime. Очень много нервов мне пришлось потратить, чтобы выяснить причину ошибок при перегрузке документа ВыявленныеДефекты. Решение - вручную поменять тип данных в описании веб сервиса в проекте в коде exchange.wsdl все поля с dateTime на string и приводить к нужному строковому виду вручную:
<xs:element minOccurs="0" name="Дата" nillable="true" type="xs:string" />
Обращение к элементам конфигурации идет везде по кодам. Даже не зная тонкостей 1С можно разобраться, что и куда подставлять. ОбъектРемонта и ОтказавшийЭлемент - это соответствующие коды оборудования и элементов из ТОиРа.
Как реализовано на моем предприятии.
При неисправности - оператор оборудования с терминала(на котором открыта веб страница) вводит данные, выбирает оборудование(по короткому названию из отдельной базы данных), регистрирует неисправность.
Данные о неисправности (с номером документа в ТОиР, он возвращается при правильном создании докуменета) сохраняются в оперативной БД, в ТОиР создается документ ВыявленныеДефекты. Тут уже места для маневра у механиков остается немного. Приходится показывать внеплановые ремонты.
Пысы. Если что-то неточно или не понятно, пишите в комментариях, поправлю-разъясню.