Всего на сайте:
282 тыс. 988 статей

Главная | Информатика

Разработка модуля интеграции с 1С  Просмотрен 70

Номер специальности и группы___230105 4293/41

Руководитель Т. В. Соколова

Студент И. Р. Трифонов

2014


АННОТАЦИЯ

 

Данный документ предназначен для сопровождения программного продукта «Модуль интеграции с программой 1С». Документ содержит общую и специальную части. Общая часть содержит описание предметной области, анализ методов решения, обзор средств программирования, описание языка программирования, описание структуры программы. Специальная часть содержит описание постановки задачи, описание схем, текст программы, описание программы, описание процесса отладки и результат работы программы.

 

ВВЕДЕНИЕ

 

Особенностью внедрения ERP систем в организациях является её интеграция в существующую IT инфраструктуру, в частности получение нормативно-справочной информации из существующих в компании систем. Одной из наиболее распространенных электронных систем на предприятиях малого и среднего бизнеса является 1С.

В компании «Awara IT-Solutions» появилась потребность в минимизации затрат по взаимодействию с программой 1С:Предприятие, поскольку основной системой хранения данных для внедряемых решений является СУБД «Microsoft SQL Server». Программный продукт (библиотека) «QueryTo1C» был разработан с целью решения данной задачи.

Базы данных компании, в основном, располагаются на различных выделенных серверах. При работе сразу с несколькими базами данных требуется перемещение между серверами и ручной перенос данных. Данная библиотека позволит сэкономить немало времени и сил при работе с базами данных 1С, так как работа будет проводиться исключительно в среде «Microsoft SQL Server».

 

1. ОБЩАЯ ЧАСТЬ

 

1.1. Описание предметной области

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

В системе 1С:Предприятие имеется целый набор средств, с помощью которых можно создавать, обрабатывать и обмениваться данными различных форматов; осуществлять доступ ко всем объектам системы 1С:Предприятие 8, реализующим ее функциональные возможности; поддерживать различные протоколы обмена; поддерживать стандарты взаимодействия с другими подсистемами; разрабатывать собственные интернет-решения.

Платформа 1С предоставляет возможность соединяться с ней через COM-соединение.

Подобно многим Windows-программам, во время установки 1С в системе регистрируются два COM-объекта: Automation Server и COM Connector. С обоими объектами можно работать, используя язык, в котором предусмотрена поддержка COM-технологии.

Основная задача, решаемая с помощью COM-соединения – обеспечение надежного и быстрого программного доступа к данным системы 1С из внешних приложений.

 

1.2. Анализ методов решения.

Возможно несколько вариантов решения задачи.

1.2.1. Файловый обмен данными

Данный способ является самым распространенным, поскольку избавляет от необходимости настройки прямого взаимодействия между системами. Он не требует модификации системы 1С:Предприятие и безопасен с точки зрения доступа к данным. Недостатком является необходимость выполнения ручных выгрузок. Также присутствует зависимость от формата выгружаемого файла.

1.2.2. Взаимодействие через веб-сервисы

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

1.2.3. Взаимодействие через COM-соединение

Требует настройки СОМ компонентов в системе. Взаимодействие ведется с помощью вызова 1С:Предприятие методов из кода .NET, что является громоздким и не кроссплатформенным решением.

1.2.4. Сторонние компоненты

На рынке информационных услуг есть компоненты для взаимодействия с 1С, но они требуют оплату лицензий и так же являются не гибким решением для решения рутинной задачи интеграции.

В качестве решения было выбрано взаимодействие через COM-соединение. Передача данных таким способом является самой быстрой и надежной в плане безопасности. Так же в языке C# предусмотрена возможность работы с COM-соединением.

 

1.3. Обзор средств программирования

Для решения задачи интеграции с 1C могут быть использованы большинство языков программирования.

Например, C++, C# и т. д.

C++ - компилируемый статически типизированный язык программирования общего назначения. Поддерживает такие парадигмы программирования как процедурное программирование, объектно-ориентированное программирование, обобщённое программирование, обеспечивает модульность, раздельную компиляцию, обработку исключений, абстракцию данных, объявление типов (классов) объектов, виртуальные функции. Стандартная библиотека включает, в том числе, общеупотребительные контейнеры и алгоритмы. C++ сочетает свойства как высокоуровневых, так и низкоуровневых языков. Широко используется для разработки программного обеспечения, являясь одним из самых популярных языков программирования. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также развлекательных приложений (игр).

C# - объектно-ориентированный язык программирования. C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов, в том числе операторов явного и неявного приведения типа, делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML. Переняв многое от своих предшественников — языков C++, Pascal, Модула, Smalltalk и в особенности Java — С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например, C# в отличие от C++ не поддерживает множественное наследование классов, между тем допускается множественное наследование интерфейсов. Именно этот язык (язык C#) использовался для написания данной программы.

 

1.4. Описания языка программирования C#

1.4.1. Общие сведения

C# (произносится си шарп) — объектно-ориентированный язык программирования. Разработан в 1998—2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как язык разработки приложений для платформы Microsoft .NET Framework и впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270.

