arxo-codegen 0.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- arxo_codegen/__init__.py +5 -0
- arxo_codegen/__main__.py +7 -0
- arxo_codegen/active-outcomes.json +6837 -0
- arxo_codegen/check.py +158 -0
- arxo_codegen/check_active_canaries.py +262 -0
- arxo_codegen/check_api.py +76 -0
- arxo_codegen/check_conformance.py +414 -0
- arxo_codegen/check_matrix.py +131 -0
- arxo_codegen/check_packages.py +281 -0
- arxo_codegen/check_semantic_probes.py +293 -0
- arxo_codegen/check_xlsx.py +320 -0
- arxo_codegen/consumer_runner.py +316 -0
- arxo_codegen/core_support.py +203 -0
- arxo_codegen/coverage.py +341 -0
- arxo_codegen/deliver.py +180 -0
- arxo_codegen/examples/xlsx/pricing.lawir.json +409 -0
- arxo_codegen/examples/xlsx/pricing.xlsx.json +52 -0
- arxo_codegen/excel_plan.py +602 -0
- arxo_codegen/harness/verify/ci/gates/backends/check_backends.py +1248 -0
- arxo_codegen/harness/verify/ci/gates/backends/l1_fixtures.py +463 -0
- arxo_codegen/inert-nodes.json +62 -0
- arxo_codegen/inert.py +91 -0
- arxo_codegen/inputs.py +59 -0
- arxo_codegen/package.py +565 -0
- arxo_codegen/plan.py +4053 -0
- arxo_codegen/recertify_registry.py +100 -0
- arxo_codegen/runtime-cert.json +5259 -0
- arxo_codegen/runtime_cert.py +233 -0
- arxo_codegen/survey.py +272 -0
- arxo_codegen/target_runner.py +101 -0
- arxo_codegen/targets/bsl/cert.bsl +113 -0
- arxo_codegen/targets/bsl/emit.py +356 -0
- arxo_codegen/targets/bsl/json.bsl +243 -0
- arxo_codegen/targets/bsl/runner.bsl +210 -0
- arxo_codegen/targets/bsl/runtime.bsl +858 -0
- arxo_codegen/targets/cs/Cert.cs +90 -0
- arxo_codegen/targets/cs/Runner.cs +154 -0
- arxo_codegen/targets/cs/Runtime.cs +243 -0
- arxo_codegen/targets/cs/emit.py +223 -0
- arxo_codegen/targets/dart/cert.dart +99 -0
- arxo_codegen/targets/dart/emit.py +206 -0
- arxo_codegen/targets/dart/json.dart +166 -0
- arxo_codegen/targets/dart/runner.dart +154 -0
- arxo_codegen/targets/dart/runtime.dart +293 -0
- arxo_codegen/targets/erl/cert.erl +64 -0
- arxo_codegen/targets/erl/emit.py +216 -0
- arxo_codegen/targets/erl/rt.erl +238 -0
- arxo_codegen/targets/erl/runner.erl +130 -0
- arxo_codegen/targets/ex/cert.exs +62 -0
- arxo_codegen/targets/ex/emit.py +204 -0
- arxo_codegen/targets/ex/runner.exs +124 -0
- arxo_codegen/targets/ex/runtime.ex +227 -0
- arxo_codegen/targets/go/apiBase.go +483 -0
- arxo_codegen/targets/go/apicheck.go +97 -0
- arxo_codegen/targets/go/cert.go +218 -0
- arxo_codegen/targets/go/emit.py +1806 -0
- arxo_codegen/targets/go/evaluate.go +1826 -0
- arxo_codegen/targets/go/runner.go +38 -0
- arxo_codegen/targets/go/runtime.go +2612 -0
- arxo_codegen/targets/java/Cert.java +91 -0
- arxo_codegen/targets/java/Json.java +148 -0
- arxo_codegen/targets/java/Runner.java +151 -0
- arxo_codegen/targets/java/Runtime.java +243 -0
- arxo_codegen/targets/java/emit.py +198 -0
- arxo_codegen/targets/kt/Cert.kt +67 -0
- arxo_codegen/targets/kt/Json.kt +103 -0
- arxo_codegen/targets/kt/Runner.kt +126 -0
- arxo_codegen/targets/kt/Runtime.kt +196 -0
- arxo_codegen/targets/kt/emit.py +195 -0
- arxo_codegen/targets/lua/cert.lua +82 -0
- arxo_codegen/targets/lua/emit.py +250 -0
- arxo_codegen/targets/lua/json.lua +133 -0
- arxo_codegen/targets/lua/runner.lua +167 -0
- arxo_codegen/targets/lua/runtime.lua +541 -0
- arxo_codegen/targets/php/cert.php +84 -0
- arxo_codegen/targets/php/emit.py +229 -0
- arxo_codegen/targets/php/json.php +144 -0
- arxo_codegen/targets/php/runner.php +189 -0
- arxo_codegen/targets/php/runtime.php +660 -0
- arxo_codegen/targets/py/api_base.py +334 -0
- arxo_codegen/targets/py/apicheck.py +51 -0
- arxo_codegen/targets/py/cert.py +140 -0
- arxo_codegen/targets/py/emit.py +1140 -0
- arxo_codegen/targets/py/evaluate.py +980 -0
- arxo_codegen/targets/py/runner.py +38 -0
- arxo_codegen/targets/py/runtime.py +1634 -0
- arxo_codegen/targets/rb/cert.rb +73 -0
- arxo_codegen/targets/rb/emit.py +203 -0
- arxo_codegen/targets/rb/runner.rb +130 -0
- arxo_codegen/targets/rb/runtime.rb +255 -0
- arxo_codegen/targets/rs/Cargo.lock +142 -0
- arxo_codegen/targets/rs/Cargo.toml +16 -0
- arxo_codegen/targets/rs/cert.rs +106 -0
- arxo_codegen/targets/rs/emit.py +233 -0
- arxo_codegen/targets/rs/prefetch.rs +1 -0
- arxo_codegen/targets/rs/runner.rs +181 -0
- arxo_codegen/targets/rs/runtime.rs +448 -0
- arxo_codegen/targets/scala/Cert.scala +77 -0
- arxo_codegen/targets/scala/Json.scala +140 -0
- arxo_codegen/targets/scala/Runner.scala +121 -0
- arxo_codegen/targets/scala/Runtime.scala +269 -0
- arxo_codegen/targets/scala/emit.py +193 -0
- arxo_codegen/targets/swift/cert.swift +105 -0
- arxo_codegen/targets/swift/emit.py +231 -0
- arxo_codegen/targets/swift/json.swift +208 -0
- arxo_codegen/targets/swift/runner.swift +133 -0
- arxo_codegen/targets/swift/runtime.swift +528 -0
- arxo_codegen/targets/ts/apiBase.ts +250 -0
- arxo_codegen/targets/ts/apicheck.ts +37 -0
- arxo_codegen/targets/ts/cert.ts +96 -0
- arxo_codegen/targets/ts/emit.py +1214 -0
- arxo_codegen/targets/ts/evaluate.ts +894 -0
- arxo_codegen/targets/ts/package-lock.json +45 -0
- arxo_codegen/targets/ts/package.json +9 -0
- arxo_codegen/targets/ts/runner.ts +31 -0
- arxo_codegen/targets/ts/runtime.ts +1369 -0
- arxo_codegen/targets/xlsx/README.ru.md +176 -0
- arxo_codegen/targets/xlsx/emit.py +198 -0
- arxo_codegen/temporal.py +59 -0
- arxo_codegen/test_alias_types.py +171 -0
- arxo_codegen/test_api_contract.py +89 -0
- arxo_codegen/test_calendar_policy.py +48 -0
- arxo_codegen/test_check.py +49 -0
- arxo_codegen/test_check_active_canaries.py +96 -0
- arxo_codegen/test_check_conformance.py +132 -0
- arxo_codegen/test_check_semantic_probes.py +85 -0
- arxo_codegen/test_check_xlsx.py +52 -0
- arxo_codegen/test_consumer_runner.py +175 -0
- arxo_codegen/test_core_support.py +80 -0
- arxo_codegen/test_e0212_decision_time.py +63 -0
- arxo_codegen/test_head_aggregate.py +71 -0
- arxo_codegen/test_inert.py +143 -0
- arxo_codegen/test_instant_types.py +113 -0
- arxo_codegen/test_key_conflict_scope.py +92 -0
- arxo_codegen/test_key_conflict_targets.py +17 -0
- arxo_codegen/test_package_layout.py +163 -0
- arxo_codegen/test_plan_language_version.py +44 -0
- arxo_codegen/test_positions_refusal.py +43 -0
- arxo_codegen/test_recertify_registry.py +77 -0
- arxo_codegen/test_ruby_target.py +41 -0
- arxo_codegen/test_runtime_cert.py +83 -0
- arxo_codegen/test_secondary_key_conflict_scope.py +17 -0
- arxo_codegen/test_stage_r.py +108 -0
- arxo_codegen/test_standalone_inputs.py +71 -0
- arxo_codegen/test_support.py +150 -0
- arxo_codegen/test_survey_inputs.py +115 -0
- arxo_codegen-0.4.0.dist-info/LICENSE +202 -0
- arxo_codegen-0.4.0.dist-info/METADATA +1673 -0
- arxo_codegen-0.4.0.dist-info/RECORD +152 -0
- arxo_codegen-0.4.0.dist-info/WHEEL +5 -0
- arxo_codegen-0.4.0.dist-info/entry_points.txt +13 -0
- arxo_codegen-0.4.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,858 @@
|
|
|
1
|
+
// Рантайм L0 для встроенного языка 1С (исполнитель в воротах — OneScript).
|
|
2
|
+
// Тот же контракт, что у runtime.rb: точная десятичная арифметика §58, деньги
|
|
3
|
+
// с валютой, названный режим округления, календарный день, член перечисления.
|
|
4
|
+
//
|
|
5
|
+
// Число — не место для значений дела. У OneScript это .NET decimal (28–29
|
|
6
|
+
// значащих цифр), у платформы — 38 цифр; оба ОКРУГЛЯЮТ МОЛЧА, как только цифр
|
|
7
|
+
// больше (проба OneScript 2.2.0: 1/3 и дробь из 30 знаков режутся без ошибки),
|
|
8
|
+
// громко падает только переполнение целой части. Поэтому значение — длинное
|
|
9
|
+
// целое по основанию 10^7 и масштаб, а Число хранит лишь разряды: произведение
|
|
10
|
+
// двух разрядов с переносом меньше 10^15 и точно у обоих исполнителей.
|
|
11
|
+
//
|
|
12
|
+
// Имена операций контракта — с префиксом op_: pow, round, min, max и date
|
|
13
|
+
// заняты глобальным контекстом, методом класса такое имя быть не может.
|
|
14
|
+
// Регистр в BSL не различается, `И` — ключевое слово: имена ниже подобраны так,
|
|
15
|
+
// чтобы не совпадать ни с ключевыми словами, ни друг с другом без учёта регистра.
|
|
16
|
+
|
|
17
|
+
Перем БАЗА;
|
|
18
|
+
Перем ПРЕФИКС_ОТКАЗА;
|
|
19
|
+
Перем ВремяПрава;
|
|
20
|
+
Перем POW_MIN;
|
|
21
|
+
Перем POW_MAX;
|
|
22
|
+
Перем Десять;
|
|
23
|
+
Перем Степени;
|
|
24
|
+
Перем ТипСтрока;
|
|
25
|
+
Перем ТипСтруктура;
|
|
26
|
+
Перем ТипЧисло;
|
|
27
|
+
|
|
28
|
+
// Названный отказ рантайма: то, что срез не считает, а не сбой. Исключение с
|
|
29
|
+
// префиксом; раннер печатает его как JSON с кодом выхода 3, любое другое
|
|
30
|
+
// исключение — крах.
|
|
31
|
+
Процедура Отказ(Текст) Экспорт
|
|
32
|
+
ВызватьИсключение ПРЕФИКС_ОТКАЗА + Текст;
|
|
33
|
+
КонецПроцедуры
|
|
34
|
+
|
|
35
|
+
// Текст отказа из описания исключения либо Неопределено, если это не отказ.
|
|
36
|
+
Функция ТекстОтказа(Описание) Экспорт
|
|
37
|
+
Длина = СтрДлина(ПРЕФИКС_ОТКАЗА);
|
|
38
|
+
Если Лев(Описание, Длина) = ПРЕФИКС_ОТКАЗА Тогда
|
|
39
|
+
Возврат Сред(Описание, Длина + 1);
|
|
40
|
+
КонецЕсли;
|
|
41
|
+
Возврат Неопределено;
|
|
42
|
+
КонецФункции
|
|
43
|
+
|
|
44
|
+
// --- целые произвольной длины ------------------------------------------------
|
|
45
|
+
// Структура {Отр, Разр}: Разр — Массив разрядов от младшего; ноль — пустой
|
|
46
|
+
// Разр и Отр = Ложь. Массивы разрядов не изменяются после построения значения.
|
|
47
|
+
|
|
48
|
+
Функция Обрезать(Разр)
|
|
49
|
+
Н = Разр.Количество();
|
|
50
|
+
Пока Н > 0 Цикл
|
|
51
|
+
Если Разр[Н - 1] <> 0 Тогда
|
|
52
|
+
Прервать;
|
|
53
|
+
КонецЕсли;
|
|
54
|
+
Разр.Удалить(Н - 1);
|
|
55
|
+
Н = Н - 1;
|
|
56
|
+
КонецЦикла;
|
|
57
|
+
Возврат Разр;
|
|
58
|
+
КонецФункции
|
|
59
|
+
|
|
60
|
+
Функция Целое(Отр, Разр)
|
|
61
|
+
Обрезать(Разр);
|
|
62
|
+
Возврат Новый Структура("Отр, Разр", Отр И Разр.Количество() > 0, Разр);
|
|
63
|
+
КонецФункции
|
|
64
|
+
|
|
65
|
+
Функция Большее(А, Б)
|
|
66
|
+
Если А > Б Тогда
|
|
67
|
+
Возврат А;
|
|
68
|
+
КонецЕсли;
|
|
69
|
+
Возврат Б;
|
|
70
|
+
КонецФункции
|
|
71
|
+
|
|
72
|
+
Функция РазрядИли0(Разр, Инд)
|
|
73
|
+
Если Инд < Разр.Количество() Тогда
|
|
74
|
+
Возврат Разр[Инд];
|
|
75
|
+
КонецЕсли;
|
|
76
|
+
Возврат 0;
|
|
77
|
+
КонецФункции
|
|
78
|
+
|
|
79
|
+
Функция РазобратьЦелое(Знач Текст)
|
|
80
|
+
Отр = Лев(Текст, 1) = "-";
|
|
81
|
+
Цифры = ?(Отр, Сред(Текст, 2), Текст);
|
|
82
|
+
Длина = СтрДлина(Цифры);
|
|
83
|
+
Если Длина = 0 Тогда
|
|
84
|
+
ВызватьИсключение "целое: не десятичная запись: " + Текст;
|
|
85
|
+
КонецЕсли;
|
|
86
|
+
Разр = Новый Массив;
|
|
87
|
+
Кон = Длина;
|
|
88
|
+
Пока Кон >= 1 Цикл
|
|
89
|
+
Нач = Большее(1, Кон - 6);
|
|
90
|
+
Р = 0;
|
|
91
|
+
Для Поз = Нач По Кон Цикл
|
|
92
|
+
Код = КодСимвола(Цифры, Поз);
|
|
93
|
+
Если Код < 48 Или Код > 57 Тогда
|
|
94
|
+
ВызватьИсключение "целое: не десятичная запись: " + Текст;
|
|
95
|
+
КонецЕсли;
|
|
96
|
+
Р = Р * 10 + (Код - 48);
|
|
97
|
+
КонецЦикла;
|
|
98
|
+
Разр.Добавить(Р);
|
|
99
|
+
Кон = Нач - 1;
|
|
100
|
+
КонецЦикла;
|
|
101
|
+
Возврат Целое(Отр, Разр);
|
|
102
|
+
КонецФункции
|
|
103
|
+
|
|
104
|
+
// Малое целое Число (показатели, масштабы) в длинное.
|
|
105
|
+
Функция ИзМалого(Знач Н)
|
|
106
|
+
Отр = Н < 0;
|
|
107
|
+
Если Отр Тогда
|
|
108
|
+
Н = -Н;
|
|
109
|
+
КонецЕсли;
|
|
110
|
+
Разр = Новый Массив;
|
|
111
|
+
Пока Н > 0 Цикл
|
|
112
|
+
Остаток = Н % БАЗА;
|
|
113
|
+
Разр.Добавить(Остаток);
|
|
114
|
+
Н = (Н - Остаток) / БАЗА;
|
|
115
|
+
КонецЦикла;
|
|
116
|
+
Возврат Целое(Отр, Разр);
|
|
117
|
+
КонецФункции
|
|
118
|
+
|
|
119
|
+
// Цифры разряда без Строка() и Формат(): платформа группирует разряды
|
|
120
|
+
// неразрывным пробелом, а Формат(0) без ЧН даёт пустую строку.
|
|
121
|
+
Функция ЦифрыРазряда(Знач Р, Ширина) Экспорт
|
|
122
|
+
Т = "";
|
|
123
|
+
Пока Р > 0 Или СтрДлина(Т) < Ширина Цикл
|
|
124
|
+
Остаток = Р % 10;
|
|
125
|
+
Т = Символ(48 + Остаток) + Т;
|
|
126
|
+
Р = (Р - Остаток) / 10;
|
|
127
|
+
КонецЦикла;
|
|
128
|
+
Возврат Т;
|
|
129
|
+
КонецФункции
|
|
130
|
+
|
|
131
|
+
// Разряды печатаются Формат(..., "ЧГ=0") без группировки; ведущие нули
|
|
132
|
+
// внутреннего разряда — через прибавку БАЗА и отбрасывание старшей единицы.
|
|
133
|
+
Функция ЗаписьЦелого(Х) Экспорт
|
|
134
|
+
Н = Х.Разр.Количество();
|
|
135
|
+
Если Н = 0 Тогда
|
|
136
|
+
Возврат "0";
|
|
137
|
+
КонецЕсли;
|
|
138
|
+
Т = Формат(Х.Разр[Н - 1], "ЧГ=0");
|
|
139
|
+
Для Инд = 2 По Н Цикл
|
|
140
|
+
Т = Т + Сред(Формат(БАЗА + Х.Разр[Н - Инд], "ЧГ=0"), 2);
|
|
141
|
+
КонецЦикла;
|
|
142
|
+
Возврат ?(Х.Отр, "-", "") + Т;
|
|
143
|
+
КонецФункции
|
|
144
|
+
|
|
145
|
+
Функция СравнитьМодули(А, Б)
|
|
146
|
+
Если А.Количество() <> Б.Количество() Тогда
|
|
147
|
+
Возврат ?(А.Количество() < Б.Количество(), -1, 1);
|
|
148
|
+
КонецЕсли;
|
|
149
|
+
Для Инд = 1 По А.Количество() Цикл
|
|
150
|
+
К = А.Количество() - Инд;
|
|
151
|
+
Если А[К] <> Б[К] Тогда
|
|
152
|
+
Возврат ?(А[К] < Б[К], -1, 1);
|
|
153
|
+
КонецЕсли;
|
|
154
|
+
КонецЦикла;
|
|
155
|
+
Возврат 0;
|
|
156
|
+
КонецФункции
|
|
157
|
+
|
|
158
|
+
Функция СложитьМодули(А, Б)
|
|
159
|
+
Рез = Новый Массив;
|
|
160
|
+
Перенос = 0;
|
|
161
|
+
Для Инд = 0 По Большее(А.Количество(), Б.Количество()) - 1 Цикл
|
|
162
|
+
Т = РазрядИли0(А, Инд) + РазрядИли0(Б, Инд) + Перенос;
|
|
163
|
+
Перенос = ?(Т >= БАЗА, 1, 0);
|
|
164
|
+
Рез.Добавить(Т - Перенос * БАЗА);
|
|
165
|
+
КонецЦикла;
|
|
166
|
+
Если Перенос > 0 Тогда
|
|
167
|
+
Рез.Добавить(Перенос);
|
|
168
|
+
КонецЕсли;
|
|
169
|
+
Возврат Рез;
|
|
170
|
+
КонецФункции
|
|
171
|
+
|
|
172
|
+
// |А| >= |Б|.
|
|
173
|
+
Функция ВычестьМодули(А, Б)
|
|
174
|
+
Рез = Новый Массив;
|
|
175
|
+
Заём = 0;
|
|
176
|
+
Для Инд = 0 По А.Количество() - 1 Цикл
|
|
177
|
+
Т = А[Инд] - РазрядИли0(Б, Инд) - Заём;
|
|
178
|
+
Заём = ?(Т < 0, 1, 0);
|
|
179
|
+
Рез.Добавить(Т + Заём * БАЗА);
|
|
180
|
+
КонецЦикла;
|
|
181
|
+
Возврат Обрезать(Рез);
|
|
182
|
+
КонецФункции
|
|
183
|
+
|
|
184
|
+
Функция УмножитьМодули(А, Б)
|
|
185
|
+
Рез = Новый Массив;
|
|
186
|
+
Если А.Количество() = 0 Или Б.Количество() = 0 Тогда
|
|
187
|
+
Возврат Рез;
|
|
188
|
+
КонецЕсли;
|
|
189
|
+
Для Инд = 1 По А.Количество() + Б.Количество() Цикл
|
|
190
|
+
Рез.Добавить(0);
|
|
191
|
+
КонецЦикла;
|
|
192
|
+
Для Ка = 0 По А.Количество() - 1 Цикл
|
|
193
|
+
Перенос = 0;
|
|
194
|
+
Ра = А[Ка];
|
|
195
|
+
Для Кб = 0 По Б.Количество() - 1 Цикл
|
|
196
|
+
Т = Рез[Ка + Кб] + Ра * Б[Кб] + Перенос;
|
|
197
|
+
Рез[Ка + Кб] = Т % БАЗА;
|
|
198
|
+
Перенос = (Т - Рез[Ка + Кб]) / БАЗА;
|
|
199
|
+
КонецЦикла;
|
|
200
|
+
К = Ка + Б.Количество();
|
|
201
|
+
Пока Перенос > 0 Цикл
|
|
202
|
+
Т = Рез[К] + Перенос;
|
|
203
|
+
Рез[К] = Т % БАЗА;
|
|
204
|
+
Перенос = (Т - Рез[К]) / БАЗА;
|
|
205
|
+
К = К + 1;
|
|
206
|
+
КонецЦикла;
|
|
207
|
+
КонецЦикла;
|
|
208
|
+
Возврат Обрезать(Рез);
|
|
209
|
+
КонецФункции
|
|
210
|
+
|
|
211
|
+
// Множитель меньше БАЗА.
|
|
212
|
+
Функция УмножитьНаМалое(А, Множ)
|
|
213
|
+
Рез = Новый Массив;
|
|
214
|
+
Перенос = 0;
|
|
215
|
+
Для Инд = 0 По А.Количество() - 1 Цикл
|
|
216
|
+
Т = А[Инд] * Множ + Перенос;
|
|
217
|
+
Рез.Добавить(Т % БАЗА);
|
|
218
|
+
Перенос = (Т - Рез[Инд]) / БАЗА;
|
|
219
|
+
КонецЦикла;
|
|
220
|
+
Пока Перенос > 0 Цикл
|
|
221
|
+
Остаток = Перенос % БАЗА;
|
|
222
|
+
Рез.Добавить(Остаток);
|
|
223
|
+
Перенос = (Перенос - Остаток) / БАЗА;
|
|
224
|
+
КонецЦикла;
|
|
225
|
+
Возврат Обрезать(Рез);
|
|
226
|
+
КонецФункции
|
|
227
|
+
|
|
228
|
+
// Деление модулей в столбик: цифра частного по основанию 10^7 подбирается
|
|
229
|
+
// двоичным поиском; делитель ненулевой. Частное целых — только через остаток:
|
|
230
|
+
// деление Числа с бесконечной дробью округлялось бы молча.
|
|
231
|
+
Функция ДелитьМодули(А, Б)
|
|
232
|
+
Ч = Новый Массив;
|
|
233
|
+
Ост = Новый Массив;
|
|
234
|
+
Если СравнитьМодули(А, Б) < 0 Тогда
|
|
235
|
+
Для Каждого Р Из А Цикл
|
|
236
|
+
Ост.Добавить(Р);
|
|
237
|
+
КонецЦикла;
|
|
238
|
+
Возврат Новый Структура("Ч, О", Ч, Ост);
|
|
239
|
+
КонецЕсли;
|
|
240
|
+
Для Инд = 1 По А.Количество() Цикл
|
|
241
|
+
Ч.Добавить(0);
|
|
242
|
+
КонецЦикла;
|
|
243
|
+
Если Б.Количество() = 1 Тогда
|
|
244
|
+
// Однозначный делитель: остаток разряда меньше делителя, Т < 10^14.
|
|
245
|
+
Д = Б[0];
|
|
246
|
+
Остаток = 0;
|
|
247
|
+
Для Инд = 1 По А.Количество() Цикл
|
|
248
|
+
К = А.Количество() - Инд;
|
|
249
|
+
Т = Остаток * БАЗА + А[К];
|
|
250
|
+
Остаток = Т % Д;
|
|
251
|
+
Ч[К] = (Т - Остаток) / Д;
|
|
252
|
+
КонецЦикла;
|
|
253
|
+
Если Остаток > 0 Тогда
|
|
254
|
+
Ост.Добавить(Остаток);
|
|
255
|
+
КонецЕсли;
|
|
256
|
+
Возврат Новый Структура("Ч, О", Обрезать(Ч), Ост);
|
|
257
|
+
КонецЕсли;
|
|
258
|
+
Для Инд = 1 По А.Количество() Цикл
|
|
259
|
+
К = А.Количество() - Инд;
|
|
260
|
+
Ост.Вставить(0, А[К]);
|
|
261
|
+
Обрезать(Ост);
|
|
262
|
+
Низ = 0;
|
|
263
|
+
Верх = БАЗА - 1;
|
|
264
|
+
Пока Низ < Верх Цикл
|
|
265
|
+
Сер = Низ + Верх + 1;
|
|
266
|
+
Сер = (Сер - Сер % 2) / 2;
|
|
267
|
+
Если СравнитьМодули(УмножитьНаМалое(Б, Сер), Ост) <= 0 Тогда
|
|
268
|
+
Низ = Сер;
|
|
269
|
+
Иначе
|
|
270
|
+
Верх = Сер - 1;
|
|
271
|
+
КонецЕсли;
|
|
272
|
+
КонецЦикла;
|
|
273
|
+
Если Низ > 0 Тогда
|
|
274
|
+
Ост = ВычестьМодули(Ост, УмножитьНаМалое(Б, Низ));
|
|
275
|
+
КонецЕсли;
|
|
276
|
+
Ч[К] = Низ;
|
|
277
|
+
КонецЦикла;
|
|
278
|
+
Возврат Новый Структура("Ч, О", Обрезать(Ч), Ост);
|
|
279
|
+
КонецФункции
|
|
280
|
+
|
|
281
|
+
Функция ЦелСложить(Х, У)
|
|
282
|
+
Если Х.Отр = У.Отр Тогда
|
|
283
|
+
Возврат Целое(Х.Отр, СложитьМодули(Х.Разр, У.Разр));
|
|
284
|
+
КонецЕсли;
|
|
285
|
+
С = СравнитьМодули(Х.Разр, У.Разр);
|
|
286
|
+
Если С = 0 Тогда
|
|
287
|
+
Возврат Целое(Ложь, Новый Массив);
|
|
288
|
+
ИначеЕсли С > 0 Тогда
|
|
289
|
+
Возврат Целое(Х.Отр, ВычестьМодули(Х.Разр, У.Разр));
|
|
290
|
+
КонецЕсли;
|
|
291
|
+
Возврат Целое(У.Отр, ВычестьМодули(У.Разр, Х.Разр));
|
|
292
|
+
КонецФункции
|
|
293
|
+
|
|
294
|
+
Функция ЦелПротивоположное(Х)
|
|
295
|
+
Возврат Целое(Не Х.Отр, Х.Разр);
|
|
296
|
+
КонецФункции
|
|
297
|
+
|
|
298
|
+
Функция ЦелВычесть(Х, У)
|
|
299
|
+
Возврат ЦелСложить(Х, ЦелПротивоположное(У));
|
|
300
|
+
КонецФункции
|
|
301
|
+
|
|
302
|
+
Функция ЦелУмножить(Х, У)
|
|
303
|
+
Возврат Целое(Х.Отр <> У.Отр, УмножитьМодули(Х.Разр, У.Разр));
|
|
304
|
+
КонецФункции
|
|
305
|
+
|
|
306
|
+
Функция ЦелНоль(Х)
|
|
307
|
+
Возврат Х.Разр.Количество() = 0;
|
|
308
|
+
КонецФункции
|
|
309
|
+
|
|
310
|
+
Функция ЦелСравнить(Х, У)
|
|
311
|
+
Если Х.Отр <> У.Отр Тогда
|
|
312
|
+
Возврат ?(Х.Отр, -1, 1);
|
|
313
|
+
КонецЕсли;
|
|
314
|
+
С = СравнитьМодули(Х.Разр, У.Разр);
|
|
315
|
+
Возврат ?(Х.Отр, -С, С);
|
|
316
|
+
КонецФункции
|
|
317
|
+
|
|
318
|
+
Функция ЦелМодуль(Х)
|
|
319
|
+
Возврат Целое(Ложь, Х.Разр);
|
|
320
|
+
КонецФункции
|
|
321
|
+
|
|
322
|
+
// Частное и остаток с усечением к нулю: знак остатка — знак делимого.
|
|
323
|
+
Функция ЦелДелить(Х, У)
|
|
324
|
+
ЧО = ДелитьМодули(Х.Разр, У.Разр);
|
|
325
|
+
Возврат Новый Структура("Ч, О", Целое(Х.Отр <> У.Отр, ЧО.Ч), Целое(Х.Отр, ЧО.О));
|
|
326
|
+
КонецФункции
|
|
327
|
+
|
|
328
|
+
// Степени десяти кэшируются: значения не изменяются после построения, поэтому
|
|
329
|
+
// одно значение безопасно делится между вызовами.
|
|
330
|
+
Функция Степень10(К)
|
|
331
|
+
Пока Степени.Количество() <= К Цикл
|
|
332
|
+
Степени.Добавить(Целое(Ложь, УмножитьНаМалое(Степени[Степени.Количество() - 1].Разр, 10)));
|
|
333
|
+
КонецЦикла;
|
|
334
|
+
Возврат Степени[К];
|
|
335
|
+
КонецФункции
|
|
336
|
+
|
|
337
|
+
Функция ЦелНОД(Х, У)
|
|
338
|
+
А = ЦелМодуль(Х);
|
|
339
|
+
Б = ЦелМодуль(У);
|
|
340
|
+
Пока Не ЦелНоль(Б) Цикл
|
|
341
|
+
Остаток = ЦелДелить(А, Б).О;
|
|
342
|
+
А = Б;
|
|
343
|
+
Б = Остаток;
|
|
344
|
+
КонецЦикла;
|
|
345
|
+
Возврат А;
|
|
346
|
+
КонецФункции
|
|
347
|
+
|
|
348
|
+
// Малое Число: вызывающий обязан сперва проверить диапазон.
|
|
349
|
+
Функция ВМалое(Х)
|
|
350
|
+
Н = 0;
|
|
351
|
+
Для Инд = 1 По Х.Разр.Количество() Цикл
|
|
352
|
+
Н = Н * БАЗА + Х.Разр[Х.Разр.Количество() - Инд];
|
|
353
|
+
КонецЦикла;
|
|
354
|
+
Возврат ?(Х.Отр, -Н, Н);
|
|
355
|
+
КонецФункции
|
|
356
|
+
|
|
357
|
+
// --- значения ----------------------------------------------------------------
|
|
358
|
+
// Decimal {Вид="dec", Ц, Масштаб}, Money {Вид="money", Ц, Масштаб, Вал};
|
|
359
|
+
// календарный день §2.15 в канонической записи ISO — {Вид="date", Зн}: порядок
|
|
360
|
+
// записи и есть порядок дня; член перечисления §38 или ссылка без объявления —
|
|
361
|
+
// {Вид="sym", Ид}. Text и сущность — Строка.
|
|
362
|
+
|
|
363
|
+
Функция ЗначДес(Ц, Масштаб)
|
|
364
|
+
Возврат Новый Структура("Вид, Ц, Масштаб", "dec", Ц, Масштаб);
|
|
365
|
+
КонецФункции
|
|
366
|
+
|
|
367
|
+
Функция ЗначДеньги(Ц, Масштаб, Вал)
|
|
368
|
+
Возврат Новый Структура("Вид, Ц, Масштаб, Вал", "money", Ц, Масштаб, Вал);
|
|
369
|
+
КонецФункции
|
|
370
|
+
|
|
371
|
+
Функция ВидЗнач(З) Экспорт
|
|
372
|
+
ТЗ = ТипЗнч(З);
|
|
373
|
+
Если ТЗ = ТипСтруктура Тогда
|
|
374
|
+
Возврат З.Вид;
|
|
375
|
+
ИначеЕсли ТЗ = ТипСтрока Тогда
|
|
376
|
+
Возврат "text";
|
|
377
|
+
КонецЕсли;
|
|
378
|
+
Возврат "other";
|
|
379
|
+
КонецФункции
|
|
380
|
+
|
|
381
|
+
Функция ЧисловойВид(З)
|
|
382
|
+
В = ВидЗнач(З);
|
|
383
|
+
Возврат В = "dec" Или В = "money";
|
|
384
|
+
КонецФункции
|
|
385
|
+
|
|
386
|
+
Функция ЭтоДеньги(З)
|
|
387
|
+
Возврат ВидЗнач(З) = "money";
|
|
388
|
+
КонецФункции
|
|
389
|
+
|
|
390
|
+
Функция op_dec(Лит) Экспорт
|
|
391
|
+
Поз = СтрНайти(Лит, ".");
|
|
392
|
+
Если Поз = 0 Тогда
|
|
393
|
+
ЦелЧасть = Лит;
|
|
394
|
+
Дробь = "";
|
|
395
|
+
Иначе
|
|
396
|
+
ЦелЧасть = Лев(Лит, Поз - 1);
|
|
397
|
+
Дробь = Сред(Лит, Поз + 1);
|
|
398
|
+
КонецЕсли;
|
|
399
|
+
Отр = Лев(ЦелЧасть, 1) = "-";
|
|
400
|
+
Цифры = ?(Отр, Сред(ЦелЧасть, 2), ЦелЧасть) + Дробь;
|
|
401
|
+
Возврат ЗначДес(РазобратьЦелое(?(Отр, "-", "") + Цифры), СтрДлина(Дробь));
|
|
402
|
+
КонецФункции
|
|
403
|
+
|
|
404
|
+
Функция op_money(Лит, Вал) Экспорт
|
|
405
|
+
Д = op_dec(Лит);
|
|
406
|
+
Возврат ЗначДеньги(Д.Ц, Д.Масштаб, Вал);
|
|
407
|
+
КонецФункции
|
|
408
|
+
|
|
409
|
+
Функция op_date(Лит) Экспорт
|
|
410
|
+
Возврат Новый Структура("Вид, Зн", "date", Лит);
|
|
411
|
+
КонецФункции
|
|
412
|
+
|
|
413
|
+
Функция op_sym(Ид) Экспорт
|
|
414
|
+
Возврат Новый Структура("Вид, Ид", "sym", Ид);
|
|
415
|
+
КонецФункции
|
|
416
|
+
|
|
417
|
+
// §48/§58: сложение, вычитание, min/max требуют совпадения видов; у денег — и валюты.
|
|
418
|
+
Процедура Одинаковые(А, Б, Оп)
|
|
419
|
+
Если Не (ЧисловойВид(А) И ЧисловойВид(Б) И ЭтоДеньги(А) = ЭтоДеньги(Б)) Тогда
|
|
420
|
+
Отказ("§58: виды операндов не совпадают: " + Оп);
|
|
421
|
+
КонецЕсли;
|
|
422
|
+
Если ЭтоДеньги(А) Тогда
|
|
423
|
+
Если А.Вал <> Б.Вал Тогда
|
|
424
|
+
Отказ("§58: разные валюты: " + Оп);
|
|
425
|
+
КонецЕсли;
|
|
426
|
+
КонецЕсли;
|
|
427
|
+
КонецПроцедуры
|
|
428
|
+
|
|
429
|
+
Функция Пара(А, Б)
|
|
430
|
+
Если А.Масштаб = Б.Масштаб Тогда
|
|
431
|
+
Возврат Новый Структура("Х, У, Масштаб", А.Ц, Б.Ц, А.Масштаб);
|
|
432
|
+
КонецЕсли;
|
|
433
|
+
С = Большее(А.Масштаб, Б.Масштаб);
|
|
434
|
+
Возврат Новый Структура("Х, У, Масштаб",
|
|
435
|
+
ЦелУмножить(А.Ц, Степень10(С - А.Масштаб)), ЦелУмножить(Б.Ц, Степень10(С - Б.Масштаб)), С);
|
|
436
|
+
КонецФункции
|
|
437
|
+
|
|
438
|
+
Функция Сделать(Ц, Масштаб, Образец)
|
|
439
|
+
Если ЭтоДеньги(Образец) Тогда
|
|
440
|
+
Возврат ЗначДеньги(Ц, Масштаб, Образец.Вал);
|
|
441
|
+
КонецЕсли;
|
|
442
|
+
Возврат ЗначДес(Ц, Масштаб);
|
|
443
|
+
КонецФункции
|
|
444
|
+
|
|
445
|
+
// Целое значение: дробная часть нулевая (защита в глубину под статикой плана).
|
|
446
|
+
Функция Целочисленное(З)
|
|
447
|
+
Если ВидЗнач(З) <> "dec" Тогда
|
|
448
|
+
Возврат Ложь;
|
|
449
|
+
КонецЕсли;
|
|
450
|
+
Возврат ЦелНоль(ЦелДелить(З.Ц, Степень10(З.Масштаб)).О);
|
|
451
|
+
КонецФункции
|
|
452
|
+
|
|
453
|
+
Функция ВЦелое(З)
|
|
454
|
+
Возврат ЦелДелить(З.Ц, Степень10(З.Масштаб)).Ч;
|
|
455
|
+
КонецФункции
|
|
456
|
+
|
|
457
|
+
Функция op_add(А, Б) Экспорт
|
|
458
|
+
Одинаковые(А, Б, "add");
|
|
459
|
+
П = Пара(А, Б);
|
|
460
|
+
Возврат Сделать(ЦелСложить(П.Х, П.У), П.Масштаб, А);
|
|
461
|
+
КонецФункции
|
|
462
|
+
|
|
463
|
+
Функция op_sub(А, Б) Экспорт
|
|
464
|
+
Одинаковые(А, Б, "sub");
|
|
465
|
+
П = Пара(А, Б);
|
|
466
|
+
Возврат Сделать(ЦелВычесть(П.Х, П.У), П.Масштаб, А);
|
|
467
|
+
КонецФункции
|
|
468
|
+
|
|
469
|
+
// Правило скаляра §49: безразмерное масштабирует размерное; масштаб результата —
|
|
470
|
+
// сумма масштабов. Два размерных не перемножаются.
|
|
471
|
+
Функция op_mul(А, Б) Экспорт
|
|
472
|
+
Если Не (ЧисловойВид(А) И ЧисловойВид(Б)) Тогда
|
|
473
|
+
Отказ("§58: виды операндов не совпадают: mul");
|
|
474
|
+
КонецЕсли;
|
|
475
|
+
Если ЭтоДеньги(А) И ЭтоДеньги(Б) Тогда
|
|
476
|
+
Отказ("§58: произведение двух размерных величин не определено");
|
|
477
|
+
КонецЕсли;
|
|
478
|
+
Возврат Сделать(ЦелУмножить(А.Ц, Б.Ц), А.Масштаб + Б.Масштаб, ?(ЭтоДеньги(А), А, Б));
|
|
479
|
+
КонецФункции
|
|
480
|
+
|
|
481
|
+
// Точное десятичное частное Числ/Знам при 10-гладком знаменателе (§18), иначе
|
|
482
|
+
// Неопределено; иначе структура {Ц, Масштаб}.
|
|
483
|
+
Функция Точное(Знач Числ, Знач Знам)
|
|
484
|
+
Н = ЦелНОД(Числ, Знам);
|
|
485
|
+
Если ЦелНоль(Н) Тогда
|
|
486
|
+
Н = ИзМалого(1);
|
|
487
|
+
КонецЕсли;
|
|
488
|
+
Числ = ЦелДелить(Числ, Н).Ч;
|
|
489
|
+
Знам = ЦелДелить(Знам, Н).Ч;
|
|
490
|
+
Если Знам.Отр Тогда
|
|
491
|
+
Числ = ЦелПротивоположное(Числ);
|
|
492
|
+
Знам = ЦелПротивоположное(Знам);
|
|
493
|
+
КонецЕсли;
|
|
494
|
+
Двоек = 0;
|
|
495
|
+
Пятёрок = 0;
|
|
496
|
+
Пока Истина Цикл
|
|
497
|
+
ЧО = ЦелДелить(Знам, ИзМалого(2));
|
|
498
|
+
Если Не ЦелНоль(ЧО.О) Тогда
|
|
499
|
+
Прервать;
|
|
500
|
+
КонецЕсли;
|
|
501
|
+
Знам = ЧО.Ч;
|
|
502
|
+
Двоек = Двоек + 1;
|
|
503
|
+
КонецЦикла;
|
|
504
|
+
Пока Истина Цикл
|
|
505
|
+
ЧО = ЦелДелить(Знам, ИзМалого(5));
|
|
506
|
+
Если Не ЦелНоль(ЧО.О) Тогда
|
|
507
|
+
Прервать;
|
|
508
|
+
КонецЕсли;
|
|
509
|
+
Знам = ЧО.Ч;
|
|
510
|
+
Пятёрок = Пятёрок + 1;
|
|
511
|
+
КонецЦикла;
|
|
512
|
+
Если ЦелСравнить(Знам, ИзМалого(1)) <> 0 Тогда
|
|
513
|
+
Возврат Неопределено;
|
|
514
|
+
КонецЕсли;
|
|
515
|
+
К = Большее(Двоек, Пятёрок);
|
|
516
|
+
Множ = ИзМалого(1);
|
|
517
|
+
Для Шаг = 1 По К - Двоек Цикл
|
|
518
|
+
Множ = ЦелУмножить(Множ, ИзМалого(2));
|
|
519
|
+
КонецЦикла;
|
|
520
|
+
Для Шаг = 1 По К - Пятёрок Цикл
|
|
521
|
+
Множ = ЦелУмножить(Множ, ИзМалого(5));
|
|
522
|
+
КонецЦикла;
|
|
523
|
+
Возврат Новый Структура("Ц, Масштаб", ЦелУмножить(Числ, Множ), К);
|
|
524
|
+
КонецФункции
|
|
525
|
+
|
|
526
|
+
// Таблица делимых §58 в срезе: Decimal/Decimal, Money/Decimal, Money/Money одной
|
|
527
|
+
// валюты. Integer/Integer даёт Rational — вне среза, отвергается планом статически.
|
|
528
|
+
Функция op_div(А, Б) Экспорт
|
|
529
|
+
Если Не (ЧисловойВид(А) И ЧисловойВид(Б)) Тогда
|
|
530
|
+
Отказ("§58: деление вне таблицы делимых");
|
|
531
|
+
КонецЕсли;
|
|
532
|
+
Если ЦелНоль(Б.Ц) Тогда
|
|
533
|
+
Отказ("деление на ноль — evaluation error (§58)");
|
|
534
|
+
КонецЕсли;
|
|
535
|
+
Образец = Неопределено;
|
|
536
|
+
Если ЭтоДеньги(А) И ЭтоДеньги(Б) Тогда
|
|
537
|
+
Если А.Вал <> Б.Вал Тогда
|
|
538
|
+
Отказ("CURRENCY_MISMATCH: §58 делит Money на Money только при тождественной валюте");
|
|
539
|
+
КонецЕсли;
|
|
540
|
+
ИначеЕсли ЭтоДеньги(А) Тогда
|
|
541
|
+
Образец = А;
|
|
542
|
+
ИначеЕсли ЭтоДеньги(Б) Тогда
|
|
543
|
+
Отказ("§58: деление вне таблицы делимых");
|
|
544
|
+
КонецЕсли;
|
|
545
|
+
Ч = Точное(ЦелУмножить(А.Ц, Степень10(Б.Масштаб)), ЦелУмножить(Б.Ц, Степень10(А.Масштаб)));
|
|
546
|
+
Если Ч = Неопределено Тогда
|
|
547
|
+
Если Образец <> Неопределено Тогда
|
|
548
|
+
Отказ("INEXACT_DIVISION: округление только явной политикой (§50/§18)");
|
|
549
|
+
КонецЕсли;
|
|
550
|
+
Отказ("§58: частное не 10-гладкое — Rational вне среза");
|
|
551
|
+
КонецЕсли;
|
|
552
|
+
Если Образец = Неопределено Тогда
|
|
553
|
+
Возврат ЗначДес(Ч.Ц, Ч.Масштаб);
|
|
554
|
+
КонецЕсли;
|
|
555
|
+
Возврат ЗначДеньги(Ч.Ц, Ч.Масштаб, Образец.Вал);
|
|
556
|
+
КонецФункции
|
|
557
|
+
|
|
558
|
+
// Евклидов остаток §58: 0 <= r < |b| при любых знаках операндов. Оператор `%`
|
|
559
|
+
// Числа усекает к нулю (-7 % 3 = -1) и здесь не годится.
|
|
560
|
+
Функция op_mod(А, Б) Экспорт
|
|
561
|
+
Если Не (Целочисленное(А) И Целочисленное(Б)) Тогда
|
|
562
|
+
Отказ("§58: mod определён только для Integer");
|
|
563
|
+
КонецЕсли;
|
|
564
|
+
У = ВЦелое(Б);
|
|
565
|
+
Если ЦелНоль(У) Тогда
|
|
566
|
+
Отказ("остаток от деления на ноль — evaluation error (§58)");
|
|
567
|
+
КонецЕсли;
|
|
568
|
+
Модуль = ЦелМодуль(У);
|
|
569
|
+
Остаток = ЦелДелить(ВЦелое(А), Модуль).О;
|
|
570
|
+
Если Остаток.Отр Тогда
|
|
571
|
+
Остаток = ЦелСложить(Остаток, Модуль);
|
|
572
|
+
КонецЕсли;
|
|
573
|
+
Возврат ЗначДес(Остаток, 0);
|
|
574
|
+
КонецФункции
|
|
575
|
+
|
|
576
|
+
Функция op_min(А, Б) Экспорт
|
|
577
|
+
Одинаковые(А, Б, "min");
|
|
578
|
+
П = Пара(А, Б);
|
|
579
|
+
Возврат ?(ЦелСравнить(П.Х, П.У) <= 0, А, Б);
|
|
580
|
+
КонецФункции
|
|
581
|
+
|
|
582
|
+
Функция op_max(А, Б) Экспорт
|
|
583
|
+
Одинаковые(А, Б, "max");
|
|
584
|
+
П = Пара(А, Б);
|
|
585
|
+
Возврат ?(ЦелСравнить(П.Х, П.У) >= 0, А, Б);
|
|
586
|
+
КонецФункции
|
|
587
|
+
|
|
588
|
+
Функция op_abs(З) Экспорт
|
|
589
|
+
Если Не ЧисловойВид(З) Тогда
|
|
590
|
+
Отказ("§58: abs — не числовой вид");
|
|
591
|
+
КонецЕсли;
|
|
592
|
+
Возврат Сделать(ЦелМодуль(З.Ц), З.Масштаб, З);
|
|
593
|
+
КонецФункции
|
|
594
|
+
|
|
595
|
+
// §58 (E-0075): только Integer pow Integer; порядок проверок — знак, предел,
|
|
596
|
+
// вычисление, диапазон — часть контракта. Умножение останавливается, как только
|
|
597
|
+
// модуль превысил 2^63: при |основание| >= 1 он дальше не убывает, а при нулевом
|
|
598
|
+
// основании не растёт, — исход тот же, что у полного вычисления.
|
|
599
|
+
Функция op_pow(Осн, Пок) Экспорт
|
|
600
|
+
Если Не (Целочисленное(Осн) И Целочисленное(Пок)) Тогда
|
|
601
|
+
Отказ("§58: pow определён только для Integer");
|
|
602
|
+
КонецЕсли;
|
|
603
|
+
Е = ВЦелое(Пок);
|
|
604
|
+
Если Е.Отр Тогда
|
|
605
|
+
Отказ("§58: pow — показатель отрицателен");
|
|
606
|
+
КонецЕсли;
|
|
607
|
+
Если ЦелСравнить(Е, ИзМалого(4096)) > 0 Тогда
|
|
608
|
+
Отказ("RESOURCE_LIMIT: pow — показатель превышает 4096");
|
|
609
|
+
КонецЕсли;
|
|
610
|
+
Б = ВЦелое(Осн);
|
|
611
|
+
Р = ИзМалого(1);
|
|
612
|
+
Граница = ЦелМодуль(POW_MIN);
|
|
613
|
+
Для Шаг = 1 По ВМалое(Е) Цикл
|
|
614
|
+
Р = ЦелУмножить(Р, Б);
|
|
615
|
+
Если ЦелСравнить(ЦелМодуль(Р), Граница) > 0 Тогда
|
|
616
|
+
Прервать;
|
|
617
|
+
КонецЕсли;
|
|
618
|
+
КонецЦикла;
|
|
619
|
+
Если ЦелСравнить(Р, POW_MIN) < 0 Или ЦелСравнить(Р, POW_MAX) > 0 Тогда
|
|
620
|
+
Отказ("RESOURCE_LIMIT: pow — результат вне 64-битного диапазона");
|
|
621
|
+
КонецЕсли;
|
|
622
|
+
Возврат ЗначДес(Р, 0);
|
|
623
|
+
КонецФункции
|
|
624
|
+
|
|
625
|
+
Функция op_round(З, Разрядов, Режим) Экспорт
|
|
626
|
+
Если Режим <> "HALF_UP" Тогда
|
|
627
|
+
Отказ("§50: режим округления не реализован: " + Режим);
|
|
628
|
+
КонецЕсли;
|
|
629
|
+
Если Не ЧисловойВид(З) Тогда
|
|
630
|
+
Отказ("§50: round — не числовой вид");
|
|
631
|
+
КонецЕсли;
|
|
632
|
+
Если ТипЗнч(Разрядов) = ТипЧисло Тогда
|
|
633
|
+
Н = Разрядов;
|
|
634
|
+
Иначе
|
|
635
|
+
Н = ВМалое(ВЦелое(Разрядов));
|
|
636
|
+
КонецЕсли;
|
|
637
|
+
Если З.Масштаб <= Н Тогда
|
|
638
|
+
Возврат Сделать(ЦелУмножить(З.Ц, Степень10(Н - З.Масштаб)), Н, З);
|
|
639
|
+
КонецЕсли;
|
|
640
|
+
Сброс = Степень10(З.Масштаб - Н);
|
|
641
|
+
ЧО = ЦелДелить(ЦелМодуль(З.Ц), Сброс);
|
|
642
|
+
Вверх = ЧО.Ч;
|
|
643
|
+
Если ЦелСравнить(ЦелСложить(ЧО.О, ЧО.О), Сброс) >= 0 Тогда
|
|
644
|
+
Вверх = ЦелСложить(Вверх, ИзМалого(1)); // HALF_UP — от нуля
|
|
645
|
+
КонецЕсли;
|
|
646
|
+
Если З.Ц.Отр Тогда
|
|
647
|
+
Вверх = ЦелПротивоположное(Вверх);
|
|
648
|
+
КонецЕсли;
|
|
649
|
+
Возврат Сделать(Вверх, Н, З);
|
|
650
|
+
КонецФункции
|
|
651
|
+
|
|
652
|
+
// Порядок строк по кодам символов. Встроенное `<` над Строкой не обещает
|
|
653
|
+
// порядкового сравнения у обоих исполнителей; окна §31 сравниваются этим.
|
|
654
|
+
Функция ПорядокТекста(А, Б) Экспорт
|
|
655
|
+
ДА = СтрДлина(А);
|
|
656
|
+
ДБ = СтрДлина(Б);
|
|
657
|
+
Для Поз = 1 По ?(ДА < ДБ, ДА, ДБ) Цикл
|
|
658
|
+
КА = КодСимвола(А, Поз);
|
|
659
|
+
КБ = КодСимвола(Б, Поз);
|
|
660
|
+
Если КА <> КБ Тогда
|
|
661
|
+
Возврат ?(КА < КБ, -1, 1);
|
|
662
|
+
КонецЕсли;
|
|
663
|
+
КонецЦикла;
|
|
664
|
+
Возврат ?(ДА < ДБ, -1, ?(ДА > ДБ, 1, 0));
|
|
665
|
+
КонецФункции
|
|
666
|
+
|
|
667
|
+
// Булево по результату сравнения либо Неопределено для незнакомой операции.
|
|
668
|
+
Функция ПоПорядку(С, Оп)
|
|
669
|
+
Если Оп = "lt" Тогда
|
|
670
|
+
Возврат С < 0;
|
|
671
|
+
ИначеЕсли Оп = "le" Тогда
|
|
672
|
+
Возврат С <= 0;
|
|
673
|
+
ИначеЕсли Оп = "gt" Тогда
|
|
674
|
+
Возврат С > 0;
|
|
675
|
+
ИначеЕсли Оп = "ge" Тогда
|
|
676
|
+
Возврат С >= 0;
|
|
677
|
+
ИначеЕсли Оп = "eq" Тогда
|
|
678
|
+
Возврат С = 0;
|
|
679
|
+
ИначеЕсли Оп = "ne" Тогда
|
|
680
|
+
Возврат С <> 0;
|
|
681
|
+
КонецЕсли;
|
|
682
|
+
Возврат Неопределено;
|
|
683
|
+
КонецФункции
|
|
684
|
+
|
|
685
|
+
Функция РавныеСимволы(А, Б)
|
|
686
|
+
Если ВидЗнач(А) <> "sym" Или ВидЗнач(Б) <> "sym" Тогда
|
|
687
|
+
Возврат Ложь;
|
|
688
|
+
КонецЕсли;
|
|
689
|
+
Возврат А.Ид = Б.Ид;
|
|
690
|
+
КонецФункции
|
|
691
|
+
|
|
692
|
+
Функция РавныеДаты(А, Б)
|
|
693
|
+
Если ВидЗнач(А) <> "date" Или ВидЗнач(Б) <> "date" Тогда
|
|
694
|
+
Возврат Ложь;
|
|
695
|
+
КонецЕсли;
|
|
696
|
+
Возврат А.Зн = Б.Зн;
|
|
697
|
+
КонецФункции
|
|
698
|
+
|
|
699
|
+
// Строки сравниваются только строками: `=` у Строки и Структуры — Ложь, но
|
|
700
|
+
// явная проверка вида не зависит от того, как исполнитель сравнивает типы.
|
|
701
|
+
Функция РавныеТексты(А, Б)
|
|
702
|
+
Если ВидЗнач(А) <> "text" Или ВидЗнач(Б) <> "text" Тогда
|
|
703
|
+
Возврат Ложь;
|
|
704
|
+
КонецЕсли;
|
|
705
|
+
Возврат А = Б;
|
|
706
|
+
КонецФункции
|
|
707
|
+
|
|
708
|
+
Функция op_cmp(А, Оп, Б) Экспорт
|
|
709
|
+
// Быстрый путь соединений правил: две сущности или два текста.
|
|
710
|
+
Если ТипЗнч(А) = ТипСтрока И ТипЗнч(Б) = ТипСтрока Тогда
|
|
711
|
+
Если Оп = "eq" Тогда
|
|
712
|
+
Возврат А = Б;
|
|
713
|
+
ИначеЕсли Оп = "ne" Тогда
|
|
714
|
+
Возврат А <> Б;
|
|
715
|
+
КонецЕсли;
|
|
716
|
+
Отказ("порядок на Text вне среза рантайма: " + Оп);
|
|
717
|
+
КонецЕсли;
|
|
718
|
+
ВА = ВидЗнач(А);
|
|
719
|
+
ВБ = ВидЗнач(Б);
|
|
720
|
+
Если ВА = "sym" Или ВБ = "sym" Тогда
|
|
721
|
+
Тот = РавныеСимволы(А, Б);
|
|
722
|
+
Если Оп = "eq" Тогда
|
|
723
|
+
Возврат Тот;
|
|
724
|
+
ИначеЕсли Оп = "ne" Тогда
|
|
725
|
+
Возврат Не Тот;
|
|
726
|
+
КонецЕсли;
|
|
727
|
+
Отказ("§57: вид enum не упорядочен");
|
|
728
|
+
КонецЕсли;
|
|
729
|
+
Если ВА = "date" Или ВБ = "date" Тогда
|
|
730
|
+
Если ВА = "date" И ВБ = "date" Тогда
|
|
731
|
+
Р = ПоПорядку(ПорядокТекста(А.Зн, Б.Зн), Оп);
|
|
732
|
+
Если Р = Неопределено Тогда
|
|
733
|
+
Отказ("сравнение вне среза рантайма: " + Оп);
|
|
734
|
+
КонецЕсли;
|
|
735
|
+
Возврат Р;
|
|
736
|
+
КонецЕсли;
|
|
737
|
+
Если Оп = "eq" Тогда
|
|
738
|
+
Возврат Ложь;
|
|
739
|
+
ИначеЕсли Оп = "ne" Тогда
|
|
740
|
+
Возврат Истина;
|
|
741
|
+
КонецЕсли;
|
|
742
|
+
Отказ("§57: Date сравнивается только с Date");
|
|
743
|
+
КонецЕсли;
|
|
744
|
+
Если ВА = "text" Или ВБ = "text" Тогда
|
|
745
|
+
Тот = РавныеТексты(А, Б);
|
|
746
|
+
Если Оп = "eq" Тогда
|
|
747
|
+
Возврат Тот;
|
|
748
|
+
ИначеЕсли Оп = "ne" Тогда
|
|
749
|
+
Возврат Не Тот;
|
|
750
|
+
КонецЕсли;
|
|
751
|
+
Отказ("порядок на Text вне среза рантайма: " + Оп);
|
|
752
|
+
КонецЕсли;
|
|
753
|
+
Если ЭтоДеньги(А) <> ЭтоДеньги(Б) Тогда
|
|
754
|
+
Отказ("§49: сравнение денег с безразмерным");
|
|
755
|
+
КонецЕсли;
|
|
756
|
+
Если ЭтоДеньги(А) Тогда
|
|
757
|
+
Если А.Вал <> Б.Вал Тогда
|
|
758
|
+
Отказ("§49: разные валюты");
|
|
759
|
+
КонецЕсли;
|
|
760
|
+
КонецЕсли;
|
|
761
|
+
П = Пара(А, Б);
|
|
762
|
+
Р = ПоПорядку(ЦелСравнить(П.Х, П.У), Оп);
|
|
763
|
+
Если Р = Неопределено Тогда
|
|
764
|
+
Отказ("сравнение вне среза рантайма: " + Оп);
|
|
765
|
+
КонецЕсли;
|
|
766
|
+
Возврат Р;
|
|
767
|
+
КонецФункции
|
|
768
|
+
|
|
769
|
+
Функция op_eq(А, Б) Экспорт
|
|
770
|
+
Если ТипЗнч(А) = ТипСтрока И ТипЗнч(Б) = ТипСтрока Тогда
|
|
771
|
+
Возврат А = Б;
|
|
772
|
+
КонецЕсли;
|
|
773
|
+
ВА = ВидЗнач(А);
|
|
774
|
+
ВБ = ВидЗнач(Б);
|
|
775
|
+
Если ВА = "sym" Или ВБ = "sym" Тогда
|
|
776
|
+
Возврат РавныеСимволы(А, Б);
|
|
777
|
+
ИначеЕсли ВА = "date" Или ВБ = "date" Тогда
|
|
778
|
+
Возврат РавныеДаты(А, Б);
|
|
779
|
+
ИначеЕсли ВА = "text" Или ВБ = "text" Тогда
|
|
780
|
+
Возврат РавныеТексты(А, Б);
|
|
781
|
+
ИначеЕсли ЭтоДеньги(А) <> ЭтоДеньги(Б) Тогда
|
|
782
|
+
Возврат Ложь;
|
|
783
|
+
ИначеЕсли ЭтоДеньги(А) Тогда
|
|
784
|
+
Если А.Вал <> Б.Вал Тогда
|
|
785
|
+
Возврат Ложь;
|
|
786
|
+
КонецЕсли;
|
|
787
|
+
КонецЕсли;
|
|
788
|
+
П = Пара(А, Б);
|
|
789
|
+
Возврат ЦелСравнить(П.Х, П.У) = 0;
|
|
790
|
+
КонецФункции
|
|
791
|
+
|
|
792
|
+
// Запись без хвостовых нулей дробной части: отбрасываются цифры записи, а не
|
|
793
|
+
// делится длинное целое, — ноль любого масштаба даёт «0e-0».
|
|
794
|
+
Функция Норм(З)
|
|
795
|
+
Цифры = ЗаписьЦелого(З.Ц);
|
|
796
|
+
Масштаб = З.Масштаб;
|
|
797
|
+
Если ЦелНоль(З.Ц) Тогда
|
|
798
|
+
Масштаб = 0;
|
|
799
|
+
КонецЕсли;
|
|
800
|
+
Пока Масштаб > 0 Цикл
|
|
801
|
+
Если Прав(Цифры, 1) <> "0" Тогда
|
|
802
|
+
Прервать;
|
|
803
|
+
КонецЕсли;
|
|
804
|
+
Цифры = Лев(Цифры, СтрДлина(Цифры) - 1);
|
|
805
|
+
Масштаб = Масштаб - 1;
|
|
806
|
+
КонецЦикла;
|
|
807
|
+
Возврат Цифры + "e-" + Формат(Масштаб, "ЧГ=0; ЧН=0");
|
|
808
|
+
КонецФункции
|
|
809
|
+
|
|
810
|
+
// Разделитель и экран внутри текста экранируются: иначе ["a|e:b","c"] и
|
|
811
|
+
// ["a","b|e:c"] склеивались в один ключ, и второй факт терялся.
|
|
812
|
+
Функция Экран(Т)
|
|
813
|
+
Возврат СтрЗаменить(СтрЗаменить(Т, "\", "\\"), "|", "\|");
|
|
814
|
+
КонецФункции
|
|
815
|
+
|
|
816
|
+
Функция op_key(Ряд) Экспорт
|
|
817
|
+
Ключ = "";
|
|
818
|
+
Для Инд = 0 По Ряд.Количество() - 1 Цикл
|
|
819
|
+
З = Ряд[Инд];
|
|
820
|
+
В = ВидЗнач(З);
|
|
821
|
+
Если В = "text" Тогда
|
|
822
|
+
Часть = "e:" + Экран(З);
|
|
823
|
+
ИначеЕсли В = "date" Тогда
|
|
824
|
+
Часть = "t:" + З.Зн;
|
|
825
|
+
ИначеЕсли В = "sym" Тогда
|
|
826
|
+
Часть = "c:" + Экран(З.Ид);
|
|
827
|
+
ИначеЕсли В = "money" Тогда
|
|
828
|
+
Часть = "m:" + З.Вал + ":" + Норм(З);
|
|
829
|
+
Иначе
|
|
830
|
+
Часть = "d:" + Норм(З);
|
|
831
|
+
КонецЕсли;
|
|
832
|
+
Ключ = ?(Инд = 0, Часть, Ключ + "|" + Часть);
|
|
833
|
+
КонецЦикла;
|
|
834
|
+
Возврат Ключ;
|
|
835
|
+
КонецФункции
|
|
836
|
+
|
|
837
|
+
Процедура op_setLegalTime(Т) Экспорт
|
|
838
|
+
ВремяПрава = Т;
|
|
839
|
+
КонецПроцедуры
|
|
840
|
+
|
|
841
|
+
Функция op_legalTime() Экспорт
|
|
842
|
+
Если ВремяПрава = "" Тогда
|
|
843
|
+
Отказ("legalTime не подан делом");
|
|
844
|
+
КонецЕсли;
|
|
845
|
+
Возврат ВремяПрава;
|
|
846
|
+
КонецФункции
|
|
847
|
+
|
|
848
|
+
БАЗА = 10000000;
|
|
849
|
+
ТипСтрока = Тип("Строка");
|
|
850
|
+
ТипСтруктура = Тип("Структура");
|
|
851
|
+
ТипЧисло = Тип("Число");
|
|
852
|
+
Степени = Новый Массив;
|
|
853
|
+
Степени.Добавить(Целое(Ложь, ИзМалого(1).Разр));
|
|
854
|
+
ПРЕФИКС_ОТКАЗА = "law-refused|";
|
|
855
|
+
ВремяПрава = "";
|
|
856
|
+
POW_MIN = РазобратьЦелое("-9223372036854775808");
|
|
857
|
+
POW_MAX = РазобратьЦелое("9223372036854775807");
|
|
858
|
+
Десять = ИзМалого(10);
|