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
Работа с ФормамиФайлами
Вариант КонсолидацииБазданных
***

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

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

Комментарии

Изображение пользователя st.

Шарман

Заполнение из таблицы впечатляет :) Осталось добавить настраиваемую схему отображения любой таблицы на панельку справа.

Но "толстый" клиент, который сейчас принято называть "умным" (smart), вовсе не означает большой трафик, скорее, наоборот: у толстяка многократно большие возможности кешировать данные и обрабатывать их локально. Другое дело, что нерадивые разработчики этим не умеют пользоваться

Кэширование на

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

Изображение пользователя st.

Кеширование есть всегда

Кеширование есть всегда (для тонких клиентов - в неких буферах сервера), система оповещений принципиально не отличается. Другое дело, что ее далеко не всегда реализуют. Для клиентского кеша есть разработанные механизмы на уровне DataSet. В ORM/ОРП также есть встроенные механизмы хотя бы на уровне проверки timestamp объекта при записи данных в базу.

Изображение пользователя ipanshin.

Если кто-то

Если кто-то обижен, то прошу извинить и буду называть Сеню умным:). Конечно это альтернативное направление, когда умный клиент использует базу как склад. Пришел взял, что надо, положил, что решил сам, и теперь сам работает у себя. Я не сторонник такого подхода так как с несколькими умными клиентами групповой работы не получается. Толпа мозгов и мозг толпы - это не одно и то же.

Тут мой сын придумал афоризм.
С голых по нитке, налоговой рубашка.:)

А что за нексус?

А что за нексус? Гугол даёт много ссылок, непонятно, какой именно имеется в виду. Поэтому непонятен контекст всего этого.

Очень

Очень интересно.
Трюк с "имя папки = имя таблицы" не понял как устроен, но впечатляет. Магия!!!

Изображение пользователя ipanshin.

Добавил

Добавил информацию о трюке. Это все класс "код", который был написан лет 5 назад. Теперь уже и не вспомнить как, но работает.
Самое интересное, что он дает наглядное представление, как можно сделать конвертацию классов. То есть класс объекта - это не абсолют и его можно спокойно поменять.

Изображение пользователя ipanshin.

прецендент обхода 1С API

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

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

Единственно, что я поменял в ядре nexus так это задокументировал 'Документ уже открыт!!!'. Понятно, что последствия могут быть, но мешает.

Еще вариант может быть такой добавить вместо задокументированного
if exists(select * from Detailed where u=@@spid and UDN=@UDN )
and not exists (select * from Detailed where u=@@spid and UDN=@UDN and ValueType=8)
begin raiserror('Документ уже открыт!!!', 11, 11) return 1 end

ALTER procedure [dbo].[PreDetailEx]
@UDN integer,
@ViewMode varchar(32), -- название моды
@IsEdit int -- 1 просмотр, 2 - редактирование delete detailed
AS
declare @iRet int

--if exists(select * from Detailed where u=@@spid and UDN=@UDN )
--begin raiserror('Документ уже открыт!!!', 11, 11) return 1 end

exec @iRet=PreDetail @UDN, @ViewMode, @IsEdit
if @iRet <> 0 return @iRet
select * from ProcParam (nolock) where u=@@spid and UDN=@UDN

Изображение пользователя ipanshin.

ValueType=8 - это

ValueType=8 - это ускоренный вывод грида только для просмотра. Я использую его в виде отчета.Теперь, если сейчас попытаться воспользоваться для этого же документа любым методом, скажем, посмотреть информацию, то тебе дадут по рукам и скажут, что документ уже открыт. Но я то его открыл только для чтения, а потом посмотрел отчет и захотел чтото посмотреть или изменить. А мне сообщение, что документ уже открыт. Вот это и мешает.

Изображение пользователя ipanshin.

1C плюха

Не уверен, но может кто знает решение?

Вот это плюха! Репликация от Майкрософт не может работать с 1С из-за следующей ошибки:

Клиент 1С делает запрос к базе данных
Select * from master..sysdatabases where name='имя базы'
Она ему отвечает строкой и, если поле Category <> 0, то говорит:

Вот так

***
Рассыпается карточный домик
Карты ворохом падают в листья
Дописать свой единственный томик
И в осенней поре раствориться.

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

Кроме этого, часть таблиц 1С не имеют основного ключа (primary key) и почти все не имеют поля timestamp. Также отсутствуют foreign key, unique key and so on, что впрочем довольно неплохо.

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

ИМХО, Category из

ИМХО, Category из sysdatabases тут не причем. Если верить сообщению, то ты пытаешься из копии каталога с метаданными, подключиться к БД, у которой прописан другой каталог.
У тебя метаданные 1С где лежат - на диске или в БД на SQL?

Изображение пользователя ipanshin.

Хм, может и

Хм, может и вправду не то делаю?
Вначале я создаю пустой каталог и в этом каталоге размещаю файлы БД db.mdf and db.ldf. Далее запускаю конфигуратор и добавляю новую бд, указывая этот пустой каталог с файлами базы. В диалоге идет запрос а какую версию 1С хотите? Я говорю сиквельную. Мне говорят ок. Далее я заполняю информацию доступа к сиквелу и загружаю данные из файловой конфигурации. Все с такой бд и работаю.

Все прекрасно работает с несколькими пользователями до тех пор пока я не сделаю эту базу данных опубликованной на сервере, чтобы данные реплицировать (это майкрософтовская репликация и никакого отношения к 1С не имеет). Как только я базу опубликовал так сразу появляется ошибка. Убрал репликацию - ошибка пропала.

Я посмотрел в каталог там лежат файлы *.md and *.dds, *.dba, *.cfg
Не понял про метаданные в БД.

Изображение пользователя ipanshin.

Да я ошибся

Да я ошибся Category тут ни при чем, а проблема в опубликовании таблицы _1SCONNECT. Если ее не опубликовывать, то все ок, вроде. Дело в том, что схему опубликованной базы менять нельзя, а 1С видимо чтото меняет, но ответ ее абсолютно не адекватен.

select * from _1SCONNECT

use [torg_planeta]
exec sp_addmergearticle
@publication = N'torg_planeta',
@article = N'_1SCONNECT',
@source_owner = N'dbo',
@source_object = N'_1SCONNECT',

А ты обрати

А ты обрати внимание, что делает 1С 7.7, когда запускается.
Она проверяет все объекты своей БД, и если они отличаются от ее описания, то как раз и выдает такое сообщение.
sp она, ИМХО, тупо пересоздает, а вот с таблицами видимо так постпать не может.
А сравнивает она структуру скорее всего тупо: по символьно скрипт у себя и скрипт из базы.

Изображение пользователя ipanshin.

Это так

Это так почему-то пересоздается одна таблица _1SConnect. Ну и ладно, я ее просто вычеркнул из репликации. Теперь репликация и 1С клиенты работают совместно. Тебе случайно не надо, чтобы несколько 1С версией 7.7 собирались в одной базе данных, например, 1С 8.1?