хранимый счетчик для нумерации кодов #779081


#0 by Loko
всем привет! ситуация следующая: есть справочник в 1С 8.3, настроен его обмен с dbf-файлом, т.е. новые элементы справочника скидываются в этот файл. вопрос: как организовать хранимый счетчик для этого файла? т.е. чтобы нумерация в этом файле продолжалась своя. в принципе сейчас сделал через константу, считываю текущее значение, плюсую 1 и передаю полученное значение (записывая в константу это значение). смущает 2 момента: 1)производительность 2) уникальность счетчика (что будет если одновременно будут обращаться к константе и не получится ли для 2 элементов 2 одинаковых кода).
#1 by Зая Бусечка
Скорость нормальная, а второй вопрос - блокировки для кого люди придумывали?
#2 by Torquader
Ну, лучше сделать отдельный регистр сведений, чтобы блокировать только его, так как к константам много кто обращается.
#3 by Зая Бусечка
Отвыкай от понятий 77
#4 by Torquader
И где это регистр сведений в 7.7 ?
#5 by Mauser
Регистр бухгалтерии и план счетов еще нужен. Для учета оборотов монотонно возрастающего счетчика.
#6 by Зая Бусечка
А где в 8 общая таблица констант?
#7 by Mauser
В голове у программиста. Там и происходят основные блокировки =)
#8 by kosts
Вроде как с какой-то версии, каждая константа в отдельной таблице стали.
#9 by Torquader
Насколько я помню, основная форма констант - одна, а всё остальное у каждой константы своё.
#10 by Зая Бусечка
Да, где-то с 8.0 приблизительно
#11 by Зая Бусечка
А форма тут при чём? Если мы о таблицах?
#12 by Torquader
А где у константы "Заблокировать" ?
#13 by Torquader
Хотя, согласен, при открытии транзакции (РежимУправленияБлокировкой.Управляемый) пофиг, что константа, что регистр, что справочник.
#14 by Torquader
Да, генераторы в 1С используются только для документов, да и то там никто уникальность не обещает.
#15 by Torquader
Вообще - задача в 1С не решаемая - если есть два процесса, которые параллельно используют один счётчик для нумерации чего-то - то или всё время коммитить транзакцию, или один процесс будет ждать другого.
#16 by Зая Бусечка
А не в 1с?
#17 by kosts
Думаю, что для гарантии уникальности надо просто выполнять метод Блокировать для константы. При этом параллельный процесс не сможет заблокировать, пока первый не разблокирует. Если для константы нет такого метода (не помню просто), то можно один и тот же элемент справочника использовать вместо константы.
#18 by Mauser
Самая неприятная фамилия для изобретателя - Велосипедов
#19 by Torquader
В SQL-сервере есть такое понятие, как генератор, который вне зависимости от транзакций выдаёт значения возрастающего счётчика - он один может выдавать значения нескольким клиентским сеансам параллельно и уникально.
#20 by Mauser
Ничоси!
#21 by Torquader
Согласен - в случае проще один раз получить уникальный счётчик, а далее, в файле использовать другой счётчик записей, который будет возрастать.
#22 by Mauser
Там в , в предложении "чтобы нумерация в этом файле продолжалась своя" слово "своя" настораживает. Чорд его знает, что ТС хочет.
#23 by Зая Бусечка
С ораклом не путаем?
#24 by Torquader
FireBird никуда не Oracle, но тоже сию замечателькую фичу имеет.
#25 by Torquader
Пока мы тут обсуждаем, он уже всё написал, сдал и забыл как страшный сон.
#26 by Mauser
В оракле это последовательность. Он так firebird называет =)
#27 by Torquader
В FireBird это называется GENERATOR и функция GEN_ID(ИмяГенератора,КоличествоЗначений) - очень удобная вещь. В 1С реализуется через внешнее соединение к той же самой базе - тогда можно независимо транзакции "дёргать".
#28 by Лефмихалыч
у тебя все с ног на голову потому, что каша в голове. Как вариант - присваивай номер для дбфки в отдельный реквизит при первой выгрузке в файл. Но лучше расскажи подробно, какую задачу ты решаешь и зачем
#29 by Лефмихалыч
пока не понятно, на кой ляд делать в онлайне то, что в онлайне не нужно
#30 by Torquader
Задачу решает , а мы тут просто рассуждаем, как сделать это в Online. Просто, очень сомнительно, что выгрузку в dbf-файл будут делать параллельно из двух сеансов и одному получателю ^_^
#31 by Mauser
Итого получается - чтобы выгружать в dbf надо поставить firebird. Я правильно понимаю? =)
#32 by Mauser
Запросто. С одно компа под одним пользователем запускают две 1с, потому что ваша выгрузка тормозит
#33 by Torquader
Вы ещё скажите, что два процесса пишут в один dbf-файл по очереди и не ошибаются ? Я этого не говорил, я просто говорил, что есть системы, где уникальное значение счётчика - не проблема.
#34 by Torquader
На самом деле, если первый процесс заблокирует константу, то он будет работать без проблем, а второй - будет ждать, когда константу разблокируют - вопрос в том, что будет ошибка транзакции и грустные глаза пользователя, так как он всей этой кухни не понимает.
#35 by Зая Бусечка
Сколько той транзакции будет, чтобы прочитать и записать константу? Юзер не успеет осознать даже.
#36 by Mauser
Ух ты, сколько интересного можно узнать о работе транзакций!
#37 by Mauser
Где-то кто-то говорил про один файл?
#38 by Torquader
"Все новые элементы скидываются в dbf-файл" - разве их много ?
#39 by Zamestas
Собственно накуа там счетчик нужен?
#40 by Mauser
Зависит от сценария Например пользователь выгружает новые элементы справочника, созданные вчера и позавчера в разные файлы.
#41 by Torquader
Интересно, а номер файла в качестве счётчика использовать нельзя ?
#42 by Garykom
ТС какую то фигню устроил на пустом месте. Не понятен механизм синхронизации "новые элементы справочника" с записями в dbf куда они пищутся. Что произойдет при перезаписи или после копирования и записи "элемента справочника"? Что будет после удаления? Что будет если файл dbf тупо грохнули? Цель всего этого изврата какая?
#43 by Loko
ого. как много слов) в общем, в двух словах дбф-ка эта - справочник контрагентов, который используется в старой программе (фокспрошной). сейчас делаем переход на 1С. новые контрагенты заносятся в 1С и переносятся в эту дбф (чтобы пользователи могли пока работать в старой программе) в этой дбф-ке есть системный код (счетчик как я назвал выше). необходимо чтобы этот код увеличивался на 1 последовательно. это я реализовал через константу. вот и все. исходя из этого возникли 2 вопроса в . в инете я нашел вариант: вот думаю его использовать.
#44 by VladZ
Не понял. Счетчик чего? Для имени файла? Для объектов в файле?
#45 by Loko
для новых записей в файле
#46 by VladZ
Этот системный код в базе дбф - это какой-то идентификатор?
#47 by Loko
просто текстовое поле. число с лидирующими нулями.
#48 by Loko
грубо говоря есть записи 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 by VladZ
Я не про тип. Для чего используется? Почему нельзя использовать GUID объекта? В таком случае у тебя идентификация сможет работать "в обоих направлениях".
#50 by Garykom
Терь понятно, обычная синхронизация между двумя системами. Делается через общие коды, хранить их в любой из баз проще будет в 1С. Заводишь в 1С регистр сведений вида Объект/ВидКода/ЗначениеКода и для всех существующих контрагентов заполняешь нужными кодами как в DBF они имеют. "ВидКода" это если несколько систем еще есть foxpro'шные или еще какие чтобы отличать. Далее заполняешь регистру свою так чтобы записи были уникальными и все, если код занят то берешь следующий. Т.е. или есть запись для объекта 1С или нужно ее создать взяв последний код, сделав +1, проверив на уникальность и тока потом пишем. И ничего не нуна в константах хранить когда регистр есть.
#51 by Loko
это код. уникальность записи.
#52 by Loko
ок. понял. спасиб
#53 by Loko
тогда еще один глупый вопрос - как обеспечить уникальность записи в регистре? уникальность значения кода.
#54 by Garykom
Проверкой на уникальность до и после записи ))
#55 by Loko
ясно. тогда другой вопрос. в чем существенная разница между хранением последнего кода в константе и записи текущего значения в реквизит элемента (как я сделал) и через регистры?
#56 by kosts
Видимо подразумевается универсальность. Можно для любого справочника/документа один регистр использовать.
#57 by Loko
но это не значит что через константу неправильное решение?
#58 by kosts
Думаю, и то и то имеет право на жизнь, если правильно сделано.
#59 by VladZ
Любое решение, удовлетворяющее критериям задачи в ТЗ - правильное.
#60 by FIXXXL
а чем Код элемента справочника Контрагенты не подошел?
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С