C# разрабатывался как язык программирования прикладного уровня для CLR и, как таковой, зависит, прежде всего, от возможностей самой CLR. Это касается, прежде всего, системы типов C#, которая отражает BCL.

Присутствие или отсутствие тех или иных выразительных особенностей языка диктуется тем, может ли конкретная языковая особенность быть транслирована в соответствующие конструкции CLR. Так, с развитием CLR от версии 1.1 к 2.0 значительно обогатился и сам C#; подобного взаимодействия следует ожидать и в дальнейшем (однако, эта закономерность была нарушена с выходом C# 3.0, представляющего собой расширения языка, не опирающиеся на расширения платформы .NET). CLR предоставляет C#, как и всем другим .NET-ориентированным языкам, многие возможности, которых лишены «классические» языки программирования. Например, сборка мусора не реализована в самом C#, а производится CLR для программ, написанных на C# точно так же, как это делается для программ на VB.NET, J# и др.

1.4.2. Объектно-ориентированные особенности языка C#

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

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

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

1.4.3 Элементы языка C#

1.4.3.1. Алфавит

Все тексты на языке пишутся с помощью его алфавита. Алфавит – это совокупность допустимых в языке символов. В C# используется кодировка символов Unicode. Кодировкой, или кодовой таблицей (character set), называется соответствие между символами и кодирующими их числами. Кодировка Unicode позволяет представить символы всех существующих алфавитов одновременно. Каждому символу соответствует свой уникальный код. Алфавит C# включает следующий набор основных символов:

– строчные и прописные буквы латинского языка, знак подчеркивания (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z)

– знак пробела

– арабские цифры от 0 до 9

