Информация об изменениях

Сообщение Re[87]: MS забило на дотнет. Питону - да, сишарпу - нет? от 28.09.2021 2:47

Изменено 28.09.2021 2:48 vdimas

Re[87]: MS забило на дотнет. Питону - да, сишарпу - нет?
Здравствуйте, Serginio1, Вы писали:

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

V>>Отсюда видимые тормоза при открытии форм.
S>На самом деле есть. Во всяком случае на сервере приложений полученные данные кэшируются

Наверно разница в том, что сервер приложений (это для веба?) один для всех подключённых клиентов, т.е. про актуальность кеша можно делать предположения.

Другое дело когда каждый клиент независимо коннектится к SQL-серваку как оно есть в традиционном использовании 1С в связке с MS SQL.
Тогда в отсутствии специального механизма поддержки актуальности кеша попытка кешировать данные вредна.

А такого механизма заведомо нет, я смотрел схемы таблиц, которые создаёт на серваке 1С — в таблицах нет служебного поля для целей поддержки когерентности клиентских кешей.

Сама схема обычно проста:
— в целевую таблицу/таблицы, описывающие некую сущность, вводится служебное поле — токен синхронизации, целое число некоей ширины;

— для данной сущности при каждом её изменении этот токен инкрементируется, при переполнении токена он сбрасывается у всех записей таблицы;
(например, текущий токен был равен 42, обновили в одной транзакции несколько строк в таблице, у обновлённых строк токен стал 43)

— клиенту возвращается некий ответ на прикладной запрос, в котором рядом с внешним ключом идёт токен синхронизации сущности, на которую ссылается внешний ключ.

— при обнаружении превышения значения токена синхронизации, клиент запрашивает требуемые сущности (или "точечно" для участвующих в запросе, или последние обновления для всего справочника через простое условие select * from SomeEnity where SyncToken > @ClientToken); клиент обновляет свой кеш справочника, вычленяя max(SyncToken) по ходу обновления, это и будет текущий его токен синхронизации.

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

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


S>Считанные данные будут находиться в кеше до тех пор, пока не наступит одно из следующих событий:

S>считанные данные будут вытеснены из кеша другими считанными данными других объектов (переполнение кеша);
S>при очередном обращении к кешу окажется, что считанные данные были изменены в базе данных;
S>закончится интервал времени в 20 минут.
S>Все считанные данные помещаются в последовательную очередь, и, поскольку объем кеша ограничен, наиболее старые данные будут вытесняться из кеша последними считанными.

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


S>Если обращение к данным происходит в рамках транзакции, то оно переадресуется транзакционному кешу. В рамках транзакции в «1С:Предприятии» выполняются все операции, приводящие к изменению данных в базе данных. Например, в рамках транзакции выполняется обработка проведения документа.


Ну...
У меня код проводки документа жил на стороне БД, ес-но.
Поэтому и работал раз в 100 быстрее.
(если не больше)

На клиенте таблица непроведенных документов, можно просто мышкой нажать на строку и провести вниз-вверх (с прокруткой) не отпуская, выделяя сколько требуется, потом нажать "Провести" и оно мгновенно проводилось. Это недостижимые для 1С космические технологии. ))
Re[87]: MS забило на дотнет. Питону - да, сишарпу - нет?
Здравствуйте, Serginio1, Вы писали:

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

V>>Отсюда видимые тормоза при открытии форм.
S>На самом деле есть. Во всяком случае на сервере приложений полученные данные кэшируются

Наверно разница в том, что сервер приложений (это для веба?) один для всех подключённых клиентов, т.е. про актуальность кеша можно делать хоть какие-то предположения.

Другое дело когда каждый клиент независимо коннектится к SQL-серваку как оно есть в традиционном использовании 1С в связке с MS SQL.
Тогда в отсутствии специального механизма поддержки актуальности кеша попытка кешировать данные вредна.

А такого механизма заведомо нет, я смотрел схемы таблиц, которые создаёт на серваке 1С — в таблицах нет служебного поля для целей поддержки когерентности клиентских кешей.

Сама схема обычно проста:
— в целевую таблицу/таблицы, описывающие некую сущность, вводится служебное поле — токен синхронизации, целое число некоей ширины;

— для данной сущности при каждом её изменении этот токен инкрементируется, при переполнении токена он сбрасывается у всех записей таблицы;
(например, текущий токен был равен 42, обновили в одной транзакции несколько строк в таблице, у обновлённых строк токен стал 43)

— клиенту возвращается некий ответ на прикладной запрос, в котором рядом с внешним ключом идёт токен синхронизации сущности, на которую ссылается внешний ключ.

— при обнаружении превышения значения токена синхронизации, клиент запрашивает требуемые сущности (или "точечно" для участвующих в запросе, или последние обновления для всего справочника через простое условие select * from SomeEnity where SyncToken > @ClientToken); клиент обновляет свой кеш справочника, вычленяя max(SyncToken) по ходу обновления, это и будет текущий его токен синхронизации.

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

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


S>Считанные данные будут находиться в кеше до тех пор, пока не наступит одно из следующих событий:

S>считанные данные будут вытеснены из кеша другими считанными данными других объектов (переполнение кеша);
S>при очередном обращении к кешу окажется, что считанные данные были изменены в базе данных;
S>закончится интервал времени в 20 минут.
S>Все считанные данные помещаются в последовательную очередь, и, поскольку объем кеша ограничен, наиболее старые данные будут вытесняться из кеша последними считанными.

Насколько я понял из описания, у них один кеш на все сущности, а сам кеш не является точным-актуальным, т.к. реализован через набор допущений.
Объективно если — это неуд.
(если к базе можно подключаться мимо сервера приложений)


S>Если обращение к данным происходит в рамках транзакции, то оно переадресуется транзакционному кешу. В рамках транзакции в «1С:Предприятии» выполняются все операции, приводящие к изменению данных в базе данных. Например, в рамках транзакции выполняется обработка проведения документа.


Ну...
У меня код проводки документа жил на стороне БД, ес-но.
Поэтому и работал раз в 100 быстрее.
(если не больше)

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