Получить уникальное число 1с

Обновлено: 07.07.2024

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

Тип число в 1С

Задать число в коде просто: нужно какой-то переменной просто присвоить определенное число.

Так задаётся целое число:

А так задаются дробные числа:

Над числами в коде можно выполнять простые арифметические операции: сложение, вычитание, умножение и деление.

Причем, как непосредственно над числами:

Так и над переменными с типом число:

Если нужно инвертировать число, т.е. поставить какому-то уже заданному числу обратный знак (например, было 5, стало -5), то его нужно умножить на -1.

Сделать это можно несколькими способами:

Если нам нужно создать реквизит какого-то объекта, с типом число, то в свойстве Тип реквизита нужно выбрать тип Число. На картинке ниже у справочника создан реквизит с типом Число.

Тип число

А также задать его точность и длину.

Длина и точность типа число

Остановимся на точности и длине подробнее.

Точность – это максимальное количество знаков после запятой.

Длина – это максимальное количество разрядов в числе (включая знаки после запятой).

Например, если длина 5, а точность 3, то максимальное число будет 99,999.

Если длина 5, а точность 0, то – 99999.

А если длинна 3, а точность 3, то – 0,999. Т.е когда длинна равна точности мы не сможем задать число равное 1.

Когда мы в коде задаем переменную с типом Число, то мы не ограничиваем эту переменную по длине и точности, в тоже время для реквизита объекта с типом Число нужно это делать заранее. При разработке вы должны заранее предусмотреть, какие у реквизита числового типа будет длинна и точность.

Точно также, реквизит с типом число нужной длинны и точности можно создать на управляемой форме.

Число на управляемой форме 1С

Случайное число в 1С

В платформе 1С 8.3 имеется возможность сгенерировать случайное целое число при помощи генератора случайных чисел, который так и называется ГенераторСлучайныхЧисел. Для генерации случайного числа нужно воспользоваться методом этого объекта СлучайноеЧисло.

Рассмотрим, простой пример генерации случайного числа.

В этом случае Число1 будет сгенерировано от 0 до 4294967295 (2^32 -1).

В примере выше метод СлучайноеЧисло без параметров, но у этого метода есть два параметра:

Оба параметра являются необязательных и с их помощью можно задать верхнюю и нижнюю границу генерации случайных чисел. Причем параметр НижняяГраница не может быть меньше нуля, а параметр ВерхняяГраница не может быть больше 4294967295.

Например, в этом случае будет сгенерировано случайное число от 1 до 100.

Округлить число в 1С

В платформе 1С имеется возможность округления чисел по определенному правилу. Для этих целей существует метод Окр. Этот метод является функцией, которая принимает число, нужное для округления, и возвращает округленное число. Данный метод имеет следующий синтаксис:

Число – число, которое будет округляться;

Разрядность – до какого количества знаков после запятой нужно округлить число (если разрядность равна 0, то число будет округлено до целого числа).

РежимОкругления – системное перечисление, которое имеет два значения: РежимОкругления.Окр15как10 – в этом случае 1.5 округляется до 1, РежимОкругления.Окр15как20 – 1.5 округляется до 2. Если этот параметр не задан, то по умолчанию 1.5 округляется до 2

В этом случае будет следующий результат:

Округлить число в 1С

Целое число в 1С

Если предыдущий метод округляет число, то также имеется возможность получать целое число, т.е. просто отбросить дробную часть числа. Делает это метод Цел. Данный метод является функцией, принимающей единственный параметр – число, у которого нужно отбросить дробную часть, и возвращающей полученное целое число.

Рассмотрим работу этого метод в сравнении с методом округления числа.

Должен получиться следующий результат:

Целое число и округлить число в 1С

Из результата вы видите, что нельзя использовать метод Окр для получения целого числа, он именно округляет и не всегда может дать требуемый результат. Для получения целого числа используйте метод Цел.

Степень числа в 1С

В платформе 1С имеется возможность возвести нужное число в степень. Делается это при помощи метода Pow, который является функцией со следующим синтаксисом.

Рассмотрим ряд примеров:

Степень числа в 1С

Из примеров видно, что мы можем возводить в положительную и отрицательную степень, а также степень может быть дробной.