– специальные символы (~ + - * / = ^ < > ( ) [ ] { } . , : ; ' “# $ @)

– символы перевода строки

Буквы русского алфавита не входят в состав алфавита языка. Их использование допустимо только в строковых и символьных значениях. Язык C# регистрозависим (есть разницы между написанием строчных или прописных букв).

Из символов алфавита формируются лексемы языка:

– идентификаторы (имена программных объектов)

– ключевые (зарезервированные) слова (используются только в том смысле, в котором они определены для компилятора); все существующие ключевые слова приведены в Таблице 1

Таблица 1 – Ключевые (зарезервированные) слова C#

abstract event new struct
as explicit null switch
base extern object this
bool false operator throw
break finally out true
byte fixed override try
case float params typeof
catch for private uint
char foreach protected ulong
checked goto public unchecked
class if readonly unsafe
const implict ref ushort
continue in return using
decimal int sbyte virtual
default interface sealed volatile
delegate internal short void
do is sizeof while
double lock stackalloc 
else long static 
enum namespace string 
   

– знаки операций и разделители ( { } [ ] ( ) . , : ; + - * / % & | ^ ! ~ = < > ? ++ -- && || << >> == != <= >= += -= *= /= %= &= |= ^= <<= >>= -> )

– константы (неизменяемые величины)

Границы лексем определяются другими лексемами, такими, как разделители или знаки операций.

1.4.3.2. Типы данных

С# является жестко типизированным языком. При его использовании программист должен объявлять тип каждого объекта, который он создает (например, целые числа, числа с плавающей точкой, строки, окна, кнопки, и т. д.), и компилятор поможет вам избежать ошибок, связанных с присвоением переменным значений только того типа, который им соответствует. Тип объекта указывает компилятору размер объекта (например, объект типа int занимает в памяти 4 байта) и его свойства (например, форма может быть видима и невидима, и т.д.).

Подобно языкам C++ и Java, C# подразделяет типы на два вида: встроенные типы, которые определены в языке, и определяемые пользователем типы, которые выбирает программист.

С# также подразделяет типы на две другие категории: размерные и ссылочные. Основное различие между ними — это способ, которым их значения сохраняются в памяти. Размерные типы сохраняют свое фактическое значение в стеке. Ссылочные типы хранят в стеке лишь адрес объекта, а сам объект сохраняется в куче. Куча — основная память программ, доступ к которой осуществляется на много медленнее чем к стеку. Если вы работаете с очень большими объектами, то сохранение их в куче имеет много преимуществ.

С# также поддерживает и указатели на типы, но они редко употребляются. Применение указателей связано с использованием неуправляемого кода.

Существующие типы приведены в Таблице 2.

Таблица 2 – Типы данных языка C#

Тип Описание Область значений
sbyte Знаковое 8-бит целое -128 до 127
byte Беззнаковое 8-бит целое 0 до 255
char 16-битовый символ Unicode U+0000 до U+ffff
bool 1 байт true или false
short Знаковое 16-бит целое -32768 до 32767
ushort Беззнаковое 16-бит целое 0 до 65535
int Знаковое 32-бит целое -2147483648 до 2147483647
uint Беззнаковое 32-бит целое 0 до 4294967295
long Знаковое 32-бит целое -9223372036854775808 до 9223372036854775807
ulong Беззнаковое 32-бит целое 0 до 18446744073709551615
float 4 байта, точность — 7 разрядов ±1,5*10-45 до ±3,4*1033
double 8 байт, точность —16 разрядов ±5*10-324 до ±1,7*10306
decimal 12 байт, точность — 28 разрядов 
  

 

1.4.3.3. Операции

Операция представляет собой член, определяющий значение выражения, которое можно применять к экземплярам данного класса. Можно определить следующие виды операций: операция присваивания, арифметические операции, поразрядные операции, операции отношения, логические операции, операция «приведение к типу», строковые преобразования. В языке C# используются следующие операции (перечисление идет в соответствие с перечислением, указанным выше; виды разделены знаком «точка с запятой»): сложение (+), вычитание (-), умножение (*), деление (/), деление по модулю (%); поразрядное И (&), поразрядное ИЛИ (|), поразрядное исключающее ИЛИ (^), поразрядное НЕ (~), поразрядные сдвиг влево (<<), поразрядные сдвиг вправо (>>); равно (==), не равно (!=), больше чем (>), меньше чем (<), больше или равно (>=), меньше или равно (<=); логическое И (&&), логическое ИЛИ (||), логическое НЕ (!); остальные виды не используют специальных символов.

1.4.3.4. Выражения

Язык C# предлагает целый набор операций, которые могут использоваться в выражениях. Эти операции можно разбить на такие группы:

– унарные операции

– бинарные операции

– тернарная операция (такая операция здесь всего одна)

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

1.4.4. Классы

Класс в языке C# представляет собой шаблон, по которому определяется форма объекта. В нем указываются данные и код, который будет оперировать этими данными. В C# используется спецификация класса для построения объектов, которые являются экземплярами класса. Следовательно, класс, по существу, представляет собой ряд схематических описаний способа построения объекта. При этом очень важно подчеркнуть, что класс является логической абстракцией. Физическое представление класса появится в оперативной памяти лишь после того, как будет создан объект этого класса.

Классы и структуры — это, по сути, шаблоны, по которым можно создавать объекты. Каждый объект содержит данные и методы, манипулирующие этими данными.

При определении класса объявляются данные, которые он содержит, а также код, оперирующий этими данными. Если самые простые классы могут содержать только код или только данные, то большинство настоящих классов содержит и то и другое.

Проще говоря, данные содержатся в членах данных, определяемых классом, а код - в функциях-членах. Следует сразу же подчеркнуть, что в C# предусмотрено несколько разновидностей членов данных и функций-членов.

Данные-члены - это те члены, которые содержат данные класса - поля, константы, события. Данные-члены могут быть статическими (static). Член класса является членом экземпляра, если только он не объявлен явно как static. Давайте рассмотрим виды этих данных:

Поля - это любые переменные, ассоциированные с классом.

Константы - могут быть ассоциированы с классом тем же способом, что и переменные. Константа объявляется с помощью ключевого слова const. Если она объявлена как public, то в этом случае становится доступной извне класса.

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

Функции-члены - это члены, которые обеспечивают некоторую функциональность для манипулирования данными класса. Они включают методы, свойства, конструкторы, финализаторы, операции и индексаторы.

Методы - функции, ассоциированные с определенным классом. Как и данные-члены, по умолчанию они являются членами экземпляра. Они могут быть объявлены статическими с помощью модификатора static.

Свойства - наборы функций, которые могут быть доступны клиенту таким же способом, как общедоступные поля класса. В C# предусмотрен специальный синтаксис для реализации чтения и записи свойств для классов, поэтому писать собственные методы с именами, начинающимися на Set и Get, не понадобится. Поскольку не существует какого-то отдельного синтаксиса для свойств, который отличал бы их от нормальных функций, создается иллюзия объектов как реальных сущностей, предоставляемых клиентскому коду.

Конструкторы - специальные функции, вызываемые автоматически при инициализации объекта. Их имена совпадают с именами классов, которым они принадлежат, и они не имеют типа возврата. Конструкторы полезны для инициализации полей класса.

Финализаторы - вызываются, когда среда CLR определяет, что объект больше не нужен. Они имеют то же имя, что и класс, но с предшествующим символом тильды. Предсказать точно, когда будет вызван финализатор, невозможно.

Операции - простейшие действия вроде + или -. Когда вы складываете два целых числа, то, строго говоря, применяете операцию + к целым. Однако C# позволяет указать, как существующие операции будут работать с пользовательскими классами (так называемая перегрузка операции).

Индексаторы - позволяют индексировать объекты таким же способом, как массив или коллекцию.

1.4.5. Структура программы

Файл проекта представляет собой библиотеку DLL, написанную на языке C# и обработанную компилятором. Библиотека C# - это независимый файл готовый к работе.

Главный файл проекта, изначально называется ClassLibrary1.sln. Если необходимо переименовать название проекта, нужно в окне Solution Explorer программы Visual Studio нажать правой кнопки мыши на проект ClassLibrary1 и затем нажать переименовать. При задании имени следует придерживаться правил задания имен в Visual Studio. Имя не должно содержать пробелов (используйте в таком случае знак подчеркивания), должно начинаться с буквы (цифры допустимы, но со второй позиции), не должно содержать других символов, кроме букв и цифр. Под каким именем вы сохраняете проект, под таким именем и будет создаваться DLL файл, который вы всегда сможете самостоятельно переименовать.

Главный класс библиотеки, который автоматически появляется в начале работы Class1. Файл называется Class1.cs по умолчанию, но его можно назвать любым другим именем, вроде Main.cs. Это делается аналогично переименованию названия проекта. Необходимо в окне Solution Explorer нажать правой кнопкой мыши на файл и затем нажать переименовать. В основном, все создаваемые проекты в C# это набор различных классов. В папках Bin и Obj находятся файлы, создаваемые при компиляции.

В C# присутствует возможность добавлять в проект сторонние файлы, либо создавать на них ссылки. Например, если в программе требуется наличия какого-либо файла конфигурации, файл можно создать в среде Visual Studio, либо в стороннем редакторе и добавить в проект, путем следующих действий: нажать правой кнопкой на проект в окне Solution Explorer, далее выбрать Add New или Add Existing Item. В папке Properties проекта находятся классы, хранящие настройки проекта.

Любая программа всегда состоит из файла проекта (такой файл имеет расширение .sln) и одного или нескольких классов (файлы с расширением .cs). Файл проекта не предназначен для редактирования пользователем и создаётся автоматически самой системой программирования Visual Studio. Увидеть содержимое файла проекта можно в окне Solution Explorer. Содержимое класса проекта может быть, например, следующим:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace ClassLibrary1

{

public class Class1

{

}

}

Программа на языке C# может состоять из одного или нескольких файлов. Каждый файл может содержать ноль или более пространств имен. В первой линии в редакторе кода содержится директива using с перечислением нескольких пространств имен .NET Framework. Пространство имен позволяет, в некотором смысле, сгруппировать вместе классы и структуры, что ограничивает их область действия и позволяет избежать конфликта имен с другими классами и структурами. Исполняемая часть класса или метода находиться между фигурными скобками.

1.4.6. Встроенные элементы.

В языке C# существует большой набор стандартных (библиотечных) процедур и функций. Процедуры и функции содержатся в стандартных классах и подключаются к любой программе с помощью предложения Using (например: System.Text, System.Xml и др.). В данной программе используются следующие библиотечные модули:

System System.Data
System.Collections System.Text.RegularExpressions
System.Collections.Generic Microsoft.SqlServer.Server
System.Linq System.Data.SqlTypes
System.Text System.IO
System.Reflection System
System.Globalization System.Reflection
System.Xml System.Runtime.InteropServices
System.Data.SqlClient 
 

 

 

2. СПЕЦИАЛЬНАЯ ЧАСТЬ

 

 

2.1. Постановка задачи

Постановка задачи выполнена в соответствии с ГОСТ 24.204-80, ГОСТ 19.201-78.

2.1.1. Основание для разработки

Основанием для разработки служит тема, предложенная руководителем.

2.1.2. Назначение программы

Библиотека «QueryTo1C» предназначена для минимизации затрат по взаимодействию с программой «1С:Предприятие» посредством выполнения запроса к БД 1С через СУБД Microsoft SQL Server.

Библиотека принимает запрос в виде текста из СУБД Microsoft SQL Server, далее передавая его в программу 1С, использую COM-соединение. Принятые данные формируются в T-SQL запрос для дальнейшего отображения в СУБД Microsoft SQL Server.

Данная библиотека может быть использована сотрудниками компании «Awara IT-Solutions» для более простой работы с базами данных 1С. Так же третьими лицами для выполнения запросов в 1С при работе в СУБД Microsoft SQL Server.

Библиотека «Query To 1C» может быть полезна во всех упомянутых выше областях для запросов к базам данных 1С. Данная программа сэкономит ее пользователям немало времени, при переносе данных из одной СУБД в другую, которые обычно проводятся вручную, и, будучи очень громоздкими и трудоемкими, отнимают много сил, времени и внимания, которые при использовании данной библиотеке могли бы быть направлены на более интересные аспекты работы в той или иной области.

2.1.3. Требования к программе

Требования к программе определены по ГОСТ 19.201-78.

2.1.3.1. Требования к функциональным характеристикам

Программа должна:

– передавать запрос в среду 1С:Предприятие

– получать данные, возвращаемые программой 1С:Предприятие, соответствующие запросу

– обеспечить простоту настройки решения

– обеспечить гибкий формат выгрузки результата запроса

– обеспечить корректную работу в СУБД Microsoft SQL Server

– возвращать данные, полученные после выполнения запроса

Исходные данные передаются в библиотеку в виде параметров. Запрос должен соответствовать синтаксису запросов в 1C и иметь псевдоним для каждого поля, которые должны будут отобразиться на экране (использовать в запросе конструкции «КАК», в соответствие с синтаксисом запросов в 1С).

Результатом выполнения программы является сформированный запрос T-SQL и отправленный на выполнение в СУБД Microsoft SQL Server.

2.1.3.2. Требования к надежности

Данная программа должна работать без аварийных завершений, так же должна осуществлять обработку исключений при обработке запроса. Обработка поля, содержащего ссылку должно осуществлять особым образом, во избежание некорректного отображения значения.

2.1.3.3. Требования к условиям эксплуатации

Программа должна эксплуатироваться в условиях рабочего офиса при температуре от +15 до +35 С и относительной влажности воздуха не более 70%. Программа не требует специального обслуживания. Работа с программой не должна требовать специальных навыков, кроме умения работать с клавиатурой компьютера и мышью.

2.1.3.4. Требования к техническим средствам

Программа должна работать на персональных компьютерах и портативных ноутбуках с процессором Intel или AMD с тактовой частотой 1 ГГц или выше, установленной операционной системой Windows XP и выше, объемом оперативной памяти 512 МБ и выше, видеокартой с 32 МБ видеопамяти, наличием жесткого диска с 10 КБ свободного места, .NET Framework версии 2.0 и выше, проводной или беспроводной мышью, клавиатурой, наличием монитора.

Программа не предназначена для использования на мобильных устройствах и планшетных ПК.

2.2. Описания схем

Схемы программы выполнены в соответствии с ГОСТ 19.701-90 и приведены в Приложении 1.

Данная программа не имеет интерфейса, а является лишь расширением функционала любой другой программы. Главным методом библиотеки является метод «SelectFrom1C».

2.2.1. Описание схемы метода «SelectFrom1C»

После вызова метода осуществляется установка параметров соединения с БД 1С (блок 2). Далее происходит получение набора полей из запроса, вызовом функции «TakeColumns» (блок 3). После получения полей начинается выполнения запроса с БД. Формируется объекты запроса 1С (блоки 4 - 5). Затем идет получение набора строк, возвращаемых запросом. Заполняется переменная результирующего T-SQL запроса данными для последующего отображения (блок 7). Далее в цикле с известным количеством повторений происходит считывание ячеек колонок, возвращаемые запросом 1С (блоки 8 - 19). Если поле не содержит слово «Ссылка», то происходит считывание значения ячейки обычным вызовом метода «GetProperty» и запись полученного значения в строку запросу T-SQL (блоки 9 - 11). При появлении исключения в выполнении получения значения ячейки, в строку запроса T-SQL записывается «null» вместо значения ячейки (блоки 12 - 13). Если поле содержит слово «Ссылка», то происходит создание нового объекта «GuID» и получения параметра «УникальныйИдентификатор», с последующей записью полученного значения строку запроса T-SQL (блоки 14 - 16). При появлении исключения в выполнении получения значения ячейки, в строку запроса T-SQL записывается «null» вместо значения ячейки (блоки 17 - 18). Так как в программе 1С ссылка на поле является особенным типом, а не обычным текстовым значением, требуется отслеживать наличие слова "ссылка" в запросе для специальной обработки получаемого значения. Затем происходит удаление лишней запятой в конце запроса, т.к. в цикле идет запись строки для запроса T-SQL с запятой в конце, то по достижению конца цикла запись имеет лишнюю запятую в конце строки запроса (блок 20). Удаляется "UNION ALL" в самой первой строке запроса (блок 22). Так как используется цикл для формирования будущего запроса и запись строки «\n UNION ALL \n SELECT» происходит в начале цикла, в объект для запроса SQL в начало каждой строки записывается "UNION ALL" для объединения операторов "SELECT". Вызов такого запроса невозможен из-за синтаксической ошибки, поэтому требуется удалить в начале лишний оператор "UNION ALL". Вариант с запись строки "UNION ALL SELECT" в конце цикла является нерациональным, т.к. придется удалять лишний оператор "UNION ALL" в конце строки, что требует отслеживания начала данного оператора, в силу сложности данного варианта, было решено использовать запись в начале строки, а после цикла производить удаление начала строки. Затем формируется объект SQL команды на выполнения запроса. И последующее выполнение запроса из ранее сформированной строки (блоки 23 - 24). В конце происходит очистка памяти (блок 26).

2.2.2. Описание схемы метода «TakeColumns»

В начале определяется начальная и конечная позиции области, содержащей название колонок, которые будут отображаться в дальнейшем (блок 2). Далее идет формирование списка полей. Копируется часть, содержащая колонки в строковую переменную (блок 3). Затем создается список названия полей из этой строки (блок 4). Следующим шагом является нахождение псевдонимов колонок (текст, который находится после слова «как») (блок 6). Затем удаляются лишние пробелы в названиях и формируется результирующий список названия полей (блоки 7 - 8).

2.3. Текст программы

Текст программы выполнен в соответствии с ГОСТ 19.101-77 и ГОСТ 19.401-78 и приведен в Приложение 2.

2.4. Описание программы

2.4.1. Общие сведения

Программа вызывается по имени «QueryTo1C». Данная программа написана на языке программирования C#. Программа работает под управление ОС Windows XP и выше.

2.4.2. Функциональное назначение

Программа предназначена для работы в СУБД «Microsoft SQL Server» с базами данных 1С. Программа является расширением, которое позволяет передать запрос в 1С и получить значения, возвращаемые запросом, находясь в СУБД «Microsoft SQL Server».

2.4.3. Описание логической структуры

Программа состоит из двух классов «Adapter.cs» и «LayerClass.cs». «LayerClass» имеет два метода: «QueryTo1C» и «TakeColumns». Весь метод «QueryTo1C» разделен на несколько основных секций: объявление переменных, установка параметров для интеграции с 1С, выполнения запроса к базе данных 1С, получения набора строк по запросу, вызов запроса SQL для отображения полученных строк, очистка памяти. Метод «TakeColumns» также разделен на несколько секций: объявление переменных, копирование части строки, содержащей поля запроса, формирование списка полей.

В строках (1-16) текста класса «LayerClass» перечислены стандартные библиотеки, используемые для работы программы. В строках (26-30) объявлены переменные, используемые в методе «QueryTo1C». Далее идет установка параметров подключения к базе данных 1С в строках (36-44) кода программы. В строке (47) происходит копирование название полей из строки запроса. Далее идет основной блок обработки запроса (51-98). В строках (52-57) создаются объекта запроса 1С. Затем начинается построчное получение значений, возвращаемых запросом (60-95). В строках (63-93) создается цикл размером в общее количество колонок, возвращаемых запросом, который будет получать значения ячеек. В строках (65-76) – условие на проверку отсутствия в названии колонки слова «ссылка». Если слово отсутствует, то значение ячейки записывается (69) в обыкновенную текстовую переменную, после происходит запись значения в строку запроса T-SQL (70). Если в названии присутствует слово «ссылка» (77-88), то происходит запись в переменную GuID особым способом (81). В строке (82) записывается результат в запрос T-SQL. При получении некорректных данных в строках (69 или 81) присутствует блок «Try-Catch». В случае ошибки, в результирующий запрос запишется значение «null» (74 или 86). В строке (94) удаление лишней запятой в строке результирующего запроса. В строках (100-110) происходит вызов запроса T-SQL для отображения строк. В строках (120-125) происходит очистка памяти.

В методе «TakeColumns» в строках (133-136) идет присвоение переменных. Далее находиться начальная и конечная позиция области, содержащей названия полей (140-141). В строках (145-153) формируется список полей.

2.4.4. Используемые технические средства

– Персональный компьютер, на котором была написана программа, имеет следующие технические характеристики:

– среда разработки Visual Studio 2010

– ОС Windows Server 2008

– процессор Intel Xeon X3450 2.67GHz

– установленная память (ОЗУ) 12,00 ГБ

– тип системы 64-разрядная операционная система

– наличие мыши, тачпада.

2.4.5. Вызов и загрузка

Программа может быть загружена как с гибкого, так и с жесткого дисков. Во втором случае требуется предварительно переписать исполняемый файл программы на жесткий диск. Исполняемым файлом программы является QueryTo1C. Для его запуска в СУБД «Microsoft SQL Server» необходимо зарегистрировать сборку, указав главные метод (SelectFrom1C), а затем хранимую процедуру с параметрами (версия, сервер, название, логин, пароль, текст запроса), содержащую в себе ссылку на ранее созданную сборку. Пример кода T-SQL для вызова и загрузки библиотеки:

/*Регистрация сборки и создание процедуры*/

CREATE ASSEMBLY QueryTo1C

FROM 'C:\Users\Ilya.Trifonov\Desktop\Work\QueryTo1C.dll'

WITH PERMISSION_SET = UNSAFE

GO

CREATE PROCEDURE [dbo].[SelectFrom1C](@connector NVARCHAR(max), @server NVARCHAR(max), @DBName NVARCHAR(max), @UserName NVARCHAR(max), @Password NVARCHAR(max), @queryText NVARCHAR(max))

AS EXTERNAL NAME [QueryTo1C].[QueryTo1C.LayerClass].[SelectFrom1C]

GO

/*Конец*/

/*Создание текстовой переменной с запросом и вызов хранимой процедуры*/

DECLARE @text nvarchar(max) = 'Текст запроса';

EXEC [dbo].SelectFrom1C 'V82.COMConnector', 'Название_сервера', 'Название_БД', 'Логин', 'Пароль', @text

/*Конец*/

2.4.6. Входные и выходные данные

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

Выходным данными является сгенерированный T-SQL запрос, который содержит в себе результат выполнения запроса 1С.

2.5. Описание процесса отладки

При разработке данной программы были допущены следующие ошибки:

1) Неверное использование типа переменной.

