Имя: Пароль:
1C
1С v8
хранимый счетчик для нумерации кодов
,
0 Loko
 
21.08.16
15:53
всем привет!
ситуация следующая: есть справочник в 1С 8.3, настроен его обмен с dbf-файлом, т.е. новые элементы справочника скидываются в этот файл. вопрос: как организовать хранимый счетчик для этого файла? т.е. чтобы нумерация в этом файле продолжалась своя. в принципе сейчас сделал через константу, считываю текущее значение, плюсую 1 и передаю полученное значение (записывая в константу это значение). смущает 2 момента: 1)производительность 2) уникальность счетчика (что будет если одновременно будут обращаться к константе и не получится ли для 2 элементов 2 одинаковых кода).
1 Зая Бусечка
 
21.08.16
16:02
Скорость нормальная, а второй вопрос - блокировки для кого люди придумывали?
2 Torquader
 
21.08.16
18:31
Ну, лучше сделать отдельный регистр сведений, чтобы блокировать только его, так как к константам много кто обращается.
3 Зая Бусечка
 
21.08.16
19:07
(2) Отвыкай от понятий 77
4 Torquader
 
21.08.16
19:13
(3) И где это регистр сведений в 7.7 ?
5 Mauser
 
21.08.16
19:15
(2) Регистр бухгалтерии и план счетов еще нужен. Для учета оборотов монотонно возрастающего счетчика.
6 Зая Бусечка
 
21.08.16
19:16
(4) А где в 8 общая таблица констант?
7 Mauser
 
21.08.16
19:17
(6) В голове у программиста. Там и происходят основные блокировки =)
8 kosts
 
21.08.16
19:18
(7) Вроде как с какой-то версии, каждая константа в отдельной таблице стали.
9 Torquader
 
21.08.16
19:19
Насколько я помню, основная форма констант - одна, а всё остальное у каждой константы своё.
10 Зая Бусечка
 
21.08.16
19:19
(8) Да, где-то с 8.0 приблизительно
11 Зая Бусечка
 
21.08.16
19:19
(9) А форма тут при чём? Если мы о таблицах?
12 Torquader
 
21.08.16
19:20
А где у константы "Заблокировать" ?
13 Torquader
 
21.08.16
19:22
(12) Хотя, согласен, при открытии транзакции (РежимУправленияБлокировкой.Управляемый) пофиг, что константа, что регистр, что справочник.
14 Torquader
 
21.08.16
19:28
Да, генераторы в 1С используются только для документов, да и то там никто уникальность не обещает.
15 Torquader
 
21.08.16
19:29
Вообще - задача в 1С не решаемая - если есть два процесса, которые параллельно используют один счётчик для нумерации чего-то - то или всё время коммитить транзакцию, или один процесс будет ждать другого.
16 Зая Бусечка
 
21.08.16
19:32
(15) А не в 1с?
17 kosts
 
21.08.16
19:36
(0) Думаю, что для гарантии уникальности надо просто выполнять метод Блокировать() для константы.
При этом параллельный процесс не сможет заблокировать, пока первый не разблокирует.

Если для константы нет такого метода (не помню просто), то можно один и тот же элемент справочника использовать вместо константы.
18 Mauser
 
21.08.16
19:37
(15) Самая неприятная фамилия для изобретателя - Велосипедов
19 Torquader
 
21.08.16
19:37
(16) В SQL-сервере есть такое понятие, как генератор, который вне зависимости от транзакций выдаёт значения возрастающего счётчика - он один может выдавать значения нескольким клиентским сеансам параллельно и уникально.
20 Mauser
 
21.08.16
19:38
(19) Ничоси!
21 Torquader
 
21.08.16
19:42
(18) Согласен - в случае (0) проще один раз получить уникальный счётчик, а далее, в файле использовать другой счётчик записей, который будет возрастать.
22 Mauser
 
21.08.16
19:46
(21) Там в (0), в предложении "чтобы нумерация в этом файле продолжалась своя" слово "своя" настораживает. Чорд его знает, что ТС хочет.
23 Зая Бусечка
 
21.08.16
19:51
(19) С ораклом не путаем?
24 Torquader
 
21.08.16
19:58
(23) FireBird никуда не Oracle, но тоже сию замечателькую фичу имеет.
25 Torquader
 
21.08.16
19:59
(22) Пока мы тут обсуждаем, он уже всё написал, сдал и забыл как страшный сон.
26 Mauser
 
21.08.16
20:03
(23) В оракле это последовательность. Он так firebird называет =)
27 Torquader
 
21.08.16
20:07
(26) В FireBird это называется GENERATOR и функция GEN_ID(ИмяГенератора,КоличествоЗначений) - очень удобная вещь.
В 1С реализуется через внешнее соединение к той же самой базе - тогда можно независимо транзакции "дёргать".
28 Лефмихалыч
 
21.08.16
20:14
(0) у тебя все с ног на голову потому, что каша в голове.
Как вариант - присваивай номер для дбфки в отдельный реквизит при первой выгрузке в файл.

Но лучше расскажи подробно, какую задачу ты решаешь и зачем
29 Лефмихалыч
 
21.08.16
20:16
(15) пока не понятно, на кой ляд делать в онлайне то, что в онлайне не нужно
30 Torquader
 
21.08.16
20:18
(29) Задачу решает (0), а мы тут просто рассуждаем, как сделать это в Online.
Просто, очень сомнительно, что выгрузку в dbf-файл будут делать параллельно из двух сеансов и одному получателю ^_^
31 Mauser
 