Функции чисел в 1С

В платформе 1С 8.3 имеется другие функции пот работе с числами , познакомится с ними можно в синтаксис-помощнике. В подразделе Функции работы со значениями типа Число.

Функции работы со значениями типа число

Другие статьи о примитивных типах:

Программировать в 1С за 11 шагов

  1. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника.

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

Основы разработки в 1С такси

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog


Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму
.

можно оплатить вручную:

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

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

СлучайноеЧисло(<НижнийДиапазон>, <ВерхнийДиапазон>)
Параметры:

Тип: Число.
Нижний диапазон. Задается целым числом и не может быть меньше 0.
Значение по умолчанию: 4294967295
Возвращаемое значение:

Возвращает случайное целое число в заданном диапазоне. Нижний диапазон не может быть меньше 0, а верхний диапазон не может быть больше 2^32 - 1.

Тонкий клиент, сервер, толстый клиент, внешнее соединение.
Пример:

ГСЧ или гуиды.. всё равно нужно где-то знать уже выданные номера. ну или использовать хитрый алгоритм генерации СЧ без повторов. кстати, счётчик предлагать?
+(7) тока 5 знаков не хватит.
А вообще почему только 5 знаков?

(0) "Сейчас работает регистр сведений (счетчик), жуткие тормоза и проблема с параллельностью работы. "

Вообще такого быть не должно.

(0) Так один день это 86400 секунд (24*60*60) - пятизначное число. Если в секунду не предполагается генерирование больше одного числа, то просто текущую секунду можно брать.
(11) Значений ты хотел сказать?) Ну, про то, что нужно все 99999 значений иметь никто не говорил.

(12) вот это я имел в виду ;)

В обыкновенном году 365 дней и 6 часов. Эти 6 часов суммируют и возникает еще один день. То есть, каждый 4-й год становится високосным. Но я задумался, а точно ли в году 365 дней и 6 часов? Оказалось, что и это не так. В обычном году 365 дней, 6 часов и еще 3 секунды. 3! Это вам может подтвердить любой астроном. Достаточно подняться к звездам с хронометром в руках, чтобы проследить за вращением Земли.
Я это делал не раз. Марта Вам может подтвердить.
3 секунды неучтенного времени.
3 секунды почему-то сбрасывают со счета. Почему?

Номер секунды уникальности не гарантирует - не факт, что в ту же секунду другой пользователь не пытается выполнить обмен. Хотя вероятность этого невысока.
(15) Вероятность всё равно остается. Только хотел отписаться по этому поводу. Боюсь без регистра тут всё таки не обойтись.
(0)Каждому пользователю предоставлять диапазон из ста чисел. Первое число из диапазона хранить в регистре. Когда конкретный пользователь использует все числа из диапазона, он получает новый диапазон.
В принципе та же схема, что и раньше, но к регистру будут обращаться в 100 раз реже.
вы так говорите, будто пользователя тоже нельзя свести к числу.
В общем, что не придумывай, но если количество всех обменов в день может быть больше 99999, задача решения не имеет.
(18) ПолучитьНомерСеанса() - но числа большие получаются, от 100 000 и более
(9) Обращение к регистру ПередЗаписью, там в основном проверки

(21) В смысле? 90000 уже не уникально? :)

(22) В (18) пишется про пользователя, а не про сеанс. Пользователей обычно какое-то разумное количество, сеансов может быть больше, но нам интересны именно пользователи, как я понимаю ТС.

(29) числа все уникальные и все пятизначные - все в соответствие с тз

(32) полной уникальности не будет, но вероятнось будет маленькая.

еще вариант - секунда + идсеанса

(35) Нужна уникальность, секунда + Ид сеанса - число очень большое. К примеру, номер сеанса 50, последняя секунда дня, УИД=5086399

(36) длинна уменьшается хеш функцией

по этому делай уникальный номер любой длинны а потом его хешируй