При написании кода переменной, отвечающей за получаемое значение, во время обработки запроса, был присвоен тип String. В некоторых случаях, принимаемое значение имеет тип GuID, в следствие чего результатом в этих ячейках являлось название метода. Результат представлен на рис.1. В ходе отладки программы ошибка была исправлена.

Рис. 1.

2) Ошибка в формировании результирующего запроса.

При написании кода программы было упущена обработка одного исключения. При отсутствии значении в таблице БД 1С, не возвращалось никакого значения. Компилятор этой ошибки не замечает, однако при выполнении программного кода, цикл завершался и некорректно формировал строку результирующего запроса T-SQL. Результат отображения при ошибки представлен на рис. 2. Во время отладки было добавлена обработка данного исключения. Использовался блок «Try-Catch». При возникновении исключения в строку результирующего запроса записывается «null» в формате текста, а не константы.

Рис. 2.

2.6. Результат работы программы

Работа с библиотекой возможна через работу в СУБД «Microsoft SQL Server». При запуске хранимой процедуры, к которой подключена библиотека, на экране появятся таблица со значениями обычная для данной СУБД (рис. 3). Полное руководство по запуску библиотеки находится в разделе «Вызов и загрузка».

Рис. 3.

 

ЗАКЛЮЧЕНИЕ

 

 

Во время преддипломной стажировки была создан модуль интеграции с программой «1С:Предприятие», которая позволяет работать с базами данных 1С через СУБД «Microsoft SQL Server». Использование данной программы существенно экономит время работников компании и других потенциальных пользователей разработки, так как для решения поставленной в проекте задачи всегда требовалось много усилий и времени при одновременной работе с несколькими базами данных, реализованных в разных средах. Программа позволяет запрашивать данные из 1С, работая в «Microsoft SQL Server», обеспечивая корректное отображение. В то время как ручной перенос или параллельная работа не обещает целостность данных, что-то можно забыть или неправильно записать. Это вынуждает пользователя искать ошибки и проводить повторный перенос данных.

 

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

 

 

 

 

ПРИЛОЖЕНИЕ 1

 

public static void SelectFrom1C( string _connector, string _server, string _DBName, string _UserName, string _Password, string _queryText)

Основной метод обработки запроса 1С.

 

private static List TakeColumns(string _query)

 

Метод получения названия колонок из строки запроса.

 

ПРИЛОЖЕНИЕ 2

 

ТЕКСТ ПРОГРАММЫ

{1} using System;

{2} using System.Collections;

{3} using System.Collections.Generic;

{4} using System.Linq;

{5} using System.Text;

 

{6} using System.Reflection;

