Прямые запросы и вставка данных в таблицы 1С 8

07.12.09

Разработка - Математика и алгоритмы

Прямая запись в базы данных 1С

Поводом для этой статьи стал комментарий цитирую:

 

Трактор 05.12.2009 00:32:59

  1. Ненадо приписывать web сервисам несуществующие минусы.
    >> 1. Не кроссплатформенно
    B под линуксом и под виндовсом работают прекрасно. На FreeBSD ты сам говоришь тоже работают.

    >> 1С ключезависимо (дорого).
    web сервисы не проверяют наличие ключа. //infostart.ru/forum/messages/fo...sage330063


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


    Кроме того при прямом доступе недоступен весь функционал 1С. Например в поле Представление адреса в регистре контактной информации это самое представление нужно писать в том виде в каком его возвращает функция глобального модуля, иначе адрес будет трактоваться как иностранный.
    Придётся дублировать часть функционала 1С на сайте. А это гемор.

  2.  

 

Он доступен здесь: //infostart.ru/public/62143/?PAGEN_1=1

 

Попробую опровергнуть по пунктам, но сначала я хочу предупредить: НИКОГДА НЕ ДЕЛАЙТЕ ТО В ЧЁМ НЕ УВЕРЕНЫ!!!

 

  1. При прямом доступе нельзя писать однозначно.

  2. Оперативная отметка не будет уникальной.

  3. Полнотекстовый поиск будет работать не верно.

  4. Не уникальность кодов и номеров.

  5. Блокировки объектов при записи в базу.

  6. Недоступен функционал.

 

Первый пункт о невозможности записи. В большинство баз данных писать можно. Для этого существует операторы INSERT и UPDATE. Неприятности мы можем получить и при не правильном конфигурировании 1С.

 

Второй пункт это вообще интересно. Как формируется ссылка 1С. Это GUID записанный в базу в двоичном виде. Простите за отклонение от темы, но почему его нельзя было писать в нормальном виде, а не bytea(16), я не знаю. Что же такое GUID? GUID (Globally Unique Identifier) — статистически уникальный 128-битный идентификатор. Его главная особенность — уникальность, которая позволяет создавать расширяемые сервисы и приложения без опасения конфликтов, вызванных совпадением идентификаторов. Хотя уникальность каждого отдельного GUID не гарантируется, общее количество уникальных ключей настолько велико (3,4028×10^38), что вероятность того, что в мире будут независимо сгенерированы два совпадающих ключа, достаточно мала. Хотя три прецедента уже были.

Структура идентификатора:

 GUID STRUCT
Data1 dd
Data2 dw
Data3 dw
Data4 dw
Data5 db 6
GUID ENDS

Например, '22345200-abe8-4f60-90c8-0d43c5f6c0f6' соответствует шестнадцатеричному 128-битному числу 0x00523422E8AB604F90C80D43C5F6C0F6

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

Как же его пишет 1С? Я в интернете нашел только одну страницу. http://www.itland.ru/forum/lofiversion/index.php/t8595.html. То есть генерируя ссылку 1С мы должны сначала GUID вида 22345200-abe8-4f60-90c8-0d43c5f6c0f6 преобразовывать к виду 90c80d43c5f6c0f64f60abe822345200 и только потом в binary(16). И здесь я должен извиниться за отсутствие кода. Вариантов реализации очень много, а алгоритм не мой, и разрешения на его использования в данной статье у меня нет.

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

Четвертое. Как же нам добиться уникальности номера? И надо ли? Во первых не все документы и справочники должны иметь уникальные номера и коды. А во вторых не вижу причин что бы не проверить перед записью в базу данных какие номера уникальны, а какие нет.

 

Например:

 

...

 

CREATE TABLE #temp(code as varchar(9))

 

...

INSERT INTO #temp values(...)

...

 

SET @C = SELECT COUNT(*)

FROM _ReferenceXXX

INNER JOIN #temp

ON #temp.code = ReferenceXXX.code

 

IF @C <> 0 THEN ...

ELSE ...

 

Пятое. Блокировки. Тут выбор настолько велик, что надо читать документацию и выбирать. Как вариант почитать http://www.cybersecurity.ru/manuals/data/mysql/1924.html.

И только шестой пункт я опровергать не буду. Это не оспоримо. Функционал доступный вне 1С гораздо богаче. Но если нужен функционал 1С, возьмите 1С. Зачем пытаться скальпелем валить деревья? 1С подходит в 90% случаев. Более того скорость разработки с ее помощью ОЧЕНЬ высока. Поэтому прибегать к чему-то нестандартному надо только в КРАЙНИХ случаях. С каждой версией 1С таких случаев все меньше.

Однако 2 часа ночи и пора спать. Спасибо Трактору — 90% статьи его.

 

P.S.

Добравшись до работы, я таки решил проверить как это работает. Написав Функцию для постгреса:

CREATE OR REPLACE function guid_to_bytea(text)
RETURNS text AS $$
    my ($s1,$s2,$s3,$s4,$s5) = split('-',$_[0],5);
    my @guid = split('',"\U$s4$s5$s3$s2$s1\E");
    my $result = "";
    for($i = 0 ; $i < $#guid ; $i++) {
        $result .= "\\".sprintf("%03o",hex("0x$guid[$i]$guid[$i+1]"));
        $i++;
    }

   return $result;
$$ LANGUAGE plperl;

 

Я вставил запись в справочник:

 