(0) Элементарно Ватсон! Бери количество миллисекунд и всё.
(37) Хм, не могу придумать взаимнооднозначное соответствие диапазона от 100000 до бесконечности к от 0 до 99 999. Кстати, интересно, как формируется номер сеанса пользователя, какое макс. число.
(39) Хотя не от 100000 до бесконечности, будут дырки длинной 99 999 между номерами сеансов.
(38) Гарантированной уникальности не будет.
Подогрею интерес, оборудование медицинское. Прикинь, сдашь кровь на гемоглобин, придет ответ - ганарея.
(42) Ваша задача, в том виде, как она сформулирована в (0), решения не имеет, я повторюсь. Вы ограничиваете количество возможных идентификаторов (Х), но при этом не накладываете никакого ограничения на количество возможных обменов (Y). Соответственно, обменов всегда может быть больше, чем емкость идентификатора (для любого X есть Y такой что Y > X).

Так чем не устраивает (используя глобальную переменную) ?

(47)Количество одновременных пользователей здесь будет ограничено скорее 1000, чем 100. Кроме того, можно подобрать другую длину диапазона. Если диапазон сделать 50, то количество пользователей будет ограничено числом 2000. Главное, что здесь обеспечивается уникальность и решается проблема быстродействия.

(14)из за того что год не ровно 365 дней и 6 часов
год високосен, то есть содержит 366 дней, если:

остальные годы — номер года кратен 4 и не кратен 100 (… 1892, 1896, 1904, 1908…).

(0) Случайное число от уникального отличаешь?
Новый УникальныйИдентификатор() используй

2. получаем список сеансов, по этому списку из регистра 2 получаем список занятых диапазонов, джойним его с регистром 1 и находим свободный диапазон
3. записываем свободный диапазон в регистр 2 и сохраняем параметры в параметр сеанса

при необходимости получения номера тупо инкремируем нижнюю границу лежащую в параметре сеанса и для фиксации - пишем в регист 1

если сеансов много - можно немного оптимизировать процесс выделения диапазона

Чего то я не понял, если нужно просто уникальное в дне, зачем регистры?
Просто константа и увеличивать ее на 1

