Добавить комментарий

1C vs. Nexus

Написав "vs.", я вовсе не хочу противопоставлять два этих приложения и сравнивать их. Более того скажу, что они очень хорошо живут друг с другом и дополняют. Раньше, когда я интегрировал биллинговую систему Bill_On_Line and Nexus, я компилировал Nexus скрипт в базу Bill_On_Line и никак по-другому не мог. В случае интеграции приложения 1С77 (я говорю о MS SQL конфигурации), данные выгрузки из файловой версии 1С77 спокойно ложатся в Nexus базу. Чего не скажешь теперь о Nexus скрипте, который требует компиляции целого набора скриптов. Зато, когда Nexus база данных готова, то данные из 1С77 заливаются в ту же базу через конфигуратор без всяких проблем.

Здесь некоторые спросят, а зачем все это? Честно отвечу, что я не знаю, также как не могу ответить на вопрос зачем я живу или дышу?
Поэтому те, кто задаст такой вопрос могут дальше не читать. Я же продолжу свое повествование с того, что мне была поставлена задача написать модуль инвентаризации. В качестве терминала штрихкодов был выбран OPN-2001, похожий на черного клопа, легкий и простой сканер с двумя кнопками, но без 1С поддержки. Объединив две базы в одну я одним махом решаю проблемы выгрузки и загрузки номенклатуры, ее остатков и других операций, которые трудоемки и приводят к ошибкам. Кроме этого над одной базой теперь трудятся независимо друг от друга два мощных клиента. Первый, 1С клиент - упитанный и тостый, второй nexus - худощавый и поджарый так как может работать и по телефонной линии со скоростью 22600 bps.

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

Давайте посмотрим на производительность Nexus. Он открывает список из 92080 записей (более точнее объектов) за 20 секунд в контроле Tree_List. Конечно, с таким списком работать невозможно, но какое приложение делает подобное? Так же быстро мы можем удалить заполнение, потому что пока нам это не надо. Вообще для ввода данных существует 1С или Сеня, он жирный вот пусть и вводит. Может похудеет. А вот для групповых операций ввода Сеня нам не помощник так как он может работать только с чем-нибудь одним. Как назвать клиента Nexus я пока не придумал.

Приоткрою "магию", как это назвали мои друзья и коллеги. При выборе пункта меню "Заполнить из таблицы" появляется окно, в котором пользователь может поставить в соответствие поля из таблицы полям правой панели клиента Nexus и выбрать класс объектов, которые будут создаваться.

Разумным выбором будет выбор Name=DESCR так как это человечески читаемое наименование номенклатуры. В нашем случае, при создании объектов я использую простой класс Simple, что правомерно так как пока я ничего не знаю о таблице. Но в общем случае, класс объектов может быть произвольным. И как раз этот момент представляется интересным так как одну и ту же таблицу мы можем представить разными объектами. То есть получается, что сам класс объекта - это не абсолют, а динамическое свойство, которое можно менять, если операция изменения происходит быстро, конечно. В общем, это тоже некоторого плана метаморфизм.
Ext1, ... - это расширенные колонки, но пользоваться ими не рекомендуется, так как они большой тормоз при групповых операциях создания объектов. То есть работу с ExtColumns однозначно необходимо переделывать.

Теперь рассмотрим путь выгрузки всей номенклатуры из 1С. Если это реализовывать через внешнюю обработку, то профайлер MS SQL сервера выдает удивительные вещи, а именно для всей номенклатуры то есть в цикле с перебором на клиенте выполняется

exec _1sp_SC33_ByID ' 1G3PСАМ'

которая состоит из

ALTER procedure [dbo].[_1sp_SC33_ByID](@id CHAR(9)) AS
select * from SC33(NOLOCK) where ID=@id

Извините, а где же групповые операции? Почему приложение выбирает по одной строке, плодя вызовы exec _1sp_SC33_ByID ' и возвращая резалтсет клиенту, состоящий из одной строки? Может ли 1С программист изменить стиль выборки из БД?

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

exec _1sp_SC33_ByID ' 17XZСАМ'

а потом делается select в динамическом коде

exec sp_executesql N'Select * from _1SCONST(NOLOCK) where ID=@P1 and OBJID=@P2 and DATE<=@P3 order by ID DESC, OBJID DESC, DATE DESC, TIME DESC, DOCID DESC',N'@P1 int,@P2 varchar(9),@P3 datetime',35,' 17XZСАМ','2009-06-10 00:00:00:000'

Убивает мысль о том, что человек ждет за компьютером, а компьютер или программа 5 раз повторяет один и тот же оператор на выборке 78009 единиц номенклатуры. В конце концов, что же я так прицепился к 1С АПИ? Так было и так будет. И не стоит зацикливаться на упражнениях для ума. Просто решена задача и для отдельно взятой 1С конфигурации (от других я слышал, что имена таблиц могут быть разными в разных конфигурациях) найден нужный SELECT для получения остатков номенклатуры просто прямо из таблиц. Скорость впечатляет.

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

Потом секции товара объединяются в секционную ведомость.

Сама секционная ведомость суть основа для получения сличительной ведомости, как результата инвентаризации.

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

http://www.ers-online.co.uk/p814/opticon...

(не забудьте установить правильный драйвер
http://old.opticon.com/Software-Opticon-...)

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

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

***
Метро. Вагон и толчея.
Все рвутся сквозь меня.
И поезд синяя змея,
Он тоже рвется сквозззь...

Что делать с номенклатурой нескольких магазинов, если их штрихкоды пересекаются?
Можно ли консолидировать базы данных 1С 7.7 с 1С 8.1 без выгрузки и загрузки?
РепликацияC1С
Работа cо СканеромШтрихкодов OPN 2001
Работа с ФормамиФайлами
Вариант КонсолидацииБазданных
***

Переулки и проезды,
Разведенные мосты,
Где разборки и наезды,
Переезды и разьезды,
Петербургские черты.

Православное, родное,
Рядом с зоною живет,
Где-то слишком уж родное,
Где-то жуткое, немое,
Где-то все наоборот.