Оперативный учет поломок на производстве с помощью 1С:ТОиР и ASP.NET MVC5

Решение задачи автоматизированного учета поломок на производстве.

Доброго времени суток! В статье постараюсь рассказать о решении задачи учета простоев и поломок на производстве.

Между операторами и механиками всегда существовала разница в отчетности по простоям на производстве.  Одни пытались  показать, какие они молодцы и быстро устраняют неисправности, вторые для объяснения невыполнения плана  и улучшения показателей валили все на механиков. При этом был куплен и настроен ТОиР, но механикам как-то удобней было показывать свои отчеты в экселе. Выходило так, что все неисправности на производстве — это плановые остановки на техобслуживание. Что, естественно, не устраивало руководство по известным причинам.

Было решено разработать систему оперативного учета и оповещения по событиям на производстве. И попробовать ее связать с ТОиР (редакция 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С можно разобраться, что и куда подставлять. ОбъектРемонта и ОтказавшийЭлемент — это соответствующие коды оборудования и элементов из ТОиРа.

Как реализовано на моем предприятии.

При неисправности — оператор оборудования с терминала(на котором открыта веб страница) вводит данные, выбирает оборудование(по короткому названию из отдельной базы данных), регистрирует неисправность.

Данные о неисправности (с номером документа в ТОиР, он возвращается при правильном создании докуменета) сохраняются в оперативной БД, в ТОиР создается документ ВыявленныеДефекты. Тут уже места для маневра у механиков остается немного. Приходится показывать внеплановые ремонты.

Пысы. Если что-то неточно или не понятно, пишите в комментариях, поправлю-разъясню.

 

2 Comments

  1. nickpugachev

    В качестве примера работы с веб-сервисом 1С из .Net и публикации веб-сервиса на linux- ок.

    Один только вопрос, почему MVC5, если 1С перенесен на linux? Почему не MVC6 и .Net Core 1.0? Он, конечно, нормально работает пока только на debian-based, но ведт работает 🙂

    Reply
  2. milo1

    (1) nickpugachev, к тому моменту как у меня уже все работало, вышла только первая бета. Плюс, те компоненты, что я использую в проекте, работают пока только под Windows.

    Но планы по полному переходу на линукс есть, думаю где-то через полгода попробовать перевести проект на новые рельсы.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *