Глава 34. Прочие механизмы
страницаГлава 34. Прочие механизмы
34.1. Решение систем линейных алгебраических уравнений
34.1.1. Общая информация
Системой линейных алгебраических уравнений (возможно использование сокращения СЛАУ) называется такая система уравнений, каждое уравнение в которой является алгебраическим уравнением первой степени (линейным уравнением). Коэффициенты при переменных, свободные члены и неизвестные считаются вещественными числами. В частности, СЛАУ используются в различных экономических задачах, таких, как расчет себестоимости выпускаемой продукции.
ПРИМЕЧАНИЕ. Описание методов решений СЛАУ и их особенностей выходит за рамки данной документации. Описание различных методов решения СЛАУ следует искать в соответствующих учебных материалах.
Механизм решения СЛАУ, используемый в системе программ «1С:Предприятие», использует два алгоритма: итерационный и прямого решения. При выборе конкретного механизма применяется ряд оптимизаций, разработанных фирмой «1С».
Рассмотрим применение реализованного механизма на примере простой СЛАУ:
(1) X1 + X2 = 5 (2) 2X1 + 3X2 = 13
Цифры в скобках определяют порядковый номер уравнения.
Для решения этой системы будет использоваться объект РасчетСистемыЛинейныхУравнений. В качестве входных данных используется две таблицы:
1. Таблица, содержащая значения свободных коэффициентов СЛАУ.
2. Таблица, содержащая значения коэффициентов при переменных СЛАУ.
Эти таблицы могут быть получены как «вручную», через заполнение таблицы значений, так на основе запроса к базе данных. В текущем примере данные будут подготовлены в таблицах значений. Нумерация уравнений идет сверху вниз, а переменных в системе ‑ слева направо.
Подготовим таблицу свободных коэффициентов:
ДанныеУзлов = Новый ТаблицаЗначений; ДанныеУзлов.Колонки.Добавить("НомерУравнения"); ДанныеУзлов.Колонки.Добавить("СвобКоэффициент"); Строка = ДанныеУзлов.Добавить(); Строка.НомерУравнения = 1; Строка.СвобКоэффициент = 5; Строка = ДанныеУзлов.Добавить(); Строка.НомерУравнения = 2; Строка.СвобКоэффициент = 13;
Подготовим таблицу коэффициентов при переменных:
ДанныеСвязей = Новый ТаблицаЗначений; ДанныеСвязей.Колонки.Добавить("НомерУравнения"); ДанныеСвязей.Колонки.Добавить("НомерПеременной"); ДанныеСвязей.Колонки.Добавить("Коэффициент"); Строка = ДанныеСвязей.Добавить(); Строка.НомерУравнения = 1; Строка.НомерПеременной = 1; Строка.Коэффициент = 1; Строка = ДанныеСвязей.Добавить(); Строка.НомерУравнения = 1; Строка.НомерПеременной = 2; Строка.Коэффициент = 1; Строка = ДанныеСвязей.Добавить(); Строка.НомерУравнения = 2; Строка.НомерПеременной = 1; Строка.Коэффициент = 2; Строка = ДанныеСвязей.Добавить(); Строка.НомерУравнения = 2; Строка.НомерПеременной = 2; Строка.Коэффициент = 3;
Теперь необходимо передать сформированные таблицы с коэффициентами механизму расчета. Для этого необходимо заполнить свойства ИсточникДанныхУзлов (таблица свободных коэффициентов) и ИсточникДанныхСвязей (таблица коэффициентов):
Решатель.ИсточникДанныхУзлов = ДанныеУзлов; Решатель.ИсточникДанныхСвязей = ДанныеСвязей;
Теперь следует указать, в каких колонках находятся номера уравнений и коэффициентов в переданных источниках. Для таблицы свободных коэффициентов следует указать только колонку, где находятся номера уравнений (с помощью свойства КолонкаУравненияВУзлах), а для таблицы коэффициентов при переменных надо указать, где находятся и номера уравнений (свойство КолонкаУравненияВСвязях) и номера переменных (КолонкаПеременныеВСвязях):
Решатель.КолонкаУравненияВСвязях = "НомерУравнения"; Решатель.КолонкаПеременныеВСвязях = "НомерПеременной"; Решатель.КолонкаУравненияВУзлах = "НомерУравнения";
Последним шагом является создание описания решаемой системы уравнений. Для этого следует использовать свойство РасчетСистемыЛинейныхУравнений.ОписанияСистем. Для каждой добавляемой системы необходимо указать, какой столбец отвечает за свободные коэффициенты системы, а какой ‑ за коэффициенты при переменных решаемой системы:
ОписаниеСЛАУ = Решатель.ОписанияСистем.Добавить(); ОписаниеСЛАУ.КолонкаКоэффициентовВУзлах = "СвобКоэффициент"; ОписаниеСЛАУ.КолонкаКоэффициентовВСвязях = "Коэффициент";
Теперь все параметры заданы и можно решить заданную систему уравнений:
Результат = Решатель.РассчитатьСистемыЛинейныхУравнений();
В результате решения нашей СЛАУ получится таблица значений, состоящая из двух колонок:
● Колонка НомерУзла содержит номер переменной СЛАУ.
● Колонка Решение1 содержит значение решения для каждой переменной.
Для используемого примера решение будет следующим: X1 = 2, X2 = 3.
Итоговый текст примера:
Решатель = Новый РасчетСистемЛинейныхУравнений; ДанныеУзлов = Новый ТаблицаЗначений; ДанныеУзлов.Колонки.Добавить("НомерУравнения"); ДанныеУзлов.Колонки.Добавить("СвобКоэффициент"); Строка = ДанныеУзлов.Добавить(); Строка.НомерУравнения = 1; Строка.СвобКоэффициент = 5; Строка = ДанныеУзлов.Добавить(); Строка.НомерУравнения = 2; Строка.СвобКоэффициент = 13; ДанныеСвязей = Новый ТаблицаЗначений; ДанныеСвязей.Колонки.Добавить("НомерУравнения"); ДанныеСвязей.Колонки.Добавить("НомерПеременной"); ДанныеСвязей.Колонки.Добавить("Коэффициент"); Строка = ДанныеСвязей.Добавить(); Строка.НомерУравнения = 1; Строка.НомерПеременной = 1; Строка.Коэффициент = 1; Строка = ДанныеСвязей.Добавить(); Строка.НомерУравнения = 1; Строка.НомерПеременной = 2; Строка.Коэффициент = 1; Строка = ДанныеСвязей.Добавить(); Строка.НомерУравнения = 2; Строка.НомерПеременной = 1; Строка.Коэффициент = 2; Строка = ДанныеСвязей.Добавить(); Строка.НомерУравнения = 2; Строка.НомерПеременной = 2; Строка.Коэффициент = 3; Решатель.ИсточникДанныхУзлов = ДанныеУзлов; Решатель.ИсточникДанныхСвязей = ДанныеСвязей; ОписаниеСЛАУ = Решатель.ОписанияСистем.Добавить(); ОписаниеСЛАУ.КолонкаКоэффициентовВУзлах = "СвобКоэффициент"; ОписаниеСЛАУ.КолонкаКоэффициентовВСвязях = "Коэффициент"; Решатель.КолонкаУравненияВСвязях = "НомерУравнения"; Решатель.КолонкаПеременныеВСвязях = "НомерПеременной"; Решатель.КолонкаУравненияВУзлах = "НомерУравнения"; Результат = Решатель.РассчитатьСистемыЛинейныхУравнений();
Рассмотрим, как можно одновременно решать несколько СЛАУ.
Для одновременного решения нескольких СЛАУ надо выполнить предварительное действие ‑ привести системы к одинаковой размерности (как по числу переменных, так и по количеству уравнений). В простейшем случае это решается формированием недостающих уравнений или введением в уравнения переменных с нулевыми коэффициентами. Таким образом, перед решением нескольких систем, у нас должна быть единая нумерация, как самих уравнений, так и их переменных.
Затем необходимо правильно сформировать входные данные для механизма решения СЛАУ. Как уже было отмечено ранее, на вход системе решения поступает таблица, содержащая свободные коэффициенты (свойство РасчетСистемыЛинейныхУравнений.ИсточникДанныхУзлов) и таблица, содержащая коэффициенты при переменных системы (свойство РасчетСистемыЛинейныхУравнений.ИсточникДанныхСвязей). Для каждой дополнительной системы в каждый из источников данных добавляется новая колонка. Имена колонок, отвечающих за коэффициенты одной системы в каждом источнике, указываются с помощью свойства РасчетСистемыЛинейныхУравнений.ОписанияСистем.
Рассмотрим пример из двух СЛАУ:
(1) 2X1 + 3X2 = 10 4X1 + 15X2 = 40 (2) 3X1 + 2X2 = 15 5X1 + 3X2 = 10
Имеется две системы из двух уравнений, в каждой из которых по две переменные. Для указания свободных коэффициентов должна быть сформирована следующая таблица:
|
НомерУравнения |
СК1 |
СК2 |
|
1 |
10 |
40 |
|
2 |
15 |
10 |
В примере, приведенном выше, столбец таблицы значений для указания свободных коэффициентов назывался СвобКоэффициент. Однако теперь систем больше одной и нельзя указать две колонки в таблице значений с одинаковым именем. Поэтом колонки будут называться СК1 и СК2.
Аналогичным образом будет выглядеть таблица для коэффициентов при переменных СЛАУ:
|
НомерУравнения |
НомерПеременной |
К1 |
К2 |
|
1 |
1 |
2 |
4 |
|
1 |
2 |
3 |
15 |
|
2 |
1 |
3 |
5 |
|
2 |
2 |
2 |
3 |
Теперь вместо имени Коэффициент колонки будут называться по «номерам» СЛАУ: К1 (для первой СЛАУ) и К2 (для второй СЛАУ).
Указание системы на имена колонок, которые содержат номера уравнений и переменных не изменилось:
Решатель.КолонкаУравненияВСвязях = "НомерУравнения"; Решатель.КолонкаПеременныеВСвязях = "НомерПеременной"; Решатель.КолонкаУравненияВУзлах = "НомерУравнения";
Но описание системы уравнений несколько изменится. Теперь вместо описания одной системы будет описание двух систем:
ОписаниеСЛАУ = Решатель.ОписанияСистем.Добавить(); ОписаниеСЛАУ.КолонкаКоэффициентовВУзлах = "СК1"; ОписаниеСЛАУ.КолонкаКоэффициентовВСвязях = "К1"; ОписаниеСЛАУ = Решатель.ОписанияСистем.Добавить(); ОписаниеСЛАУ.КолонкаКоэффициентовВУзлах = "СК2"; ОписаниеСЛАУ.КолонкаКоэффициентовВСвязях = "К2";
Если подходить к вопросу формально, то каждую СЛАУ определяют имена колонок свободных коэффициентов и коэффициентов при переменных в таблицах, переданных на вход механизму решения СЛАУ. Поэтому при решении нескольких систем, которые отличаются только свободными коэффициентами, нет необходимости для каждой системы повторять коэффициенты при переменных. В таком случае будет достаточно создать колонки только для уникальных параметров ‑ свободных коэффициентов. Исходя из формального описания СЛАУ (с точки зрения механизма решения), в рассмотренном примере можно задать еще две СЛАУ, если скомбинировать коэффициенты при переменных и свободные коэффициенты из разных систем. Очевидно, что делать такую комбинацию имеет смысл только в том случае, если это имеет прикладной смысл.
В результате решения двух СЛАУ получится таблица значений, состоящая из двух колонок:
● Колонка НомерУзла содержит номер переменной СЛАУ.
● Колонка Решение1 содержит значение решения для каждой переменной из первой системы.
● Колонка Решение2 содержит значение решения для каждой переменной из второй системы.
Также стоит отметить, в каком случае рекомендуется решать несколько СЛАУ одним вызовом, а когда ‑ разными вызовами. Если несколько СЛАУ имеют одинаковую размерность и очевидную зависимость по коэффициентам, то рекомендуется решать несколько СЛАУ одним вызовом. Например, если решается три системы с вариантами прогноза: пессимистический, реалистический, оптимистический. Если системы СЛАУ не имеют очевидной связи (просто две разные системы), то лучше каждую систему решать обособленно. Такое различие объясняется тем, что платформа анализирует переданные системы, заранее предполагая их схожесть. На основании проведенного анализа выполняются некоторые внутренние оптимизации. Если системы не имеют связи ‑ могут быть приняты неверные решения.
Дополнительно рассмотрим некоторые параметры объекта РасчетСистемыЛинейныхУравнений:
● Свойство ТребуемаяТочность ‑ максимальная погрешность искомого решения. Вычисляется как разница между левой и правой частью каждого уравнения решаемой системы при подстановке текущего решения. Задание чрезмерной точности приведет к существенному увеличению времени решения. Для получения в результате точного i-го знака после запятой, рекомендуется устанавливать точность в виде значения 10-(i+1). Таким образом, для получения точного 5 знака следует установить для свойства ТребуемаяТочность значение 10-6.
Рекомендуется при изменении желаемой точности решения сначала изменять свойство ТребуемаяТочность. Если результата не достигается, значит причиной может служить недостаточное количество итераций, используемых для нахождения решения. В этом случае можно увеличить значение свойства КоличествоИтераций.
● Свойство КоличествоИтераций определяет количество итераций, которые будет использовать итерационный алгоритм решения СЛАУ. Данная настройка вторична по отношению к свойству ТребуемаяТочность. Рекомендуется подбирать минимально возможное значение для получения в результате требуемой точности решения (свойство ТребуемаяТочность). Увеличение значения свойства выше требуемого не имеет смысла, т. к. алгоритм прекратит выполнение расчета после достижения требуемой точности.
● Свойство ИспользованиеВычислительныхРесурсов позволяет указать, сколько вычислительных потоков будут принимать участие в решении СЛАУ. Значение по умолчанию обеспечивает максимальное использование доступных вычислительных мощностей. Значение данного свойства не должно превышать количества доступных ядер процессора (включая ядра, доступные в результате использования технологии hyper-threading). Рекомендуется изменять данное свойство только в том случае, если требуется уменьшить количество вычислительных потоков механизма решения относительно значения по умолчанию.
Если все ресурсы процессора выделять на решение СЛАУ нет возможности, но и выделение для решения только одного вычислительного потока является недостаточным, то рекомендуется в качестве значения свойства ИспользованиеВычислительныхРесурсов установить число, равное числу решаемых одновременно систем (тогда каждая система будет рассчитываться независимо), либо кратное ему (тогда каждую систему будет решать количество потоков, равное значению краткости). При этом полученное значение не должно превышать общее количество ядер процессора.
Как было сказано в начале раздела, механизм решения СЛАУ использует комбинацию двух алгоритмов: итерационного и прямого. Каждый из этих алгоритмов обладает своими плюсами и минусами:
● Итерационный алгоритм:
● Скорость работы зависит от требуемой точности решения. Это является одновременно и плюсом и минусом данного алгоритма. Плюсом это является в том смысле, что позволяет ограничиться требуемой точностью, а не находить решение с избыточной точностью (для данной предметной областью). Минусом это является в том смысле, что неоправданное повышение точности решения может либо фатально сказаться на времени решения, либо вовсе не позволит это решение получить.
● Плюсы алгоритма:
● На крупных матрицах работает быстрее (асимптотика O(n2)).
● Минусы алгоритма:
● Для получения большой точности может потребоваться значительное число итераций (как следствие, время расчета увеличивается).
● Есть теоретические ограничения по сходимости алгоритма.
● Прямой алгоритм:
● Плюсы алгоритма:
● Гарантированно точное решение (ограничивается точностью математических расчетов процессора компьютера).
● На небольших матрицах работает быстрее.
● Минусы алгоритма:
● На крупных матрицах работает существенно медленнее (асимптотика O(n3)).
Свойство РасчетСистемЛинейныхУравнения.ГраницаИзмененияАлгоритма определяет, какому алгоритму будет отдан приоритет после выполнения предварительного анализа СЛАУ, которые переданы для решения одним вызовом. Чем меньше значение ‑ тем более вероятно использование итерационного алгоритма, чем больше значение ‑ тем выше вероятность использования собственного алгоритма. Следует понимать, что смещая приоритет в сторону того или иного алгоритма, усиливаются не только положительные, но и отрицательные стороны того алгоритма, в сторону которого смещается выбор. Значение по умолчанию обеспечивает разумный баланс работы механизма, и изменять его следует только при очень хорошем понимании общей схемы работы и последствий принимаемого решения.
Если при решении (любым алгоритмом) системы уравнений (или ее части) точное решение не удается получить с заданной точностью (в свойстве ТребуемаяТочность) за указанное (в свойстве КоличествоИтераций) количество итераций, то возвращается то решение, которое удалось найти за заданное количество итераций. Нужно понимать, что полученное в таком случае решение может не соответствовать требуемому критерию точности.
34.1.2. Компоненты связности графа
Если решаемая задача может быть смоделирована с помощью графа, то может возникнуть необходимость декомпозировать получившийся граф. Целью декомпозиции является повышение скорости получения решения. Это можно сделать, оперируя понятием «компоненты связности графа». Платформа позволяет выделять следующие компоненты связности (это понятие представлено перечислением СпособПолученияКомпонентСвязностиРасчетаСистемЛинейныхУравнений):
● КомпонентыСлабойСвязности. Под компонентами слабой связности понимаются максимальные по включению компоненты графа (подграфы), такие, что из любой вершины компоненты (подграфа) существует путь в любую другую вершину этой компоненты (подграфа). Ориентация ребер графа игнорируется (ориентированные ребра рассматриваются как неориентированные).
● КомпонентыСильнойСвязности. Под компонентами сильной связности понимаются максимальные по включению компоненты графа (подграфы), такие, что из любой вершины компоненты (подграфа) существует путь в любую другую вершину этой компоненты (подграфа). Путь строится с учетом ориентации ребер.
● КомпонентыСильнойСвязностиБезТребованияСвязиВнутриКомпонент. Под этим термином понимаются такие компоненты связности, что для любых двух вершин A и B из двух любых разных компонент гарантируется, что одновременно не существует пути из A в B и из B в A. При этом для любых двух вершин A и B из одной компоненты каких-либо гарантий наличия путей не дается. В данном варианте система выполняет расчет компонент связности, наиболее оптимальных для анализа и отладки механизма решения систем линейных уравнений.
Рассмотрим примеры выделения компонент различной связности. Дана система уравнений:
(0) X0 + 5X1 = 1 (1) 6X0 + 2X1 + X2 = 1 (2) 3X2 = 1 (3) 4*X3 = 1
Эту систему можно представить следующим графом:

Рис. 624. Начальный граф
Если получить компоненты слабой связности для данного графа, то будет выделено две компоненты:
● Компонента 1: {0, 1, 2}.
● Компонента 2: {3}.
Или, в графическом виде:

Рис. 625. Компоненты слабой связности
Если получить компоненты сильной связности для данного графа, то будет выделено три компоненты:
● Компонента 1: {0,1}.
● Компонента 2: {3}.
● Компонента 3: {2}.
Или, в графическом виде:

Рис. 626. Компоненты сильной связности
Выделение компонент сильной и слабой связности не зависит от того, в каком порядке задаются уравнения и коэффициенты при переменных. Выделение компоненты сильной связности без требования связи внутри компонент зависит от того, в каком порядке на вход механизму решения СЛАУ поступают определения уравнений и переменных. Так, если уравнения и коэффициенты задаются в естественном порядке (сверху вниз, слева направо), то будет выделено три компоненты (аналогично выделению компонент сильной связности):
● Компонента 1: {0, 1}.
● Компонента 2: {2}.
● Компонента 3: {3}.
Графически это изображено на рис. 626.
Однако если вынести формирование параметров уравнения (2) в начало, то выделение компоненты сильной связности без требования связи внутри компонент завершится выделением двух компонент (аналогично выделению компонент слабой связности):
● Компонента 1: {0, 1, 2}.
● Компонента 2: {3}.
Графически это изображено на рис. 625.
На встроенном языке вышеперечисленное будет выглядеть следующим образом:
Решатель = Новый РасчетСистемЛинейныхУравнений; ДанныеУзлов = Новый ТаблицаЗначений; ДанныеУзлов.Колонки.Добавить("НомерУравнения"); ДанныеУзлов.Колонки.Добавить("СвобКоэффициент"); Строка = ДанныеУзлов.Добавить(); Строка.НомерУравнения = 0; Строка.СвобКоэффициент = 1; Строка = ДанныеУзлов.Добавить(); Строка.НомерУравнения = 1; Строка.СвобКоэффициент = 1; Строка = ДанныеУзлов.Добавить(); Строка.НомерУравнения = 2; Строка.СвобКоэффициент = 1; Строка = ДанныеУзлов.Добавить(); Строка.НомерУравнения = 3; Строка.СвобКоэффициент = 1; ДанныеСвязей = Новый ТаблицаЗначений; ДанныеСвязей.Колонки.Добавить("НомерУравнения"); ДанныеСвязей.Колонки.Добавить("НомерПеременной"); ДанныеСвязей.Колонки.Добавить("Коэффициент"); Строка = ДанныеСвязей.Добавить(); Строка.НомерУравнения = 0; Строка.НомерПеременной = 0; Строка.Коэффициент = 1; Строка = ДанныеСвязей.Добавить(); Строка.НомерУравнения = 0; Строка.НомерПеременной = 1; Строка.Коэффициент = 5; Строка = ДанныеСвязей.Добавить(); Строка.НомерУравнения = 1; Строка.НомерПеременной = 0; Строка.Коэффициент = 6; Строка = ДанныеСвязей.Добавить(); Строка.НомерУравнения = 1; Строка.НомерПеременной = 1; Строка.Коэффициент = 2; Строка = ДанныеСвязей.Добавить(); Строка.НомерУравнения = 1; Строка.НомерПеременной = 2; Строка.Коэффициент = 1; Строка = ДанныеСвязей.Добавить(); Строка.НомерУравнения = 2; Строка.НомерПеременной = 2; Строка.Коэффициент = 3; Строка = ДанныеСвязей.Добавить(); Строка.НомерУравнения = 3; Строка.НомерПеременной = 3; Строка.Коэффициент = 4; Решатель.ИсточникДанныхСвязей = ДанныеСвязей; Решатель.КолонкаУравненияВСвязях = "НомерУравнения"; Решатель.КолонкаПеременныеВСвязях = "НомерПеременной"; ОписаниеСЛАУ = Решатель.ОписанияСистем.Добавить(); ОписаниеСЛАУ.КолонкаКоэффициентовВСвязях = "Коэффициент"; СлабаяСвязность = Решатель.ПолучитьКомпонентыСвязности(СпособПолученияКомпонентСвязностиРасчетаСистемЛинейныхУравнений.КомпонентыСлабойСвязности); СильнаяСвязность = Решатель.ПолучитьКомпонентыСвязности(СпособПолученияКомпонентСвязностиРасчетаСистемЛинейныхУравнений.КомпонентыСильнойСвязности); СильнаяСвязностьБезТребования = Решатель.ПолучитьКомпонентыСвязности(СпособПолученияКомпонентСвязностиРасчетаСистемЛинейныхУравнений.КомпонентыСильнойСвязностиБезТребованияСвязиВнутриКомпонент);
В результате работы данного примера в переменных будут следующие значения:
● СлабаяСвязность ‑ таблица значений, которая содержит компоненты слабой связности.
● СильнаяСвязность ‑ таблица значений, которая содержит компоненты сильной связности.
● СильнаяСвязностьБезТребования ‑ таблица значений, которая содержит компоненты сильной связности без требования связи внутри компонент. Данный вариант выделит компоненты аналогично компонентам сильной связности.
Если пример модифицировать, а именно:
● строки:
Строка = ДанныеУзлов.Добавить(); Строка.НомерУравнения = 2; Строка.СвобКоэффициент = 1;
переставить сразу после строки:
ДанныеУзлов.Колонки.Добавить("СвобКоэффициент");
● строки:
Строка = ДанныеСвязей.Добавить(); Строка.НомерУравнения = 2; Строка.НомерПеременной = 2; Строка.Коэффициент = 3;
переставить сразу после строки:
ДанныеСвязей.Колонки.Добавить("Коэффициент");
то после выполнения примера, таблица СильнаяСвязностьБезТребования будет содержать компоненты, аналогичные компонентам слабой связности.
34.1.3. Рекомендации по использованию механизма поиска компонент связности
Рекомендуются следующие сценарии использования механизма поиска компонент связности.
Использование поиска компонент слабой связности
Простейший алгоритм, разделяющий систему линейных уравнений на абсолютно несвязанные части. Каждая из этих частей может быть:
● Изменена без влияния на решения других частей СЛАУ.
● Решена независимо от других частей СЛАУ.
● Подвергнута каким-либо дополнительным обработкам без влияния на решения других частей СЛАУ.
Не рекомендуется производить отдельный независимый расчет частей СЛАУ, если эти части невелики (например, эффективнее решить 100 частей системы по 10 уравнений совместно, чем отдельно).
Поиск компонент слабой связности также рекомендуется использовать, если необходимо провести итеративное решение СЛАУ: решить, какую-то часть СЛАУ, подвергнуть дополнительным обработкам исходную систему, решить измененную систему. В этом случае рекомендуется поступать следующим образом:
● Выделить компоненты слабой связности.
● Найти те компоненты, в которых лежит изменяемая часть СЛАУ (эти компоненты будут называться «изменяемыми»). Оставшиеся компоненты будут называться «неизменными». Затем необходимо выполнить следующие действия:
● Решить независимо изменяемые и неизменные компоненты.
● Внести требуемые изменения в изменяемые компоненты.
● Повторно решить измененные компоненты.
● Объединить решение неизменных компонент и результирующее решение изменяемых компонент для получения общего решения исходной СЛАУ.
Использование поиска компонент сильной связности
Рекомендуется использовать механизм, когда использование механизма нахождения компонент слабой связности не принес ожидаемого результата: было выделено слишком мало компонент слабой связности (или вообще выделена одна компонента).
Компоненты сильной связности ‑ более «плотные» подграфы исходного графа.
Рекомендуется попробовать построить компоненты сильной связности, в ручном или автоматическом режиме проанализировать, какие в исходном графе существуют связи между выделенными компонентами сильной связности, и попытаться их убрать одним из путей:
● Редактирование исходных данных.
● Изменение модели, по которой была сформирована данная СЛАУ.
● Временное удаление этих ребер по сценарию:
● Временно удаляются ребра, связывающие компоненты сильной связности.
● Рассчитываются компоненты слабой связности. Если между двумя компонентами сильной связности были удалены все ребра, их связывающие, то при дальнейшем построении компонент слабой связности эти самые компоненты и сформируют слабые. Т. е. если удалить все пути между сильными компонентами ‑ то в дальнейшем сильные и слабые компоненты будут выглядеть одинаково.
● Производится необходимый расчет по одному из сценариев, указанных в «Использование поиска компонент слабой связности».
● Временно удаленные ребра возвращаются в исходный граф.
● Производится дополнительная обработка по релаксации решения СЛАУ. Релаксация необходима, т. к. временно удаленные ребра могут изменить (и, наверняка, изменят) итоговое решение СЛАУ. Для более эффективной и простой релаксации рекомендуется также проверить устойчивость решений частей СЛАУ, выделенных с помощью поиска компонент слабой связности.
Использование поиска компонент из расчета СЛАУ
Данный механизм, в первую очередь, предназначен для эффективной отладки и более глубокого понимая работы механизма расчета систем линейных уравнений. Его рекомендуется использовать в случаях ручного анализа систем линейных уравнений. Компоненты, которые строит данный механизм (для любой вершины компоненты не существует пути в любую вершину любой другой компоненты), зависят от порядка нумерации вершин, но позволяют итеративно анализировать систему уравнений, начиная с компоненты с номером 0 и двигаясь далее по компонентам, т. к. компонента с номером 0 гарантированно не связана с последующими компонентами ориентированным ребром.
Данный способ рекомендуется использовать для следующих ситуаций:
1. Система линейных уравнений очень большая, но хочется понять основные связи ‑ какие вершины оказывают наибольшее влияние на другие вершины. Для этого необходимо итеративно идти по компонентам связности, анализируя, какие вершины входят в уравнения с наибольшими коэффициентами. По результатам этого анализа можно проводить анализ на устойчивость решения: несильно меняя коэффициенты при ключевых вершинах, смотреть, насколько сильно изменится итоговое решение СЛАУ.
2. Ручная проверка результатов расчета: анализ ситуаций, в которых возникло переполнение значений в решении СЛАУ, либо же в решении вершина отсутствует (к такому результату приводит, например, указание не всех коэффициентов СЛАУ или некорректное указание коэффициентов СЛАУ).
34.2. Интеграция с системой «1С:Аналитика»
34.2.1. Общая информация
Система аналитики ‑ это отдельно поставляемая компонента платформы «1С:Предприятие», предоставляющий возможности по визуализации и интерактивному анализу данных, находящихся в информационной базе системы «1С:Предприятие». Система «1С:Предприятие» реализует «видимые» и «невидимые» (для пользователю) части, которые необходимы для того, чтобы пользователи могли использовать систему аналитики. К «видимым» частям можно отнести стандартную функцию, которая позволит настроить взаимодействие системы аналитики и платформы «1С:Предприятие», а также пункт меню клиентского приложения, с помощью которого можно открыть интерфейс системы «1С:Аналитика». Еще одной «видимой» частью можно назвать флажок настройки публикации информационной базы на веб-сервере. Под «невидимой» частью понимается программный интерфейс, с помощью которого «1С:Предприятие» взаимодействует с системой аналитики. Весь обмен данными выполняется по этому программному интерфейсу.
Для того чтобы пользователь получил возможность пользоваться системой аналитики, необходимо выполнить следующие действия:
● Опубликовать информационную базу системы «1С:Предприятие» на веб-сервере (см. здесь). При публикации следует обязательно установить флажок Публиковать систему аналитики.
● С помощью стандартной функции системы «1С:Предприятие» указывается адрес сервера «1С:Аналитики» в требуемой информационной базе.
● Нужным пользователям предоставляется право доступа КлиентСистемыАналитики (см. здесь).
● Для пользователей, которым предоставлено такое право, в интерфейсе клиентского приложения становится доступной команда запуска клиентской части системы аналитики.
Вопросы установки и настройки собственно «1С:Аналитики» в данной документации не рассматриваются. Кроме специальной команды меню клиентского приложения, к системе аналитики можно получить доступ по адресу, который формируется следующим образом: http://host/base/ans. Более подробно рассмотрим составные части адреса:
● http://host/base ‑ обычный URL, который используется для доступа к информационной базе с помощью веб-клиента. При наличии разделителей, не поддерживается указание значений разделителей с помощью параметра Z командной строки запуска клиентского приложения.
● ans ‑ признак того, что выполняется обращение к клиенту системы аналитики.
Для доступа системы аналитики к данным информационой базы будет использоваться URL http://host/base/ans/data. Оба указанных URL будут доступны только после публикации информационной базы с включенным флажком Публиковать систему аналитики.
Аутентификация пользователя осуществляется системой «1С:Предприятие». Если пользователь использует URL системы аналитики (вида http://host/base/ans), то используется диалог аутентификации веб-клиента. В случае запуска системы аналитики из клиентского приложения, данные аутентификации передаются из клиентского приложения «1С:Предприятия».
34.2.2. Программный интерфейс
Для взаимодействия с системой аналитики из встроенного языка предназначено свойство глобального контекста СистемаАналитики. В документации, для упрощения, будет опускаться префикс метода СистемаАналитики.. В примерах и реальных приложениях, очевидно, такие пропуски недопустимы.
Для использования из встроенного языка доступны следующие возможности:
● Установить и получить адрес сервера системы «1С:Аналитика». Для этого предназначены методы УстановитьАдресСервераСистемыАналитики()/ПолучитьАдресСервераСистемыАналитики().
● Выполнить переход к объекту системы аналитики. Для этого предназначен метод Открыть().
34.3. Работа с региональными настройками
Региональные настройки ‑ это набор параметров, определяющий некоторые настройки пользовательского интерфейса, такие как язык, страна, часовой пояс, формат вывода даты, времени, представление логических значений и т. д. В системе «1С:Предприятие» региональные настройки могут задавать как для информационной базы в целом, так и для конкретного сеанса пользователя.
Региональные настройки информационной базы можно выполнить интерактивно (с помощью диалога в конфигураторе) и с помощью встроенного языка. Региональные настройки сеанса можно изменить только с помощью встроенного языка. В данном разделе будет более подробно рассмотрена работа с региональными настройками с помощью встроенного языка.
Региональные настройки в системе «1С:Предприятие» описываются объектом РегиональныеНастройкиИнформационнойБазы. Для того, чтобы получить региональные настройки информационной базы, следует использовать метод глобального контекста ПолучитьРегиональныеНастройкиИнформационнойБазы(). Для того, чтобы изменить текущие настройки информационной базы, следует использовать метод глобального контекста УстановитьРегиональныеНастройкиИнформационнойБазы(). Для изменения региональных настроек информационной базы пользователь, от имени которого выполняется метод, должен обладать правом Администрирование.
В общем, свойства объекта РегиональныеНастройкиИнформационнойБазы соответствуют полям диалога Региональные установки информационной базы. Рассмотрим эти свойства:
● КодЛокализации. Один из возможных кодов локализации. Допустимые коды локализации могут быть получены методом глобального контекста ПолучитьДопустимыеКодыЛокализации(). Установка кода локализации определяет значения по умолчанию для настроек формирования представления значений типа Число, Дата, Булево, если настройки не указаны явно.
● ИспользоватьНастройкиТекущегоСеанса. Если свойство установлено в значение Истина, то для формирования представления значений типа Число, Дата, Булево будут использоваться региональные настройки сеанса, в котором формируется представление. Если свойство установлено в значение Ложь, то для формирования представления будут использоваться значения, установленные в качестве настроек информационной базы. Эти значения могут быть получены с помощью метода ПолучитьРегиональныеНастройкиИнформационнойБазы().
● РазделительДробнойЧастиЧисел. Строка из одного символа, который должен использоваться для разделения целой и дробной части при получении представления данных типа Число. Если задана пустая строка, то будет использована настройка текущего сеанса.
● РазделительГруппЦифрЧисел. Строка из одного символа, который должен использоваться для разделения групп цифр при получении представления данных типа Число. Если задана пустая строка, то будет использована настройка текущего сеанса.
● ФорматГруппировкиЦифрЧисел. Последовательность символов, определяющая правила группировки цифр в представлении чисел. Описание форматной строки приводится в описании диалога Региональные установки информационной базы. Если задана пустая строка, то будет использована настройка текущего сеанса.
● ПредставлениеОтрицательныхЧисел. Устанавливает представление отрицательных чисел (в скобках приведены представления значений в диалоге Региональные установки информационной базы):
|
Значение свойства |
Представление и пример |
Описание поведения |
|
|
|
Использовать настройку текущего сеанса. |
|
|
|
Число в круглых скобках. |
|
|
|
Знак минус перед числом (без пробела). |
|
|
|
Знак минус перед числом. Минус отделен от числа пробелом. |
|
|
|
Знак минус после числа (без пробела). |
|
|
|
Знак минус после числа. Минус отделен от числа пробелом. |
● ПредставлениеБулевоЛожь. Устанавливает представление для значения Ложь. Если задана пустая строка, то будет использована настройка текущего сеанса.
● ПредставлениеБулевоИстина. Устанавливает представление для значения Истина. Если задана пустая строка, то будет использована настройка текущего сеанса.
● ФорматПредставленияДаты. Устанавливает формат отображения даты. Описание форматной строки приводится в описании диалога Региональные установки информационной базы. Если задана пустая строка, то будет использована настройка текущего сеанса.
● ФорматПредставленияВремени. Устанавливает формат представления времени. Описание форматной строки приводится в описании диалога Региональные установки информационной базы. Если задана пустая строка, то будет использована настройка текущего сеанса.
● ПервыйДеньНедели. Определяет день недели, который считается началом недели. Описание особенностей определения первого дня недели приводится в описании диалога Региональные установки информационной базы. Если в качестве значения данного свойства указано значение 0, то день начала недели определяется в соответствии с кодом локализации информационной базы.
Кроме свойств, описывающих способы формирования представления значений, объект РегиональныеНастройкиИнформационнойБазы позволяет получить представление значения того или иного типа, оформленного в соответствии с настройками, которые указаны в этом объекте:
● Представление(). Формирует представление произвольного значения.
● ПредставлениеВремени(). Формирует строку представления времени (без указания даты).
● ПредставлениеДаты(). Формирует строку представления даты (без указания времени).
● ПолучитьПервыйДеньНедели(). Возвращает номер первого дня недели.
Для того, чтобы получить региональные настройки текущего сеанса, следует использовать метод глобального контекста ПолучитьРегиональныеНастройкиСеанса(). Региональные настройки возвращаются в виде объекта РегиональныеНастройкиСеанса. Свойства этого объекта, в общем, повторяют свойства объекта РегиональныеНастройкиИнформационнойБазы, но учитывают языковые особенности текущего сеанса. В частности, объект РегиональныеНастройкиСеанса учитывает возможность изменения:
● Языка интерфейса, который может быть изменен с помощью команды /L командной строки запуска клиентского приложения. Язык интерфейса системы может включать в себя только значение из списка языков интерфейса системы «1С:Предприятие» (см. здесь). Код языка интерфейса доступен с помощью свойства РегиональныеНастройкиСеанса.КодЯзыкаИнтерфейса.
● Языка локализации, который может быть изменен с помощью команды /VL командной строки запуска клиентского приложения. Код языка локализации доступен с помощью свойства РегиональныеНастройкиСеанса.КодЛокализации.
Региональные установки сеанса формируются перед стартом сеанса и не могут быть изменены в процессе работы сеанса. Поэтому объект РегиональныеНастройкиСеанса доступен только для чтения.
Смотри также:
● Права доступа (см. здесь).
● Диалог Региональные установки информационной базы (см. здесь).
34.4. Активация программных лицензий
Платформа «1С:Предприятие» предоставляет программный интерфейс, с помощью которого можно реализовать диалог получения программных лицензий, который доступен в Конфигураторе с помощью команды меню Главное меню ‑ Сервис ‑ Получение лицензии. Этот программный интерфейс доступен через свойство глобального контекста ПолучениеЛицензий. Через это свойство доступен менеджер получения лицензий. Следовательно, обращение к методам программного интерфейса будут выглядеть следующим образом: ПолучениеЛицензий.ИмяВызываемогоМетода(). Для упрощения, в нижеследующем тексте имя свойства глобального контекста будет опускаться. В коде на встроенном языке, очевидно, такое упрощение не применимо.
В данном разделе подразумевается, что читатель знает, что такое система лицензирования «1С:Предприятие» и понимает, какие бывают виды лицензий и чем они между собой различаются.
Для активации программной лицензии необходимо выполнить следующие действия:
1. Получить параметры программной лицензии.
2. Получить данные владельца лицензии.
3. Определить, к какому физическому объекту будет привязана активируемая лицензия.
4. Сформировать запрос на получение лицензии.
5. Получить (активировать) лицензию.
Рассмотрим вышесказанное более подробно.
Программная лицензия бывает «обычной» и лицензией для разработчиков. Под термином «обычная» подразумеваются все виды программных лицензий, описание которых см. здесь (клиентские, серверные, ПРОФ, КОРП и т. д.). Так как обычная лицензия и лицензия для разработчиков имеют ряд различий по установочным данным, то в следующей таблице будут приведены эти различия:
|
|
Обычная |
Для разработчиков |
|
Параметры лицензии |
Параметры лицензии приведены в специальном формуляре, который идет в поставке программной лицензии. Из этого формуляра требуется номер комплекта и пинкод, который будет использоваться для активации. |
Параметрами лицензии являются имя пользователя и пароль доступа к подтвержденной учетной записи на портале разработчиков. |
|
Данные владельца лицензии |
Вводятся при активации лицензии и могут быть как данными организации, так и данными физического лица. |
Автоматически получаются с портала разработчиков, в объеме, который предоставляется порталом, и характеризуют только физическое лицо. |
|
Возможность привязки лицензии при активации |
Компьютер или аппаратный ключ защиты. |
Только компьютер. |
В таблице под термином «портал разработчиков» подразумевается один из двух веб-сайтов: https://developer.1c.ru или https://1c-dn.com. Правила выбора портала см. здесь.
Также стоит отметить, что активация лицензий для разработчиков поддерживается не везде. Для того, чтобы быть уверенным в том, что в данном месте и в данный момент времени возможна активация программной лицензии для разработчиков, следует использовать метод ПолучитьДоступностьИспользованияЛицензииРазработчика(). Активацию лицензии для разработчиков можно будет выполнить только в том случае, если этот метод вернул значение Истина. Также следует учитывать, что при реализации процесса активации лицензии для разработчиков из встроенного языка, перед активацией пользователь должен согласиться с лицензионным соглашением фирмы «1С». Получить это лицензионное соглашение можно с помощью метода ПолучитьЛицензионноеСоглашениеРазработчика(). Фактическая активация лицензии для разработчиков подразумевает, что пользователь ознакомился и согласился с текстом лицензии. Параметр метода ПорталРазработчиков косвенно определяет, на каком языке будет возвращаться лицензионное соглашение:
● developer.1c.ru ‑ текст на русском языке,
● 1c-dn.com ‑ текст на английском языке.
● Пустая строка ‑ язык текста лицензионного соглашения определяется согласно правилу, описание которого см. здесь.
Теперь рассмотрим собственно процесс активации лицензии из встроенного языка. Первым шагом необходимо использовать параметры владельца лицензии для выполнения запроса на получение лицензии. Запрос на получение лицензии использует объект ЗапросНаПолучениеЛицензии. Кратко рассмотрим его свойства:
● Заполнение свойств объекта зависит от того, активацию какой лицензии планируется выполнить:
● Лицензия для разработчиков: должны быть заполнены только свойства ИмяУчетнойЗаписи и ПарольУчетнойЗаписи. Остальные свойства не должны быть заполнены. Свойства ИмяУчетнойЗаписи и ПарольУчетнойЗаписи буду известны после того, как разработчик зарегистрируется на портале разработчиков. При активации лицензии для разработчиков рекомендуется указать некоторые специфические свойства:
● ПорталРазработчиков ‑ на каком портале разработчиков необходимо получать лицензию. Допустимые значения: пустая строка (значение по умолчанию), developer.1c.ru, 1c-dn.com. Значение не используется при активации лицензии, но используется в диалогах получения лицензии (в Конфигураторе и стандартной функции клиентского приложения) для отображения гиперссылки на портал разработчиков.
● При активации «обычных» лицензий должны быть заполнены все остальные свойства, кроме свойств ИмяУчетнойЗаписи и ПарольУчетнойЗаписи. К этим свойства относятся:
● РегистрационныйНомер ‑ регистрационный номер активируемой программной лицензии.
● Пинкод ‑ пинкод активируемой программной лицензии, который доступен для использования (на данный пинкод не выполнялась активация программной лицензии). Пинкод указывается без разделителей.
● СтарыйПинкод ‑ при повторном получении программной лицензии с использованием резервного пинкода (например, при изменении ключевых параметров привязки), в данное свойство необходимо указать пинкод, который использовался для активации обновляемой программной лицензии. Пинкод указывается без разделителей.
● Параметры, описывающие физическое или юридическое лицо, которое является владельцем активируемой программной лицензии.
● ДляВсехПользователей ‑ свойство указывает, куда будет размещаться файл с активированной лицензией: в каталог текущего пользователя или в каталог для всех пользователей.
● ИмяФайлаЛицензии ‑ имя файла, в который будет размещена информация активированной программной лицензии (и человекочитаемая информация) после успешного завершения процесса активации.
● ПараметрыПривязки ‑ указывает, к какому оборудованию будет привязываться программная лицензия при активации. Привязка может быть выполнена к параметрам компьютера (объект ПараметрыПривязкиККомпьютеруПолученияЛицензий) или к ключу аппаратной защиты HASP (объект ПараметрыПривязкиККлючуПолученияЛицензий).
Как было сказано ранее, лицензия для разработчиков может быть привязана только к параметрам компьютера.
● АдресАгента ‑ адрес агента сервера системы «1С:Предприятие». Указывается в том случае, когда активация программной лицензии выполняется не для текущего компьютера, а для компьютера, на котором развернут кластер серверов «1С:Предприятие».
● Порт ‑ номер IP-порта, который обслуживается агентом сервера «1С:Предприятие». Адрес агента сервера указывается в поле АдресАгента.
● ВремяЗапроса ‑ дата и время создания запроса на получение лицензии. Если не указано свойство ИмяФайлаЛицензии, то дата и время получения лицензии используются для формирования имени файла с активированной программной лицензией.
Созданный запрос на получении лицензии будет использоваться по назначению на следующих шагах, а для того, чтобы в дальнейшем не повторять ввод всего массива необходимой информации, запрос можно сохранить с помощью метода СохранитьЗапросНаПолучениеЛицензии(). Сохраненные данные могут быть повторно использованы как с помощью метода ЗагрузитьЗапросНаПолучениеЛицензии(), так и в диалоге получения лицензии Конфигуратора (данные будут загружены автоматически).
Для того, чтобы получить параметры оборудования, к которому может быть привязана программная лицензия, существует два метода:
● ПолучитьПараметрыПривязкиККомпьютеру(). Данный метод позволяет получить характеристики текущего компьютера или компьютера, на котором развернут кластер серверов (в этом случае параметры кластера передаются в качестве параметров метода). Метод вернет объект ПараметрыПривязкиККомпьютеруПолученияЛицензий, который содержит ключевые параметры оборудования. Список параметров оборудования зависит от того, какая операционная система используется на компьютере, для которого получаются параметры привязки.
Если получение параметров привязки выполняется для компьютера, на котором развернут кластер серверов, то должно выполняться условие точного равенства версий клиентского приложения и собственно кластера.
● ПолучитьДоступныеКлючи(). Данный метод возвращает массив объектов ПараметрыПривязкиККлючуПолученияЛицензий, который содержит список ключей HASP, которые доступны в момент вызова метода на текущем компьютере. Необходимо понимать, что доступность того или иного ключа защиты может меняться с течением времени. Поэтому рекомендуется использовать для привязки или локальные ключи того компьютера, на котором выполняется привязка или такие сетевые ключи защиты, которые гарантированно доступны в текущей локальной сети и на этом ключе всегда будет доступна минимум одна лицензия для проверки привязки.
Все необходимые данные собраны, теперь можно проверить, что лицензию можно активировать и записать файл с активированной лицензией в требуемом месте файловой системы. Для этого необходимо использовать метод ПолучитьДоступностьПолученияЛицензии(). В данном методе будут использоваться свойства АдресАгента, Порт и ДляВсехПользователей объекта ЗапросНаПолучениеЛицензии. Метод проверяет, что на компьютере с агентом сервера или текущем компьютере имеется возможность сохранить файл с лицензией в локальный каталог пользователя или в каталог всех пользователей. Если получение лицензии невозможно ‑ в объекте, описывающем результат проверки, будет передано ОписаниеОшибки, которое можно отобразить пользователю. Также возможна ситуация, когда в результате исполнения метода ПолучитьДоступностьПолученияЛицензии() значение свойства ДоступностьПолученияЛицензии.Доступно будет установлено в значение Истина, но свойство ДоступностьПолученияЛицензии.ОписаниеОшибки так же будет заполнено. Такая ситуация, например, возможна в том случае, когда в свойстве ЗапросНаПолучениеЛицензии.ИмяФайлаЛицензии указано некорректное имя файла.
Завершив все подготовительные мероприятия, можно активировать лицензию. Это можно сделать несколькими способами:
1. Самый простой способ ‑ автоматическое получение лицензии. Используется метод ПолучитьЛицензиюАвтоматически(). При успешном завершении активированная лицензия будет сохранена с именем, указанным в свойстве ЗапросНаПолучениеЛицензии.ИмяФайлаЛицензии.
2. Следующий способ ‑ это получение лицензии по телефону. Для этого используются несколько методов:
1. СоздатьЗапросНаПолучениеЛицензииПоТелефону(). В результате работы метода будет сформирована последовательность цифр, которые будет необходимо продиктовать по телефону в Центр лицензирования. Затем будет необходимо сообщить контрольную сумму сформированной последовательности для проверки того, что данные преданы в Центр лицензирования без потерь и искажений. Для формирования контрольной суммы сформированной последовательности следует использовать метод СформироватьКонтрольнуюСуммуСтрокиКодаПолученияЛицензии(). В ответ на переданную информацию, Центр лицензирования сообщит «свою» последовательность цифр.
2. ПолучитьЛицензиюПоТелефону(). В данный метод следует передать запрос на получение лицензии и ответ Центра лицензирования, полученный на предыдущем шаге.
3. Последний способ активации лицензии ‑ активация лицензии с использованием носителя. Активация лицензии этим способом похожа на активацию лицензии по телефону. Также используются два метода:
1. СоздатьЗапросНаПолучениеЛицензииПоНосителе(). В результате работы метода будет сформирована последовательность символов, которые будет необходимо передать в Центр лицензирования (по электронной почте или на каком-либо другом носителе информации). В ответ на это, Центр лицензирования сообщит «свою» последовательность цифр.
2. ПолучитьЛицензиюНаНосителе(). В данный метод следует передать запрос на получение лицензии и ответ Центра лицензирования, полученный на предыдущем шаге. Ответ Центра лицензирования надо прочитать из файла как одну строку. Это можно сделать, например, с помощью объекта ТекстовыйДокумент.
Теперь осталось рассмотреть только вспомогательные функции, которые могут пригодиться для реализации различных сервисных операций. Для получения различных параметров Центра лицензирования следует использовать следующие методы:
● АдресЦентраЛицензирования(). Метод возвращает URL сайта Центра лицензирования. Перейдя по полученному URL, можно выполнить получение лицензии на электронном носителе.
● АдресЭлектроннойПочтыЦентраЛицензирования(). Метод возвращает адрес электронной почты Центра лицензирования. С помощью полученного адреса возможно получение лицензии на электронном носителе.
● ПредставлениеЦентраЛицензирования(). Метод формирует текстовое представление используемого Центра лицензирования. Можно использовать для формирования заголовка диалога получения лицензий.
● НомерТелефонаЦентраЛицензирования(). Метод возвращает номер телефона, с помощью которого возможно получить лицензию по телефону.
● ПолучитьДоступностьЦентраЛицензирования(). Определяет определить, что сайт Центра лицензирования доступен с текущего компьютера.
При получении характеристик Центра лицензирования необходимо указать код страны, для которой необходимо получить характеристику. Для этих методов поддерживается следующее правило для указания параметра, описывающего страну:
● Пустая строка ‑ Центр лицензирования определяется в соответствии с кодом локализации информационной базы.
● kk, kk_KZ ‑ используется казахский Центр лицензирования.
● ru, ru_RU ‑ используется российский Центр лицензирования.
● uk, uk_UA ‑ используется украинский Центр лицензирования.
Если разработчик захочет реализовать свой диалог активации лицензий, то ему может потребоваться указывать страну, в которой расположен владелец активируемой лицензии. Эта страна потом будет указываться в свойстве ЗапросНаПолучениеЛицензии.Страна (в свойстве указывается двухбуквенный код страны). Чтобы коды стран в запросе на получение лицензии совпадали с кодами стран Центра лицензирования, следует использовать метод ПолучитьДопустимыеСтраны().
Таким образом, можно написать код на встроенном языке, который описывает автоматическое получение программной лицензии системы «1С:Предприятие». Следует заметить, что данный программный код является демонстрацией работы механизма, а не законченным инструментом.
Процедура АктивироватьЛицензиюНаСервере() ПараметрыПривязки = ПолучениеЛицензий.ПолучитьПараметрыПривязкиККомпьютеру(); ЗапросАктивации = Новый ЗапросНаПолучениеЛицензии; ЗапросАктивации.ДляВсехПользователей = Истина; ЗапросАктивации.ВремяЗапроса = ТекущаяДатаСеанса(); ЗапросАктивации.РегистрационныйНомер = "8123456789"; ЗапросАктивации.Пинкод = "123456789098765"; ЗапросАктивации.ПараметрыПривязки = ПараметрыПривязки; ЗапросАктивации.Предприятие = "Владелец лицензии"; ЗапросАктивации.Фамилия = "Фамилия"; ЗапросАктивации.Имя = "Имя"; ЗапросАктивации.Отчество = "Отчество"; ЗапросАктивации.АдресЭлектроннойПочты = "email@example.com"; ЗапросАктивации.Страна = "RU"; ЗапросАктивации.Город = "Москва"; ЗапросАктивации.Улица = "Красная площадь"; ЗапросАктивации.Дом = "1"; ЗапросАктивации.ИмяФайлаЛицензии = "Файл-лицензии-" + Формат(ЗапросАктивации.ВремяЗапроса, "ДФ=yyyyMMddHHmmss"); ДоступностьЦЛ = ПолучениеЛицензий.ПолучитьДоступностьЦентраЛицензирования(); Если ДоступностьЦЛ.Доступен Тогда ДоступностьПолучения = ПолучениеЛицензий.ПолучитьДоступностьПолученияЛицензии(ЗапросАктивации); Если ДоступностьПолучения.Доступно Тогда ПолучениеЛицензий.ПолучитьЛицензиюАвтоматически(ЗапросАктивации); Иначе ВызватьИсключение ДоступностьПолучения.ОписаниеОшибки; КонецЕсли; Иначе ВызватьИсключение ДоступностьЦЛ.ОписаниеОшибки; КонецЕсли; КонецПроцедуры
Смотри также:
● Виды лицензий (см. здесь).
● Система лицензирования «1С:Предприятия» (см. здесь).
● Программные лицензии (см. здесь).
● Ключевые параметры (см. здесь).
34.5. Уведомление клиентского приложения со стороны сервера
При разработке информационных систем может возникать необходимость оповещать клиентское приложение о том, что на стороне сервера завершено какое-то действие. Если действие не является явным вызовом серверного кода из кода клиентского приложения, то для такого оповещения можно использовать систему взаимодействия. Однако этот метод требует наличие подключения информационной базы к системе взаимодействия. Если из всех возможностей системы взаимодействия будет использоваться только оповещение клиентского приложения с сервера ‑ это может оказаться неудобно для разработчика.
Система «1С:Предприятие» предоставляет возможность оповещать клиентское приложение со стороны серверного кода без необходимости использования системы взаимодействия. Для этого в системе реализован менеджер уведомлений клиента, который доступен с помощью свойства глобального контекста УведомленияКлиента. Обращение к методам программного интерфейса будут выглядеть следующим образом: УведомленияКлиента.ИмяВызываемогоМетода(). Для упрощения, в нижеследующем тексте имя свойства глобального контекста будет опускаться. В коде на встроенном языке, очевидно, такое упрощение не применимо.
Общая логика использования уведомлений очень простая:
● Серверное приложение выполняет какие-либо фоновые задания, которые должны оповещать клиентскую часть прикладного решения о результатах своей работы.
● Для этого в фоновом задании должен использоваться метод ОтправитьУведомление().
● Клиентская часть должна подписаться на получение уведомлений с помощью метода ПодключитьОбработчик(). Если обработчик не подключен ‑ уведомления обработать невозможно.
● После того, как обрабатывать уведомления больше не нужно ‑ надо отключить обработчик уведомлений (один или все) с помощью метода ОтключитьОбработчик().
Для того, чтобы отправить уведомление клиентскому приложению, следует использовать метод ОтправитьУведомление() (который доступен на стороне сервера или толстого клиента). Метод имеет следующие параметры:
● Ключ ‑ значение типа Строка, которое позволит однозначно определить, какой обработчик уведомления будет вызван. Если при вызове метода в качестве параметра будет передано значение Неопределено, то такое уведомление будет обработано только теми обработчиками, которые регистрировались для ключа со значением Неопределено.
● Данные ‑ значение произвольного типа, которое позволяет передать на клиентское приложение какие-либо данные. Может быть передано любое значение, которое может быть передано на сторону клиента при завершении клиент-серверного вызова.
● Адресаты ‑ массив числовых значений. С помощью данного параметра можно отправить уведомление конкретным сеансам, номера которых и перечисляются в массиве. Например, можно отправить уведомление только сеансам конкретного пользователя. Номера сеансов-адресатов могут быть получены из свойства СеансИнформационнойБазы.НомерСеанса, а узнать, что это сеанс требуемого пользователя, можно с помощью свойства СеансИнформационнойБазы.Пользователь. Если необходимо получить номер сеанса, который стартовал фоновое задание, то это можно сделать с помощью свойства ФоновоеЗадание.НомерРодительскогоСеанса. Если клиентское приложение не запускало фоновое задание (например, фоновое задание порождено регламентным заданием), то данное свойство будет установлено в значение 0.
С точки зрения доставки уведомлений, необходимо различать описываемый сервис и механизмы системы взаимодействия. Система взаимодействия позволяет отправить сообщение пользователю (пользователям) информационной базы вне зависимости от того, работает сейчас пользователь с информационной базой или нет. Уведомления клиентского приложения отправляются сеансу (сеансам) информационной базы, который должен ожидать поступление уведомлений (подписаться на обработку уведомлений). Система будет пытаться доставить уведомления всем сеансам, о которых имеется информация на момент отправки уведомления. Во время отправки уведомление записывается в специальное хранилище, в котором и будет находиться до момента получения адресатом или до удаления. Успешное выполнение метода ОтправитьУведомление() означает, что уведомление сохранено в хранилище. Уведомление удаляется из хранилища после того, как система «1С:Предприятие» теряет информацию о том сеансе, для которого предназначено уведомление. Обслуживанием хранилища уведомлений (доставкой уведомлений и очисткой хранилища) занимается:
● В клиент-серверном варианте информационной базы ‑ специальный сервис кластера.
● В файловом варианте информационной базы с прямым доступом ‑ любое клиентское приложение, подключенное к этой информационной базе.
● В файловом варианте информационной базы с доступном через веб-сервер ‑ расширение веб-сервера, обслуживающее публикацию.
После отправки сообщения необходимо каким-то образом получить это сообщение на стороне клиента и обработать его. Для этого на стороне клиента необходимо подключить обработчик уведомления. Для этого используется метод ПодключитьОбработчик(), который имеет следующие параметры:
● Ключ ‑ значение типа Строка. Позволяет «подписаться» только на определенную категорию уведомлений. Где под понятием «категория» понимается уникальное значение параметра, например значение КурсыВалют будет означать все уведомления, связанные с курсами валют. Если значение данного параметра равно Неопределено, то данный обработчик будет вызываться для любых уведомлений.
● Обработчик ‑ содержит значение типа ОписаниеОповещения. Метод, имя которого используется при создании объекта, будет вызываться при получении уведомления.
Если в клиентском приложении больше не требуется обрабатывать ту или иную категорию уведомлений ‑ следует использовать метод ОтключитьОбработчик(). В качестве параметра передается значение ключа, которое использовалось при подключении обработчика. В этом случае будет отключен обработчик, «подписанный» на это значение ключа. Если в качестве параметра передано значение Неопределено, то будут отключены все обработчики в данном клиентском приложении. Обработчик также отключится, если будет закрыта форма, в модуле которой выполнялось подключение обработчика оповещения.
Использование уведомлений выглядит подобно следующему коду:
// подключение обработчика (модуль клиентского приложения) Процедура ПриНачалеРаботыСистемы() Обработчик = Новый ОписаниеОповещения("ОбработчикУведомления", МетодыОбработчиков); УведомленияКлиента.ПодключитьОбработчик(Неопределено, Обработчик); КонецПроцедуры // отключение всех обработчиков (модуль клиентского приложения) Процедура ПриЗавершенииРаботыСистемы() УведомленияКлиента.ОтключитьОбработчик(); КонецПроцедуры // метод обработчика (общий модуль МетодыОбработчиков) Процедура ОбработчикУведомления(Данные, ДополнительныеПараметры) Экспорт Сообщить("Данные = " + Данные); КонецПроцедуры // отправка уведомления (фоновое задание) Данные = Новый Соответствие; Данные.Вставить(РаботаСВалютами.ПолучитьВалютуПоКоду(КодВалюты), ЗначениеКурса); УведомленияКлиента.ОтправитьУведомление("КурсыВалют", Данные);
34.6. Пользователи, аутентификация и встроенный язык
34.6.1. Общая информация
Система «1С:Предприятие» может обеспечивать одновременную работу с данными прикладного решения произвольного количества пользователей. Каждый пользователь прикладного решения описывается некоторыми характеристиками (имя, пароль, доступные виды аутентификации и т. д.) и набором прав доступа, которые присущи этому пользователю. Управление пользователями может выполняться как интерактивно, с помощью инструментов конфигуратора (см. здесь), так и с помощью встроенного языка (будет рассмотрено в данном разделе).
Для работы непосредственно с пользователями информационной базы предназначен объект ПользовательИнформационнойБазы, а для работы со всеми пользователями (создание, получение текущего пользователя, выбор пользователей по определенным критериям) предназначен менеджер пользователей информационной базы. Для доступа к менеджеру служит свойство глобального контекста ПользователиИнформационнойБазы. Вызов какого-либо метода менеджера выглядит как ПользователиИнформационнойБазы.Метод().
Информационная база содержит некоторый набор параметров, которые определяют то, какими будут пароли пользователей и что будет происходить с этими паролями в различных ситуациях. Для этого в системе «1С:Предприятие» существует менеджер дополнительных настроек аутентификации. У менеджера есть некоторый набор свойств и методов, а также набор объектов, которые используются менеджером. Для обращения к свойствам и методам менеджера дополнительных настроек аутентификации служит свойство глобального контекста ДополнительныеНастройкиАутентификации. Это обращение выглядит как ДополнительныеНастройкиАутентификации.Свойство или ДополнительныеНастройкиАутентификации.Метод().
В документации, для упрощения, будут опускаться префиксы того или иного менеджера (ПользователиИнформационнойБазы илиДополнительныеНастройкиАутентификации). В примерах и реальных приложениях, очевидно, такие пропуски недопустимы.
34.6.2. Работа с пользователями
Платформа «1С:Предприятие» предоставляет возможность работы с пользователями из встроенного языка:
● Создавать нового пользователя.
● Получать пользователя, определенного именем или уникальным идентификатором.
● Получать список пользователей информационной базы.
Рассмотрим эти действия более подробно. При рассмотрении следует понимать, что разные операции требуют разных прав доступа. Документация не будет явным образом указывать требуемые права для каждой операции. Синтакс-помощник содержит необходимую информацию.
Для создания пользователя следует использовать метод СоздатьПользователя() менеджера пользователей информационной базы. Метод вернет объект типа ПользовательИнформационнойБазы, который не содержит никаких данных. Затем параметры пользователя необходимо заполнить и записать объект в информационной базу.
ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя(); ПользовательИБ.Имя = "Пользователь"; ПользовательИБ.ПолноеИмя = "Пользователь, который создан из встроенного языка"; ПользовательИБ.АутентификацияСтандартная = Истина; ПользовательИБ.ЗапрещеноИзменятьПароль = Ложь; ПользовательИБ.ПоказыватьВСпискеВыбора = Ложь; ПользовательИБ.Записать();
В результате в информационной базе будет создан пользователь с именем Пользователь, включенной аутентификацией «1С:Предприятие» и отсутствующим набором ролей. Если требуется указать роли, доступные пользователю, то следует использовать свойство Роли объекта ПользовательИнформационнойБазы. Значением данного свойства является коллекция РолиПользователя, в которую можно добавлять нужные роли и удалять роли, которые пользователю больше не требуются.
Примечание. Если метод Записать() выполнился при активной транзакции, то после завершения транзакции, получение пользователя методами НайтиПоИмени(), НайтиПоУникальномуИдентификатору(), ПолучитьПользователей() объекта МенеджерПользователейИнформационнойБазы во всех сеансах этой информационной базы будет возвращать записанное состояние пользователя. Но результат выполнения метода ТекущийПользователь() во всех сеансах, включая текущий, будет возвращать состояние пользователя на момент старта соответствующего сеанса.
Возможность пользователя выполнить то или иной способ аутентификации определяется набором свойств Аутентификация… самого пользователя, а доступность того или иного клиентского приложения определяется набором прав доступа этого пользователя (и определяется правами доступа пользователя). Виды аутентификации более подробно см. здесь.
Свойство КлючиСопоставленияПользователя необходимы для того, чтобы для разных провайдеров аутентификации OpenID Connect или токеном доступа, указать ключевые значения, по которым будет сопоставляться пользователь информационной базы системы «1С:Предприятие» и пользователь провайдера (или токена доступа). Значение из этого свойства будет использовано в том случае, если при настройке аутентификации OpenID Connect в файле default.vrd для параметра провайдера authenticationUserPropertyName указано значение matchingKey.
Свойство КлючТребованияНазначения позволит группировать пользователей с целью назначения соединений пользователей на конкретные рабочие сервера. Для этого в кластере серверов следует использовать механизм требований назначения функциональности, который и даст возможность выполнять такое назначение (см. здесь).
Свойство ПарольНеСоответствуетТребованиям устанавливается в том случае, если для пользователя, в процессе аутентификации, установлено, что пароль пользователя не соответствует политике паролей пользователя или информационной базы. Когда выполняется смена пароля пользователя ‑ данное свойство устанавливается в значение Ложь. Свойство недоступно для записи, т. к. оно является производным значением от пароля пользователя и политики паролей.
Свойство РазделениеДанных предназначено для использования в том случае, если в информационной базе используется механизм разделения данных. Подробнее про значение свойства см. здесь.
При необходимости получить описание пользователя, можно использовать следующие методы:
● ТекущийПользователь() ‑ возвращает описание пользователя, от имени которого работает текущий сеанс. Это «мы сами».
● НайтиПоИмени() ‑ возвращает пользователя, имя которого указано параметром метода. Если имя пользователя не указано, то возвращается «пользователь по умолчанию».
● НайтиПоУникальномуИдентификатору() ‑ возвращает пользователя, уникальный идентификатор которого указано параметром метода (ПользовательИнформационнойБазы.УникальныйИдентификатор).
Для того, чтобы получить описание всех пользователей информационной базы (или области данных), следует использовать метод ПолучитьПользователей(), который вернет массив объектов типа ПользовательИнформационнойБазы, которые доступны текущему пользователю с текущими правами доступа. При необходимости выбрать только тех пользователей, которые соответствуют какому-либо критерию, это необходимо выполнить самостоятельно: вначале получить список всех пользователей, а затем, с помощью встроенного языка, выбрать необходимых.
34.6.3. Сохранение аутентификации
При необходимости выполнить настройку механизма сохранения аутентификации из встроенного языка, можно воспользоваться менеджером дополнительных настроек аутентификации, который предоставляет методы ПолучитьНастройкиАвтоматическогоСохраненияАутентификации() и УстановитьНастройкиАвтоматическогоСохраненияАутентификации(). Эти методы работают с объектом типа НастройкиАвтоматическогоСохраненияАутентификации.
Данный объект предоставляет следующий набор свойств:
|
Свойство |
Описание |
|
|
Данное свойство описывает, какое долго будет валиден токен, в котором сохранены параметры аутентификации. Тип:
|
|
|
Разрешает/запрещает
возможность сохранять успешную аутентификацию для текущей информационной базы
(флажок Тип:
|
|
|
Определяет
значение по умолчанию для флажка Тип:
|
Таким образом, для того, чтобы включить возможность сохранения успешной аутентификации для информационной базы, следует использовать код следующего вида:
НастройкиАвтоматическогоСохраненияАутентификации = ДополнительныеНастройкиАутентификации.ПолучитьНастройкиАвтоматическогоСохраненияАутентификации); НастройкиАвтоматическогоСохраненияАутентификации.РазрешитьСохранение = Истина; НастройкиАвтоматическогоСохраненияАутентификации.СохранятьПоУмолчанию = Истина; НастройкиАвтоматическогоСохраненияАутентификации = 56000; ДополнительныеНастройкиАутентификации.УстановитьНастройкиАвтоматическогоСохраненияАутентификации(НастройкиАвтоматическогоСохраненияАутентификации);
Смотри также:
● Параметры информационной базы ({HL:adm:TI000000136:}).
34.6.4. Политика паролей
34.6.4.1. Общая информация
Описание политики паролей и требований, которые входят в политику, см. здесь.
Если необходимо назначать разным пользователям разные политики (наборы требований), то необходимо использовать программные средства работы с политиками. В основе этой работы лежит объект ПолитикаПаролейПользователей, который содержит свойства, которые полностью повторяют свойства диалога редактирования параметров информационной базы. Дополнительно к этим свойствам, объект ПолитикаПаролейПользователей обладает свойством Имя, которое позволяет указать уникальное имя конкретной политики. Кроме того, данный объект позволяет использовать методы Записать() и Удалить() для выполнения одноименных операций.
Для доступа к механизму работы с политиками предназначено свойство глобального контекста ПолитикиПаролейПользователей. Через данное свойство доступен менеджер политики паролей пользователей. С помощью менеджера можно работать с набором политик паролей текущей информационной базы, а также проверять пароль на соответствие той или иной политике. Соответственно, для вызова метода менеджера следует использовать конструкцию вида ПолитикиПаролейПользователей.Метод(). Рассмотрим подробнее возможности менеджера:
● ПолучитьПолитики(). Данный метод возвращает массив объектов типа ПолитикаПаролейПользователей, который содержит список сохраненных политик.
● НайтиПоИмени(). Данный метод позволяет найти политику паролей пользователей с указанным именем. Напомним, что каждая политика обладает уникальным именем.
● СоздатьПолитику(). Метод создает новый объект типа ПолитикаПаролейПользователей.
● ПроверитьСоответствиеПароляПолитике(). Метод позволяет проверить, насколько пароль, указанный в качестве параметра метода, соответствует политике паролей.
Рассмотрим работу метода ПроверитьСоответствиеПароляПолитике(). Данный метод получает в качестве обязательного параметра (с именем Пароль) проверяемый пароль. Если других параметров не указано, то пароль проверяется на соответствие политике паролей, установленной для информационной базы в целом. Если наряду с паролем указан и параметр Политика, то пароль будет проверяться на соответствие политике паролей, указанной в параметре. Если будет указан еще и параметр ПользовательИнформационнойБазы, то метод проверит ограничение на повторное использование паролей по истории паролей указанного пользователя, если проверка на повторное использование паролей включена в политике паролей, по которой выполняется проверка (информационной базы или указанной в параметре Политика).
В качестве результата проверки возвращается массив системных перечислений РезультатПроверкиСоответствияПароляПолитике. Если массив пустой, значит пароль соответствует предъявляемым требованиям. В общем случае, несоответствие пароля политике может быть обусловлено более чем одной причиной. Поэтому результат метода представляет собой массив, в котором перечислены все причины несоответствия пароля политике. Системное перечисление состоит из следующих значений:
|
Значение |
Описание |
|
|
Длина
пароля меньше установленной минимальной длины паролей пользователей (параметр
|
|
|
Пароль
совпадает с одним из последних установленных паролей этого
пользователя. Количество проверяемых паролей указывается в настройках
политики (параметр |
|
|
Пароль
был обнаружен в черном списке паролей или найден в сервисе проверки
паролей (параметр |
|
|
Пароль
не проходит проверку сложности пароля (параметр |
В том случае, если необходимо для конкретного пользователя указать политику паролей, отличную от политики информационной базы, следует выполнить следующие действия:
● Создать новую политику паролей с нужным набором настроек. Сохранить политику в информационной базе.
● Найти нужного пользователя (по имени или уникальному идентификатору).
● Установить имя созданной политики паролей в свойство ИмяПолитикиПаролей объекта ПользовательИнформационнойБазы.
● Сохранить пользователя в информационной базе.
Если политику паролей необходимо установить нескольким пользователям ‑ вышеописанный алгоритм следует выполнить для каждого пользователя.
34.6.4.2. Установка даты изменения пароля
Касаясь объекта, описывающего пользователя информационной базы, можно отметить несколько свойств, имеющих отношение к политике паролей пользователя. К таким свойствам можно отнести следующие:
● ДатаУстановкиПароля. Для пользователя, обладающего правом Администрирование, данное свойство позволяет узнать дату и время изменения пароля. В противном случае данное свойство содержит пустую дату.
● ЗаписываемаяДатаУстановкиПароля. Данное свойство позволяет явным образом указать дату и время изменения пароля пользователя.
Рассмотрим, как выполняется установка значения для свойства ДатаУстановкиПароля:
● Свойство ЗаписываемаяДатаУстановкиПароля изменено:
● Запись выполняется от имени пользователя с правом Администрирование:
● свойство ДатаУстановкиПароля устанавливается в значение свойства ЗаписываемаяДатаУстановкиПароля.
● Запись выполняется от имени пользователя без права Администрирование (создается новый пользователь или изменяются данные для пользователя, от имени которого выполняется код на встроенном языке):
● Если пароль был изменен (или записывается новый пользователь), то свойство ДатаУстановкиПароля получит в качестве значения дату и время момента записи объекта ПользовательИнформационнойБазы.
● Свойство ЗаписываемаяДатаУстановкиПароля не было изменено:
● Если пароль был изменен, то свойство ДатаУстановкиПароля получит в качестве значения дату и время момента записи объекта ПользовательИнформационнойБазы.
Следует помнить, что свойство ДатаУстановкиПароля не изменится, если перед записью объекта ПользовательИнформационнойБазы было изменено одно из следующих свойств: Пароль, СохраняемоеЗначениеПароля, ЗаписываемаяДатаУстановкиПароля. Для того, чтобы получить реальную дату изменения пароля, необходимо после записи объекта повторно получить его из списка пользователей (перечитать информацию о пользователе).
34.6.4.3. Установка пароля пользователя
Для установки пароля пользователя существует два свойства объекта ПользовательИнформационнойБазы:
● Пароль ‑ данное свойство позволяет указать новый пароль пользователя. Свойство доступно только для записи.
● СохраняемоеЗначениеПароля ‑ данное свойство содержит хеш пароля пользователя. Свойство доступно по записи и по чтению. Возможность восстановить значение пароля по хешу не предоставляется. Данное свойство можно использовать в том случае, когда необходимо скопировать в другую информационную базу текущий список пользователей (включая, очевидно, и установленные пароли).
Если при записи объекта ПользовательИнформационнойБазы заданы и свойство Пароль и свойство СохраняемоеЗначениеПароля, то в базу будет записано значение свойства Пароль, а значение свойства СохраняемоеЗначениеПароля будет проигнорировано и заполнено значением хеш-функции от свойства Пароль. Если при записи объекта ПользовательИнформационнойБазы изменено только свойство СохраняемоеЗначениеПароля, то именно это значение и попадет в информационную базу.
В случае необходимости автоматического формирования паролей пользователей (например, для массового создания пользователей перед запуском системы), можно воспользоваться объектом ГенераторСлучайныхПаролей. Этот объект позволяет формировать случайные пароли с помощью встроенного языка.
Пользователь = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя); Генератор = Новый ГенераторСлучайныхПаролей(); НовыйПароль = Генератор.СлучайныйПароль(); Пользователь.Пароль = НовыйПароль; Пользователь.Записать();
Вариант, показанный в примере, использует требования к паролям, которые указаны в настройках информационной базы. Длина пароля по умолчанию составляет 7 символов, но если в настройках информационной базы указано большее значение, то используется оно. Если нужно явно указать длину формируемого пароля (не полагаясь на настройки информационной базы), то можно использовать параметр ДлинаПароля метода СлучайныхПароль(). Если параметр этого же метода ЗапоминающийсяПароль установлен в значение Истина, то формируемый пароль будет больше похож на обычное слово и будет удобнее для запоминания. Примером такого пароля будет Anefeg3. Если параметр ЗапоминающийсяПароль будет установлен в значение Ложь, то пароль будет представлять собой просто случайную последовательность букв и цифр. Примером такого пароля будет JCcQGW3.
Для работы с сохраняемым значением пароля платформа предоставляет два метода: ВычислитьСохраняемоеЗначениеПароляПользователя() и ПроверитьСоответствиеПароляПользователяСохраняемомуЗначению(). Первый метод позволяет получить значение сохраняемого значения для пароля. Применение этого метода может быть полезно в том случае, когда параметры пользователя задаются вне информационной базы, где этого пользователя надо создать. При этом параметры создаваемого пользователя будут (или могут) передаваться по открытым (или слабозащищенным) каналам связи. Для того, чтобы избежать передачи указанного пользователем пароля открытым текстом, можно передавать значение, которое получено с помощью метода ВычислитьСохраняемоеЗначениеПароляПользователя(), а в целевой базе присваивать это значение свойству нового пользователя СохраняемоеЗначениеПароля. Следует помнить, что последовательный вызов метода ВычислитьСохраняемоеЗначениеПароляПользователя() для одного и того же пароля, может приводить к формированию различного хеша для некоторых алгоритмов хеширования. Такое поведение является нормальным.
Метод ПроверитьСоответствиеПароляПользователяСохраняемомуЗначению() позволяет проверить, что некоторый пароль (указанный в параметре метода открытым текстом) соответствует сохраняемому значению пароля. Сохраняемое значение пароля может быть указано или собственно строкой с сохраняемым значением пароля или объектом ПользовательИнформационнойБазы. В случае указания пользователя информационной базы пароль будет выполнена проверка того, что в строке действительно передан пароль указанного пользователя. При проверке будет также проверяться, что пароль соответствует текущим настройкам сложности паролей.
Еще одним свойством, связанным с паролем пользователя, является свойство ТипАлгоритмаХешированияПароля. Это свойство содержит значение типа ТипАлгоритмаХешированияПаролейПользователей. Алгоритм хеширования паролей пользователей устанавливается в параметрах информационной базы (см. здесь). Значение свойства является производной величиной от самого пароля и не может быть установлено принудительно.
Сохраняемое значение пароля конкретного пользователя изменяется при аутентификации пользователя в случае, если тип алгоритма хеширования паролей информационной базы отличается от текущего типа алгоритма хеширования пользователя, а также при смене собственно пароля. Таким образом, если для информационной базы выполнена смена алгоритма хеширования паролей, а у конкретного пользователя алгоритм хеширования отличается от текущего алгоритма информационной базы, то очевидно, что с момента смены алгоритма хеширования, пользователь не аутентифицировался в информационной базе.
34.6.4.4. Изменение требований к паролям информационной базы
Политика паролей может применяться как для информационной базы в целом, так и для конкретного пользователя. Если требуется изменить параметры политики паролей для информационной базы в целом, то можно использовать следующие методы встроенного языка:
● Действие при несоответствии паролей пользователей требованиям при аутентификации ‑ ПолучитьДействиеПриНесоответствииПаролейПользователейТребованиямПриАутентификации()/УстановитьДействиеПриНесоответствииПаролейПользователейТребованиямПриАутентификации().
● Запретить повторение пароля среди последних ‑ ПолучитьОграничениеПовторенияПаролейПользователей()/УстановитьОграничениеПовторенияПаролейПользователей().
● Максимальный срок действия паролей пользователей ‑ ПолучитьМаксимальныйСрокДействияПаролейПользователей()/УстановитьМаксимальныйСрокДействияПаролейПользователей().
● Минимальная длина паролей пользователей ‑ ПолучитьМинимальнуюДлинуПаролейПользователей()/УстановитьМинимальнуюДлинуПаролейПользователей().
● Минимальный срок действия паролей пользователей ‑ ПолучитьМинимальныйСрокДействияПаролейПользователей()/УстановитьМинимальныйСрокДействияПаролейПользователей().
● Проверка раскрытия паролей пользователей ‑ ПолучитьПроверкуРаскрытияПаролейПользователей()/УстановитьПроверкуРаскрытияПаролейПользователей().
● Проверка сложности паролей пользователей ‑ ПолучитьПроверкуСложностиПаролейПользователей()/УстановитьПроверкуСложностиПаролейПользователей().
● Срок предупреждения об истечении срока действия паролей ‑ ПолучитьСрокПредупрежденияОбИстеченииСрокаДействияПаролейПользователей()/УстановитьСрокПредупрежденияОбИстеченииСрокаДействияПаролейПользователей().
34.6.5. Восстановление пароля пользователя
Для того, чтобы заработал механизм восстановления пароля пользователя, необходимо, во-первых, выполнить настройку механизма, во-вторых, включить механизм и, в-третьих, обеспечить, чтобы у каждого пользователя информационной базы был указан корректный адрес электронной почты. Все вышеупомянутые действия можно выполнить как интерактивно (с помощью соответствующих инструментов администрирования), так и с помощью встроенного языка.
Восстановление пароля может быть выполнено одним из следующих способов:
● С помощью веб-сайта, на который перейдет пользователь и выполнит на этом сайте некоторый набор действий. Вся логика восстановления пароля должна быть реализована средствами веб-сайта, куда будет выполнен переход. Перед переходом гиперссылка будет дополнена параметрами области данных, для которой открыт диалог аутентификации. Параметры области данных задаются аналогично параметру Z командной строки запуска клиентского приложения (см. здесь). Результирующий URL будет выглядеть следующим образом: URL?Z="значения разделителей".
● С помощью электронный почты и кода подтверждения нового пароля.
Для OpenID-аутентификации изменение пароля выполняется на стороне провайдере аутентификации, т. к. именно в нем выполняется аутентификация. После изменения пароля выполняется переход на форму аутентификации в провайдере. Выбор варианта восстановления пароля в этом случае зависит от возможностей, которые предоставляет используемый OpenID-провайдер.
Для настройки механизма восстановления пароля пользователя используется объект НастройкиВосстановленияПароляПользователя. Используют данный объект методы ПолучитьНастройкиВосстановленияПароля() и УстановитьНастройкиВосстановленияПароля() менеджера дополнительных настроек аутентификации.
Объект НастройкиВосстановленияПароляПользователя содержит следующие свойства:
|
Свойство |
Описание |
|
|
Задает адрес SMTP-сервера, через который будет выполняться отправка электронной почты. |
|
|
Задает длину кода подтверждения установки нового пароля. |
|
|
Интервал времени, который должен разделять два идущих подряд запроса кода подтверждения смены пароля. |
|
|
Текст, который будет указан
в заголовке письма (поле |
|
|
Текст, который будет отображаться
в электронном письме в качестве автора письма (поле |
|
|
Задает необходимость использовать SSL-соединение для подключения к SMTP-серверу. |
|
|
Указывает, сколько раз пользователь может ошибиться при вводе кода подтверждения. После превышения количества попыток ‑ полученный код становится недействителен. Пользователю необходимо запросить новый код восстановления пароля. |
|
|
Определяет URL, по которому будет выполняться переход, если выбрано восстановление пароля переходом по навигационной ссылке. |
|
|
Определяет URL, по которому будет
выполнен переход, если свойство |
|
|
Определяет необходимость отображения навигационной ссылки помощи в диалоге аутентификации. |
|
|
Задает пароль пользователя, от имени которого выполняется подключение к SMTP-серверу. |
|
|
Задает имя пользователя, от имени которого выполняется подключение к SMTP-серверу. |
|
|
Задает номер сетевого порта, который использует SMTP-сервер. |
|
|
Позволяет указать, каким образом будет
выполняться восстановление пароля пользователя. Данное свойство может
принимать значение с типом системного перечисления ●
●
●
●
|
|
|
Указывает, время жизни кода подтверждения смены пароля. После превышения срока действия ‑ полученный код становится недействителен. Пользователю необходимо запросить новый код восстановления пароля. |
|
|
HTML-текст, представляющий собой шаблон письма с кодом восстановления пароля. По умолчанию используется текст: Копировать в буфер обмена<html><head></head> <body>Здравствуйте, &UserPresentation! <div><br></div> <div>Мы получили запрос на восстановление пароля от &ApplicationPresentation.</div> <div><br></div> <div>Введите код <b>&VerificationCode</b> для сброса пароля.</div> <div><br></div> <div>Если вы не запрашивали восстановление пароля, сообщите об этом техническому специалисту.</div></body></html> В письме могут использоваться следующие переменные: ●
●
●
●
В письме имена переменных должны предваряться символом «&». |
Простейший пример настройки механизма восстановления паролей приведен далее:
НастройкиВосстановленияПароля = Новый НастройкиВосстановленияПаролей(); НастройкиВосстановленияПароля.СпособВосстановленияПароля = СпособВосстановленияПароляПользователяИнформационнойБазы.ОтправкаКодаПодтвержденияЧерезСтандартныйСервис; ДополнительныеНастройкиАутентификации.УстановитьНастройкиВосстановленияПароля(НастройкиВосстановленияПароля);
34.6.6. Настройка аутентификации через электронную почту
Для того, чтобы заработал механизм аутентификации через электронную почту, необходимо:
● Настроить механизм аутентификации.
● Включить механизм.
● Обеспечить пользователям возможность использования механизма. Для этого необходимо для каждого пользователя, который будет пользоваться этим механизмом аутентификации:
● Включить возможность аутентификации через электронную почту.
● Обеспечить указание уникального адреса электронной почты.
Все перечисленные действия можно выполнить как интерактивно (с помощью соответствующих инструментов администрирования), так и с помощью встроенного языка.
Для настройки и включения механизма аутентификации через электронную почту используется объект НастройкиАутентификацииЧерезЭлектроннуюПочту. Используют данный объект методы ПолучитьНастройкиАутентификацииЧерезЭлектроннуюПочту() и УстановитьНастройкиАутентификацииЧерезЭлектроннуюПочту() менеджера дополнительных настроек аутентификации.
Объект НастройкиАутентификацииЧерезЭлектроннуюПочту содержит следующие свойства:
|
Свойство |
Описание |
|
|
Задает адрес SMTP-сервера, через который будет выполняться отправка электронной почты. |
|
|
Содержит набор символов, из которых формируется код подтверждения. Строка может быть или пустой, или содержать от 10 до 256 различных символов. Если задана пустая строка, то алфавит состоит из десятичных цифр от 0 до 9 (включительно). |
|
|
Задает длину кода подтверждения установки нового пароля. |
|
|
Интервал времени, который должен разделять два идущих подряд запроса кода подтверждения аутентификации. |
|
|
Текст, который будет указан
в заголовке письма (поле |
|
|
Текст, который будет отображаться
в электронном письме в качестве автора письма (поле |
|
|
Задает необходимость использовать SSL-соединение для подключения к SMTP-серверу. |
|
|
Указывает, сколько раз пользователь может ошибиться при вводе кода подтверждения. После превышения количества попыток ‑ полученный код становится недействителен. Пользователю необходимо запросить новый код восстановления пароля. |
|
|
Задает пароль пользователя, от имени которого выполняется подключение к SMTP-серверу. |
|
|
Задает имя пользователя, от имени которого выполняется подключение к SMTP-серверу. |
|
|
Задает номер сетевого порта, который использует SMTP-сервер. |
|
|
Позволяет указать, каким образом будет
выполняться запрос кода подтверждения аутентификации. Данное свойство может
принимать значение с типом системного перечисления ●
●
●
|
|
|
Определяет время действия высланного кода подтверждения аутентификации. По истечении срока действия будет необходимо запросить новый код подтверждения аутентификации. |
|
|
HTML-текст, представляющий собой шаблон письма с кодом подтверждения аутентификации. По умолчанию используется текст: Копировать в буфер обмена<html><head></head> <body>Здравствуйте, &UserPresentation! <div><br></div> <div>Мы получили запрос на аутентификацию от &ApplicationPresentation.</div> <div><br></div> <div>Введите код <b>&VerificationCode</b> для входа.</div> <div><br></div> <div>Ваше имя пользователя: &UserName.</div> <div><br></div> <div>Если вы не запрашивали аутентификацию через электронную почту, сообщите об этом техническому специалисту.</div></body></html> В письме могут использоваться следующие переменные: ●
●
●
●
В письме имена переменных должны предваряться символом «&». |
Простейший пример настройки механизма аутентификации через электронную почту приведен далее:
НастройкиАутентификации = Новый НастройкиАутентификацииЧерезЭлектроннуюПочту(); НастройкиАутентификации.СпособАутентификацииЧерезЭлектроннуюПочту = НастройкиАутентификации.ОтправкаКодаПодтвержденияЧерезСтандартныйСервис; НастройкиАутентификации.ДлинаКодаПодтверждения = 8; ДополнительныеНастройкиАутентификации.УстановитьНастройкиАутентификацииЧерезЭлектроннуюПочту(НастройкиАутентификации);
Смотри также:
● Создание нового пользователя информационной базы (см. здесь).
34.6.7. Работа со списком проверки раскрытия паролей
Для работы с настройками проверки раскрытия паролей предназначено набор свойств и методов менеджера дополнительных настроек аутентификации, а также объекты, которые используются с этими свойствами и методами.
Работа механизма проверки раскрытия паролей состоит из двух частей (см. здесь): настройки механизма и его включение. Настройка механизма выполняется с помощью объекта НастройкиПроверкиРаскрытияПароля. Свойства этого объекта соответствуют интерактивным настройкам механизма:
|
Свойство |
Описание |
|
|
Если включено использование внешнего сервиса проверки раскрытия паролей, то в данной строке указывается адрес этого сервиса. Тип:
|
|
|
Если
включено использование внешнего сервиса проверка раскрытия паролей, то
в данном свойстве можно установить, что ошибка сервиса будет трактоваться
как отсутствие сервиса (значение Тип:
|
|
|
Включить/выключить пользовательский список запрещенных паролей. Тип:
|
|
|
Включить/выключить REST-сервис проверки раскрытия паролей. Тип:
|
|
|
Включить/выключить использование встроенного в платформу списка раскрытия паролей. Тип:
|
|
|
Если включено использование внешнего сервиса проверка раскрытия паролей, то в данном свойстве указывается таймаут обращения к сервису. Тип:
|
Для установки (и получения) настроек механизма проверки раскрытия паролей служат методы менеджера дополнительных настроек аутентификации УстановитьНастройкиПроверкиРаскрытияПаролей() и ПолучитьНастройкиПроверкиРаскрытияПаролей(). Таким образом, настройки механизма проверки раскрытия паролей могут выглядеть следующим образом:
НастройкиПроверки = ДополнительныеНастройкиАутентификации.ПолучитьНастройкиПроверкиРаскрытияПароля(); НастройкиПроверки.АдресСервисаПроверкиРаскрытияПароля = "https://api.pwnedpasswords.com/range/"; НастройкиПроверки.ИспользоватьСервисПроверкиРаскрытияПароля = Истина; ДополнительныеНастройкиАутентификации.УстановитьНастройкиПроверкиРаскрытияПароля(НастройкиПроверки);
В данном примере получаются текущие настройки механизма и в этих настройка указывается необходимость использования внешнего REST-сервиса проверки раскрытия паролей и указывается его (сервиса) адрес. При вызове сервиса в заголовок запроса user-agent помещается информация о версии платформы в виде 1C:Enterprise 8.3 (A.B.C.D), где A.B.C.D ‑ полный номер версии.
Для того, чтобы проверить какой-либо пароль на возможность его раскрытия, предназначен метод глобального контекста ПроверитьРаскрытиеПароля(). Параметром метода служит значение пароля открытым текстом, а в качестве результат возвращается значение типа Булево.
Если при настройке механизма проверки раскрытия паролей выбрана работа с пользовательским списком запрещенных паролей (свойство НастройкиПроверкиРаскрытияПароля.ИспользоватьЗаданныйСписокПроверкиРаскрытияПароля установлено в значение Истина), то для работы с этим списком предназначен менеджер списка проверки раскрытия паролей, который доступен через свойство ДополнительныеНастройкиАутентификации.СписокПроверкираскрытияПаролей. Рассмотрим подробнее интерфейс этого менеджера.
Список паролей можно полностью устанавливать (или расширять) паролями, которые заданы обычным текстом. Для этого предназначены методы менеджера УстановитьСписокИзПаролей() и ДобавитьВСписокИзПаролей(). Но получить оригинальное написание паролей можно не всегда. Например, если мы хотим запретить использование всех паролей, которые установлены у пользователей сейчас, то получить оригинальные пароли с помощью встроенного языка мы не можем. Из языка доступно получение только сохраняемого значения (хеша) текущего пароля пользователя. В этом случае можно воспользоваться парой методов УстановитьСписокИзСохраняемыхЗначенийПаролей() и ДобавитьВСписокИзСохраняемыхЗначенийПаролей(). Сохраняемые значения паролей ‑ это хеш SHA-1, закодированный по стандарту Base64. Список запрещенных паролей может устанавливаться из различных источников данных (массив, строка, файл, поток).
Для того, чтобы узнать, сколько значений находится в пользовательском списке, предназначен метод ПолучитьКоличествоСохраняемыхЗначенийПаролей(). Возвращаемое значение можно использовать как контрольное значение ‑ список не может превышать 100 000 значений.
Получить текущий список сохраняемых значений паролей (для запрещенных паролей) можно с помощью метода ПолучитьСписокСохраняемыхЗначенийПаролей(). Полученное значение можно использовать для переноса в другую информационную базу или резервного копирования списка.
Если необходимо, например, запретить использование в информационной базе совсем простых паролей, можно использовать список, подобный тому, как показано в примере:
СписокНежелательныхПаролей = Новый Массив(); СписокНежелательныхПаролей.Добавить("qwerty"); СписокНежелательныхПаролей.Добавить("12345"); СписокНежелательныхПаролей.Добавить("password"); ДополнительныеНастройкиАутентификации.СписокПроверкиРаскрытияПароля.УстановитьСписокИзПаролей(СписокНежелательныхПаролей); НастройкиПроверки = ДополнительныеНастройкиАутентификации.ПолучитьНастройкиПроверкиРаскрытияПароля(); НастройкиПроверки.ИспользоватьЗаданныйСписокПроверкиРаскрытияПароля = Истина; ДополнительныеНастройкиАутентификации.УстановитьНастройкиПроверкиРаскрытияПароля(НастройкиПроверки);