21.08.16
20:48
(27) Итого получается - чтобы выгружать в dbf надо поставить firebird. Я правильно понимаю? =)
32 Mauser
 
21.08.16
20:49
(30) Запросто. С одно компа под одним пользователем запускают две 1с, потому что ваша выгрузка тормозит
33 Torquader
 
21.08.16
21:07
(32) Вы ещё скажите, что два процесса пишут в один dbf-файл по очереди и не ошибаются ?
(31) Я этого не говорил, я просто говорил, что есть системы, где уникальное значение счётчика - не проблема.
34 Torquader
 
21.08.16
21:09
(32) На самом деле, если первый процесс заблокирует константу, то он будет работать без проблем, а второй - будет ждать, когда константу разблокируют - вопрос в том, что будет ошибка транзакции и грустные глаза пользователя, так как он всей этой кухни не понимает.
35 Зая Бусечка
 
21.08.16
21:17
(34) Сколько той транзакции будет, чтобы прочитать и записать константу? Юзер не успеет осознать даже.
36 Mauser
 
21.08.16
21:21
(34) Ух ты, сколько интересного можно узнать о работе транзакций!
37 Mauser
 
21.08.16
21:23
(33) Где-то кто-то говорил про один файл?
38 Torquader
 
21.08.16
21:24
(37) "Все новые элементы скидываются в dbf-файл" - разве их много ?
39 Zamestas
 
21.08.16
21:27
(0) Собственно накуа там счетчик нужен?
40 Mauser
 
21.08.16
21:28
(38) Зависит от сценария
Например пользователь выгружает новые элементы справочника, созданные вчера и позавчера в разные файлы.
41 Torquader
 
21.08.16
21:53
(40) Интересно, а номер файла в качестве счётчика использовать нельзя ?
42 Garykom
 
гуру
22.08.16
00:26
ТС какую то фигню устроил на пустом месте.

Не понятен механизм синхронизации "новые элементы справочника" с записями в dbf куда они пищутся.

Что произойдет при перезаписи или после копирования и записи "элемента справочника"?
Что будет после удаления?
Что будет если файл dbf тупо грохнули?

Цель всего этого изврата какая?
43 Loko
 
22.08.16
06:30
ого. как много слов)

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

в инете я нашел вариант: http://catalog.mista.ru/public/384485/
вот думаю его использовать.
44 VladZ
 
22.08.16
06:31
(0)  Не понял. Счетчик чего? Для имени файла? Для объектов в файле?
45 Loko
 
22.08.16
06:32
(44) для новых записей в файле
46 VladZ
 
22.08.16
06:33
(45) Этот системный код в базе дбф - это какой-то идентификатор?
47 Loko
 
22.08.16
06:34
(46) просто текстовое поле. число с лидирующими нулями.
48 Loko
 
22.08.16
06:35
грубо говоря есть записи 1,2,3,4,5,6.
в 1С создаем 2 элемента справочника: 7 и 8.
скидываем в файл. получаем 1,2,3,4,5,6,7,8

вопрос был, чтобы не получилось ситуации когда 1,2,3,4,5,6,7,7
49 VladZ
 
22.08.16
06:37
(47) Я не про тип. Для чего используется? Почему нельзя использовать GUID объекта? В таком случае у тебя идентификация сможет работать "в обоих направлениях".
50 Garykom
 
гуру
22.08.16
06:37
(43) Терь понятно, обычная синхронизация между двумя системами.
Делается через общие коды, хранить их в любой из баз проще будет в 1С.

Заводишь в 1С регистр сведений вида Объект/ВидКода/ЗначениеКода и для всех существующих контрагентов заполняешь нужными кодами как в DBF они имеют.

"ВидКода" это если несколько систем еще есть foxpro'шные или еще какие чтобы отличать.

Далее заполняешь регистру свою так чтобы записи были уникальными и все, если код занят то берешь следующий. Т.е. или есть запись для объекта 1С или нужно ее создать взяв последний код, сделав +1, проверив на уникальность и тока потом пишем.
И ничего не нуна в константах хранить когда регистр есть.
51 Loko
 
22.08.16
06:38
(49) это код. уникальность записи.
52 Loko
 
22.08.16
06:40
(50) ок. понял. спасиб
53 Loko
 
22.08.16
06:45
(50) тогда еще один глупый вопрос - как обеспечить уникальность записи в регистре? уникальность значения кода.
54 Garykom
 
гуру
22.08.16
06:50
(53) Проверкой на уникальность до и после записи ))
55 Loko
 
22.08.16
06:55
(54) ясно.

тогда другой вопрос. в чем существенная разница между хранением последнего кода в константе и записи текущего значения в реквизит элемента (как я сделал) и через регистры?
56 kosts
 
22.08.16
07:03
(55) Видимо подразумевается универсальность. Можно для любого справочника/документа один регистр использовать.
57 Loko
 
22.08.16
07:23
но это не значит что через константу неправильное решение?
58 kosts
 
22.08.16
07:26
(57) Думаю, и то и то имеет право на жизнь, если правильно сделано.
59 VladZ
 
22.08.16
07:37
(57)  Любое решение, удовлетворяющее критериям задачи в ТЗ - правильное.
60 FIXXXL
 
22.08.16
12:50
(48) а чем Код элемента справочника Контрагенты не подошел?