{7} using System.Globalization;

{8} using System.Xml;

{9} using System.Data.SqlClient;

{10} using System.Data;

{11} using System.Text.RegularExpressions;

 

{12} using Microsoft.SqlServer.Server;

{13} using System.Data.SqlTypes;

{14} using System.IO;

 

{15} namespace QueryTo1C

{16} {

{17} public static class LayerClass

{18} {

{19} [SqlProcedure]

{20} public static void SelectFrom1C( string _connector, string _server, string _DBName, string _UserName, string _Password, string _queryText) // метод обработки 1С запроса

{21} {

{22} #region Объявление переменных

{23} object v8 = null; object query = null;

{24} List columns = new List();

{25} string queryForSQL = ""; string cell = "";

{26} Guid ID1C; // объект содержащий уникальный идентификатор

{27} SqlCommand queryToExecute; // запрос на отображение полученных полей с 1С в SQL

{28} #endregion

 

{29} #region Установка параметров для интеграции с 1С

{30} QueryTo1C.Adapter adapter = new Adapter();

 

{31} adapter.Server = _server;

{32} adapter.DBName = _DBName;

 

{33} adapter.DBType = DatabaseType.Server; // тип базы данных: база данных содержится на сервере

 

{34} adapter.UserName = _UserName;

{35} adapter.Password = _Password;

 

{36} v8 = adapter.Connect(_connector); // соединение с 1С COM-коннектером

{37} #endregion

 

{38} columns = TakeColumns(_queryText); // получения набора полей из запроса

 

{39} try

{40} {

{41} #region Выполнение запроса к базе данных 1С

{42} query = adapter.InvokeMethod(v8, "NewObject", new object[] { "Запрос" }); // формирование объекта запроса 1С

 

{43} adapter.SetProperty(query, "Текст", _queryText); // свойство запроса - текст

 

{44} query = adapter.InvokeMethod(query, "Выполнить", null); // формирование объекта запроса 1С

{45} query = adapter.InvokeMethod(query, "Выбрать", null); // формирование объекта запроса 1С

 

{46} #region Получение набора строк по запросу

{47} while ((bool)adapter.InvokeMethod(query, "Следующий", null)) // построчное получение строк, возвращаемых запросом

{48} {

{49} queryForSQL += "\n UNION ALL \n SELECT "; // заполнение переменной запросом SQL

{50} for (int j = 0; j < columns.Count; j++) // получение значений колонок, возвращаемых запросом

{51} {

{52} if ((columns[j].ToLower()).Contains("ссылка") == false) // при отсутсвии в название колонки слова "ссылка" получаем обычное текстовое значение ячейки

{53} {

{54} try

{55} {

{56} cell = adapter.GetProperty(query, columns[j]).ToString().Trim(' '); // получение значения ячейки

{57} queryForSQL += columns[j] + " = '" + cell + "'" + ", "; // заполнение переменной SQL запроса значением этой ячейки

{58} }

{59} catch

{60} {

{61} queryForSQL += columns[j] + " = " + "null" + ", "; // заполнение запроса пустым значением, т.к. в ячейке отсутствует значение

{62} }

{63} }

{64} else if ((columns[j].ToLower()).Contains("ссылка") == true) // при наличие в названии колонки слова "ссылка" получаем уникальный индетификатор значения ячейки

{65} {

{66} try

{67} {

{68} ID1C = new Guid(adapter.InvokeMethod(v8, "String", new object[] { adapter.InvokeMethod(adapter.GetProperty(query, columns[j]), "УникальныйИдентификатор", null) }).ToString()); // запись в объект GUID значение уникального индетификатора

{69} queryForSQL += columns[j] + " = '" + ID1C + "'" + ", "; // заполнение переменной SQL запроса значением этой ячейки

{70} }

{71} catch

{72} {

{73} queryForSQL += columns[j] + " = " + "null" + ", "; // заполнение запроса пустым значением, т.к. в ячейке отсутствует значение

{74} }

{75} }

{76} /*

{77} т.к в программе 1С ссылка на поле является особенным типом, а не обычным тектовым значение, требуется отслеживание наличия слова "ссылка" в запроса,

{78} для специальной обработки получаемого значения

{79} */

{80} }

{81} queryForSQL = queryForSQL.Remove(queryForSQL.Length - 2, 1); // удаление лишней запятой в конце самого запроса, т.к. в цикле идет запись строки для запроса SQL с запятой в конце, то по достижению конца цикла запись имеет лишнюю запятую в конце запроса

{82} }

{83} #endregion

{84} #endregion

 

{85} #region Вызов запроса SQL для отображения строк

{86} queryForSQL = queryForSQL.Remove(1, 10); // удаление "UNION ALL" в самой первой строке запроса

{87} /*

{88} т.к. используется цикл для формирования будущего запроса и запись строки "\n UNION ALL \n SELECT " происходит в начале цикла,

{89} в объект для запроса SQL в начало каждой строки записывается "UNION ALL" для объединения операторов "SELECT";

{90} вызов такого запроса невозможен из-за синтаксической ошибки, поэтому требуется удалить в начале лишний оператор "UNION ALL";

{91} вариант с запись строки "UNION ALL SELECT" в конце цикла является нерациональным, т.к. придется удалять лишний оператор "UNION ALL" в конце строки,

{92} что требует отслеживания начала данного оператора;

{93} в силу сложности данного варианта, было решено использовать запись в начале строки, а после цикла производить удаление начала строки

{94} */

{95} queryToExecute = new SqlCommand(queryForSQL); // формирование объекта SQL комманды на выполнение запроса

{96} SqlContext.Pipe.ExecuteAndSend(queryToExecute); // выполнение запроса SQL

{97} #endregion

{98} }

{99} catch (Exception)

{100} {

 

{101} }

{102} finally // очистка памяти

{103} {

{104} #region Очистка памяти

{105} adapter.ReleaseObject(ref query);

{106} adapter.ReleaseObject(ref v8);

{107} adapter.Dispose();

{108} GC.WaitForPendingFinalizers();

{109} GC.Collect();

{110} #endregion

{111} }

{112} }

 

{113} private static List TakeColumns(string _query) // метод получения списка названия колонок из строки запроса

{114} {

{115} #region Объявление переменных

{116} List columns = new List();

{117} List splittedColumns = new List();

{118} int startPosition; int endPosition;

{119} string columnsString; string column;

{120} #endregion

 

{121} #region Копирование части строки содержащий поля запроса

{122} startPosition = (_query.ToLower()).IndexOf("выбрать") + "выбрать".Length; // установка номера начала области, содержащей названия колонок

{123} endPosition = _query.IndexOf("ИЗ") - 1; // установка номера конца области, содержащей назавания колонок

{124} #endregion

 

{125} #region Формирование списка полей

{126} columnsString = _query.Substring(startPosition, endPosition - startPosition); // копирование строки, содержащей названия колонок в строке запроса

{127} splittedColumns = columnsString.Split(',').ToList(); // формирования списка строк из найденной выше строки

 

{128} foreach (var c in splittedColumns) // поиск названия колонок

{129} {

{130} column = c.Substring((c.ToLower()).IndexOf("как") + 3); // копирование псевдонимов колонок после слова "как" из строки запроса

{131} column = column.Replace(" ", ""); // удаление пробелов в полученной строке для избежания получения ошибки о ненайденых колонках

{132} columns.Add(column); // формирование результирующего списка колонок

{133} }

{134} #endregion

 

{135} return columns;

{136} }

{137} }

{138} }

Предыдущая статья:Тема урока: «Пятно как средство выражения. Ритм пятен». Следующая статья:Социология рынков: к формированию нового направления
page speed (0.0142 sec, direct)