INSERT INTO _reference7(
            _idrref, _marked, _ismetadata, _code, _description)
    VALUES (guid_to_bytea('22345200-abe8-4f60-90c8-0d43c5f6c0f6')::bytea, false, false, '000000002', 'query');

Потом создал новый элемент в 1С. Был приятно удивлен. 1С действительно не контролирует вставку данных в свою базу. Так что если будете вставлять напрямую данные, то за нумерацию и уникальность придется нести ответственность вам. Осталось проверить блокировки.

 

См. также

Математика и алгоритмы Программист Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    3208    stopa85    12    

38

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    7618    user1959478    52    

36

Математика и алгоритмы Разное Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    3147    maksa2005    8    

26

Математика и алгоритмы Инструментарий разработчика Программист Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

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

1 стартмани

09.06.2023    10931    7    SpaceOfMyHead    18    

61

Математика и алгоритмы Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    4401    RustIG    9    

25

Механизмы платформы 1С Математика и алгоритмы Программист Платформа 1С v8.3 Россия Бесплатно (free)

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

23.11.2022    3567    gzharkoj    14    

25

Математика и алгоритмы Программист Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    9051    7    kalyaka    11    

44
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Трактор 1254 06.12.09 12:32 Сейчас в теме
Думаю что это скорее статья в блоге, чем публикация.
Хочу сказать что большинство обсуждаемых пунктов сформулированы не мной, а разработчиком платформы 1С. http://partners.v8.1c.ru/forum/thread.jsp?id=557242#558206 Я их лишь немного привёл к виду, подходящему к случаю.
Разработчик давал комментарии по поводу одновременной работы нескольких кластеров 1С с одной базой данных. Практически это возможно, но не одобряется 1С. Вот дословная цитата:
При обращении к одной базе данных из нескольких регистраций информационной базы (из нескольких кластеров) возможна неверная работа механизмов, за которые отвечает менеджер кластера. Кроме нумерации к ним относятся:
- оперативная отметка времени (ее значение должно быть уникальным, а в рассматриваемом случае может оказаться не уникальным);
- некоторые профайлы (сохраненные в них значения могут теряться или периодически оказываться недоступными);
- индексы полнотекстового поиска окажутся задублированы и могут оказаться различными;
- если механизм регламентных заданий включен в нескольких кластерах, то одно регламентное задание сможет быть запущено в нескольких экземплярах;
- управляемые блокировки (в рассматриваемом случае не используются);
- блокировки объектов (используются в методе Заблокировать прикладных объектов 1С:Предприятия и при их редактировании в диалогах);
- каждый кластер имеет свой журнал регистрации.
Все автоматические блокировки реализуются средствами управления транзациями СУБД. Поэтому наличие нескольких кластеров не оказывает влияние на транзакционный механизм базы данных.

И это всё при том что 1С умеет работать со своей базой :-)

awk, про УИДы всё ясно, тут возражений нет. Генери, пиши и настанет счастье.

С номерами/кодами интереснее. Я провёл эксперимент и попробовал создать новые документы в одну базу из двух кластеров 1С. Номера задвоились. Предполагаю что причина задвоения в том что сервер 1С самостоятельно выдаёт новые номера и не проверяет уникальность нового номера в базе. В этом случае избежать задвоения номеров при записи со стороны не удастся никак.

Из разъяснений 1С я понял что управляемые блокировки накладываются средствами 1С, а не СУБД, поэтому могут быть конфликты при записи со стороны.
Maks_Alexey; +1 Ответить
2. German 413 06.12.09 19:58 Сейчас в теме
Ну и про итоги забыли...
3. Gilev.Vyacheslav 1917 06.12.09 20:20 Сейчас в теме
ну и нарушение ЛС тоже надо упомянуть
5. awk 744 07.12.09 09:23 Сейчас в теме
(3) Лицензионное соглашение 1С противоречит законодательству РФ (и здравому смыслу), поэтому может быть оспорено.
Трактор; German; +2 Ответить
6. Gilev.Vyacheslav 1917 07.12.09 17:09 Сейчас в теме
(5) противоречит или нет - предлагаю не обсуждать, а просто информировать об этом
далеко не всем будет интересно продолжать наработки , если выясниться, что нужно идти доказывать свою правоту в суде

думаю, очень мало будет желающих судиться с 1С
рекомендую почитать партнерский форум, чтобы сформировать представление о настроениях в 1С
Maks_Alexey; awk; +2 Ответить
4. marsohod 123 06.12.09 22:19 Сейчас в теме
+ за очень ценную мысль: "...скорость разработки с ее (1С) помощью ОЧЕНЬ высока. Поэтому прибегать к чему-то нестандартному надо только в КРАЙНИХ случаях."
а также за то, что Вас это волнует в 2 часа ночи в воскресенье... :D
7. lucius 09.12.09 12:41 Сейчас в теме
Редкостная по плотности наполнения здравым смыслом и полезным содержанием статья. Жаль не могу поставить 8 плюсов.
(допускаю, что позднее время способствовало высокому качеству текста :о))
8. awk 744 09.12.09 13:19 Сейчас в теме
(7) Спасибо за оценку, но статью я бы хотел переписать. Очень много новых данных которые я получил, много примеров кода по теме, которые не вставил. Например: о невозможности удалить не штатными средствами 1С элемент. В выходные может перепишу. Всё зависит не от меня, а от того дадут ли мне на это время жена и дети.
9. Serj1C 483 07.06.10 13:39 Сейчас в теме
(8) Эх, не дали времени... )
10. пользователь 29.12.11 16:45
Сообщение было скрыто модератором.
...
Оставьте свое сообщение