gifts2017

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

Опубликовал Михаил Краснобаев (milo1) в раздел Программирование - Практика программирования

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

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

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

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

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

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

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

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

 

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Николай Пугачев (nickpugachev) 02.03.16 21:01
В качестве примера работы с веб-сервисом 1С из .Net и публикации веб-сервиса на linux- ок.

Один только вопрос, почему MVC5, если 1С перенесен на linux? Почему не MVC6 и .Net Core 1.0? Он, конечно, нормально работает пока только на debian-based, но ведт работает :)
2. Михаил Краснобаев (milo1) 02.03.16 21:31
(1) nickpugachev, к тому моменту как у меня уже все работало, вышла только первая бета. Плюс, те компоненты, что я использую в проекте, работают пока только под Windows.
Но планы по полному переходу на линукс есть, думаю где-то через полгода попробовать перевести проект на новые рельсы.