За 0 сек. выбрано 63 уничальных пятизначных чисел.
За 0 сек. выбрано 148 уничальных пятизначных чисел.
За 0 сек. выбрано 64 уничальных пятизначных чисел.
За 0 сек. выбрано 132 уничальных пятизначных чисел.
За 0 сек. выбрано 178 уничальных пятизначных чисел.
За 0 сек. выбрано 88 уничальных пятизначных чисел.
За 0 сек. выбрано 94 уничальных пятизначных чисел.
За 0 сек. выбрано 125 уничальных пятизначных чисел.
За 0 сек. выбрано 127 уничальных пятизначных чисел.
За 0 сек. выбрано 85 уничальных пятизначных чисел.
За 0 сек. выбрано 85 уничальных пятизначных чисел.
За 0 сек. выбрано 103 уничальных пятизначных чисел.
За 0 сек. выбрано 109 уничальных пятизначных чисел.
За 0 сек. выбрано 154 уничальных пятизначных чисел.
За 0 сек. выбрано 115 уничальных пятизначных чисел.
За 0 сек. выбрано 205 уничальных пятизначных чисел.
За 0 сек. выбрано 92 уничальных пятизначных чисел.
За 0 сек. выбрано 71 уничальных пятизначных чисел.
За 0 сек. выбрано 214 уничальных пятизначных чисел.
За 0 сек. выбрано 22 уничальных пятизначных чисел.
За 0 сек. выбрано 157 уничальных пятизначных чисел.
За 0 сек. выбрано 116 уничальных пятизначных чисел.
За 0 сек. выбрано 107 уничальных пятизначных чисел.
За 0 сек. выбрано 194 уничальных пятизначных чисел.
За 0 сек. выбрано 255 уничальных пятизначных чисел.
За 0 сек. выбрано 25 уничальных пятизначных чисел.
За 0 сек. выбрано 111 уничальных пятизначных чисел.
За 0 сек. выбрано 77 уничальных пятизначных чисел.
За 0 сек. выбрано 73 уничальных пятизначных чисел.
За 0 сек. выбрано 251 уничальных пятизначных чисел.
За 0 сек. выбрано 292 уничальных пятизначных чисел.
За 0 сек. выбрано 89 уничальных пятизначных чисел.
За 0 сек. выбрано 215 уничальных пятизначных чисел.
За 0 сек. выбрано 70 уничальных пятизначных чисел.
За 0 сек. выбрано 223 уничальных пятизначных чисел.
За 0 сек. выбрано 18 уничальных пятизначных чисел.
За 0 сек. выбрано 64 уничальных пятизначных чисел.
За 0 сек. выбрано 70 уничальных пятизначных чисел.
За 0 сек. выбрано 192 уничальных пятизначных чисел.
За 0 сек. выбрано 91 уничальных пятизначных чисел.
За 0 сек. выбрано 134 уничальных пятизначных чисел.
За 0 сек. выбрано 115 уничальных пятизначных чисел.
За 0 сек. выбрано 124 уничальных пятизначных чисел.
За 0 сек. выбрано 44 уничальных пятизначных чисел.
За 0 сек. выбрано 90 уничальных пятизначных чисел.
За 0 сек. выбрано 181 уничальных пятизначных чисел.
За 0 сек. выбрано 66 уничальных пятизначных чисел.
За 0 сек. выбрано 42 уничальных пятизначных чисел.
За 0 сек. выбрано 31 уничальных пятизначных чисел.
За 0 сек. выбрано 176 уничальных пятизначных чисел.
За 0 сек. выбрано 74 уничальных пятизначных чисел.
За 0 сек. выбрано 104 уничальных пятизначных чисел.
За 0 сек. выбрано 101 уничальных пятизначных чисел.
За 0 сек. выбрано 108 уничальных пятизначных чисел.
За 0 сек. выбрано 113 уничальных пятизначных чисел.
За 0 сек. выбрано 90 уничальных пятизначных чисел.
За 0 сек. выбрано 84 уничальных пятизначных чисел.
За 0 сек. выбрано 99 уничальных пятизначных чисел.
За 0 сек. выбрано 163 уничальных пятизначных чисел.
За 0 сек. выбрано 119 уничальных пятизначных чисел.
За 0 сек. выбрано 88 уничальных пятизначных чисел.
За 0 сек. выбрано 167 уничальных пятизначных чисел.
За 0 сек. выбрано 94 уничальных пятизначных чисел.
За 0 сек. выбрано 164 уничальных пятизначных чисел.
За 0 сек. выбрано 106 уничальных пятизначных чисел.
За 0 сек. выбрано 107 уничальных пятизначных чисел.
За 0 сек. выбрано 38 уничальных пятизначных чисел.
За 0 сек. выбрано 194 уничальных пятизначных чисел.
За 0 сек. выбрано 143 уничальных пятизначных чисел.
За 0 сек. выбрано 180 уничальных пятизначных чисел.
За 0 сек. выбрано 179 уничальных пятизначных чисел.
За 0 сек. выбрано 52 уничальных пятизначных чисел.
За 0 сек. выбрано 43 уничальных пятизначных чисел.
За 0 сек. выбрано 136 уничальных пятизначных чисел.
За 0 сек. выбрано 167 уничальных пятизначных чисел.
За 0 сек. выбрано 230 уничальных пятизначных чисел.
За 0 сек. выбрано 118 уничальных пятизначных чисел.
За 0 сек. выбрано 34 уничальных пятизначных чисел.
За 0 сек. выбрано 123 уничальных пятизначных чисел.
За 0 сек. выбрано 11 уничальных пятизначных чисел.
За 0 сек. выбрано 189 уничальных пятизначных чисел.
За 0 сек. выбрано 66 уничальных пятизначных чисел.

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

Наконец-то платформа 1С с версии 8.3.9 позволяет разработчику работать с двоичными данными в полном объеме при помощи встроенных функций, не прибегая к COM-объектам и внешним компонентам. Рассмотрим упрощенный алгоритм генерации уникального идентификатора версии 1, то есть по алгоритму основанному на времени. Конструкция Новый УникальныйИдентификатор() генерирует уникальный идентификатор версии 4, то есть по алгоритму основанному на случайном числе. Выяснить версию уникального идентификатора очень легко, так как уникальный идентификатор хранит в себе версию, поэтому можно либо самому декодировать UUID и вычислить версию, либо прибегнуть к помощи сайтам, которые умеют декодировать UUID (см. рисунок 1).

Уникальный идентификатор состоит из шести полей, которые представляют собой упорядоченную последовательность:

  1. Поле TimeLow - четыре октета;
  2. Поле TimeMid - два октета;
  3. Поле VersionAndTimeHigh - два октета;
  4. Поле VariantAndClockSeqHigh - один октет;
  5. Поле ClockSeqLow - один октет;
  6. Поле Node - шесть октетов.

1) Генерируем случайное 14-битное число для временной последовательности, значение 16383 является максимальным беззнаковым 14-битным десятичным числом. Так как рассматриваем упрощенный алгоритм, то при каждой генерации нового уникального идентификатора будем генерировать случайное число для временной последовательности.

2) Время должно быть 60-битовым значением, отсчитываем в 100 наносекундных интервалах всемирного скоординированного времени (UTC), начиная от полуночи 15 октября 1582 года (дата григорианской реформы христианского календаря). Внимание, так как время отсчитываем в 100 наносекундных интервалах UTC, то переменная МеткаВремени должна содержать время UTC.

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

3) Помещаем время, отсчитанное в 100 наносекундных интервалах, в буфер двоичных данных. В байте, который находится в нулевой позиции буфера для бита под номером 4 устанавливаем значение Истина (1), тем самым указываем версию алгоритма.

4) Помещаем случайное 14-битное число в буфер двоичных данных. В байте, который находится в нулевой позиции буфера для бита под номером 7 устанавливаем значение Истина (1), так требует алгоритм.

5) Получаем HEX-строки для полей уникального идентификатора: TimeLow, TimeMid, VersionAndTimeHigh, VariantAndClockSeqHigh, ClockSeqLow.

6) HEX-строку для поля Node получаем из шестнадцатеричного представления MAC-адреса сетевой карты, из которого убираем двоеточие. Средствами платформы невозможно получить MAC-адрес сетевой карты, поэтому переменная АдресСетевойКарты должна содержать строку вида "XX:XX:XX:XX:XX:XX".

7) После того, как все поля уникального идентификатора вычислены, собираем их в определенной последовательности и получаем новый уникальный идентификатор в шестнадцатеричном представлении. Итоговый код функции:

Результат выполнения функции проверяем на сайте по декодированию уникального идентификатора (см. рисунок 2).

Все хорошо, уникальный идентификатор декодируется, он версии 1, содержит в себе закодированную дату UTC.

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

Структура: Структура1.Ключ1

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

Хоть и в ключ и значение соответствия можно записать переменные любого типа, использование типов в этом случае очень сильно зависит от контекста и от вида клиента: мы не можем в клиентском задать в ключ или значение, тип которого работает только в серверном контексте (например, ДокументОбъект.<>).

Новое соответствие создается при помощи конструктора Новый.

Соответствие1 = Новый Соответствие;

Для того, чтобы добавить новый элемент соответствия, необходимо использовать метод Вставить, который имеет следующий синтаксис:

Вставить(<Ключ>, <Значение>)

Параметр «Ключ» может иметь любой тип! Это очень важное свойство, таким образом, с помощью коллекции Соответствие можно в процессе работы устанавливать соответствие любых объектов с любыми объектами.

Простой пример работы с соответствием:

Для того чтобы поменять значение какого-нибудь элемента, который соответствует определенному ключу, достаточно для этого ключа присвоить новое значение.

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

Обход соответствия 1С

Обходить соответствие можно с помощью цикла Для каждого…Цикл.

Результат обхода соответствия 1С

Безошибочное получении значения соответствия 1С

Как Вы уже поняли, для того чтобы получить значение элемента соответствия, мы используем квадратные скобки. Но иногда возможны ситуации, когда применение квадратных скобок неосуществимо. В таких случаях мы можем использовать метод Получить, который возвращает любое значение, соответствующее ключу. Если такого ключа нет, то вернется значение Неопределено

Рассмотрим работу данного метода на соответствии с датами в качестве ключей.

Результат использования метода Получить

Статьи о других универсальных коллекциях значений в 1С


Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным


Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:

можно оплатить вручную:

Вступайте в мои группы:

One thought on “ Учимся работать с соответствием в 1С 8.3 ”

Читайте также: