Добавляет новый элемент коллекции и возвращает его.
Синтаксис
Добавить()Полное описание, параметры и ограничения
ОписанияСистемЛинейныхУравнений.Добавить (SystemDescriptions.Add)
ОписанияСистемЛинейныхУравнений (SystemDescriptions)
Добавить (Add)
Доступен, начиная с версии 8.3.14.
Синтаксис:
Добавить()
Возвращаемое значение:
Тип: ОписаниеСистемыЛинейныхУравнений.
У нового созданного объекта ОписаниеСистемыЛинейныхУравнений свойства КолонкаКоэффициентовВСвязях и КолонкаКоэффициентовВУзлах имеют значение Неопределено.
Описание:
Добавляет новый элемент коллекции и возвращает его.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.3.14.
Методическая информация
Практические примеры
Найти группы зависимостей в собственном графе и отличить связность от решения уравнений
Два двусторонне связанных блока соединены одной направленной связью. Слабая связность объединяет их, сильная оставляет два блока.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Учебная база платформы 8.5.1.1343, серверный общий модуль УчебныеЗадачи. Фрагмент вставьте в тело ВыполнитьПример() Экспорт и вызовите из серверной команды собственной обработки.
Все таблицы создаются в памяти. Документы, регистры, расчёт себестоимости конфигурации и внешние сервисы не используются.
Номера уравнений и переменных 0 и 1 в этих задачах — собственные ключи. Имена колонок передаются явно; индексы коллекций начинаются с 0.
Не запускайте расчёт больших матриц на рабочем сервере по аналогии с уроком: здесь только две неизвестные и контроль заранее известного решения.
Эта задача только анализирует граф. Не задавайте источник свободных членов и не запускайте РассчитатьСистемыЛинейныхУравнений для этой матрицы связности.
Связи = Новый ТаблицаЗначений;
Связи.Колонки.Добавить("Уравнение", Новый ОписаниеТипов("Число"));
Связи.Колонки.Добавить("Переменная", Новый ОписаниеТипов("Число"));
Связи.Колонки.Добавить("Вес", Новый ОписаниеТипов("Число"));
Ребра = Новый Массив;
Ребра.Добавить(Новый Структура("Уравнение,Переменная,Вес", 0, 1, 1));
Ребра.Добавить(Новый Структура("Уравнение,Переменная,Вес", 1, 0, 1));
Ребра.Добавить(Новый Структура("Уравнение,Переменная,Вес", 1, 2, 1));
Ребра.Добавить(Новый Структура("Уравнение,Переменная,Вес", 2, 1, 1));
Ребра.Добавить(Новый Структура("Уравнение,Переменная,Вес", 3, 4, 1));
Ребра.Добавить(Новый Структура("Уравнение,Переменная,Вес", 4, 3, 1));
Ребра.Добавить(Новый Структура("Уравнение,Переменная,Вес", 2, 3, 1));
Для Каждого Ребро Из Ребра Цикл
НоваяСвязь = Связи.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСвязь, Ребро);
КонецЦикла;
Расчет = Новый РасчетСистемЛинейныхУравнений;
Расчет.ИсточникДанныхСвязей = Связи;
Расчет.КолонкаУравненияВСвязях = "Уравнение";
Расчет.КолонкаПеременныеВСвязях = "Переменная";
Описание = Расчет.ОписанияСистем.Добавить();
Описание.КолонкаКоэффициентовВСвязях = "Вес";
// Для методов графа КолонкаКоэффициентовВУзлах не задаётся.
Слабые = Расчет.ПолучитьКомпонентыСвязности(СпособПолученияКомпонентСвязностиРасчетаСистемЛинейныхУравнений.КомпонентыСлабойСвязности);
Сильные = Расчет.ПолучитьКомпонентыСвязности(СпособПолученияКомпонентСвязностиРасчетаСистемЛинейныхУравнений.КомпонентыСильнойСвязности);
СлабыеПоУзлу = Новый Соответствие;
Для Каждого СтрокаКомпоненты Из Слабые Цикл
СлабыеПоУзлу.Вставить(СтрокаКомпоненты[0], СтрокаКомпоненты[1]);
КонецЦикла;
СильныеПоУзлу = Новый Соответствие;
Для Каждого СтрокаКомпоненты Из Сильные Цикл
СильныеПоУзлу.Вставить(СтрокаКомпоненты[0], СтрокаКомпоненты[1]);
КонецЦикла;
Сообщить(Слабые.Количество() = 5 И Сильные.Количество() = 5);
Сообщить(СлабыеПоУзлу.Получить(0) = СлабыеПоУзлу.Получить(4));
Сообщить(СильныеПоУзлу.Получить(0) = СильныеПоУзлу.Получить(1));
Сообщить(СильныеПоУзлу.Получить(1) = СильныеПоУзлу.Получить(2));
Сообщить(СильныеПоУзлу.Получить(3) = СильныеПоУзлу.Получить(4));
Сообщить(СильныеПоУзлу.Получить(0) <> СильныеПоУзлу.Получить(3));
Глубина = Расчет.ПолучитьГлубинуГрафа(0);
Сообщить(ТипЗнч(Глубина) = Тип("Число") И Глубина > 0);
Сообщить("Глубина поиска от собственной вершины 0 по API: " + Строка(Глубина));Разбор по шагам
Собственные вершины 0/1/2 взаимно достижимы, 3/4 тоже. Между блоками есть только одна направленная связь.
По текущей справке методы графа требуют источника связей, двух ключевых колонок и одного описания только с колонкой коэффициентов в связях.
Явно выбираем слабые и сильные компоненты. Не полагаемся на меняющееся с режимом совместимости значение по умолчанию.
Результат содержит номер узла в первой колонке и номер компоненты во второй. Сохраняем соответствие и сравниваем членство, не выдумываем постоянные номера компонент.
В слабом графе блоки связаны; в сильном единственного направления между ними недостаточно для взаимной достижимости.
ПолучитьГлубинуГрафа использует существующую вершину 0. Выводим значение API, не подменяем его числом неизвестных или минимальным расстоянием.
Как проверить результат
Семь булевых сообщений Истина: по пять узлов, нужные совпадения/различия компонент и числовая положительная глубина.
Первая и последняя вершины принадлежат одной слабой, но разным сильным компонентам; конкретные номера компонент не фиксируются.
Ожидаемый результат
Структура зависимостей разобрана отдельно от численного решения системы.
На что обратить внимание
Связность не доказывает существование единственного решения или невырожденность матрицы.
Глубина поиска в глубину не равна кратчайшему расстоянию и не является временем расчёта.
Графовые методы здесь вызываются с одним описанием без свободных членов, согласно специальному контракту API.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Подготовить два описания систем, убрать черновик и очистить только собственную коллекцию
Коллекция ОписанияСистем хранит настройки расчёта, не решения и не записи информационной базы.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Учебная база платформы 8.5.1.1343, серверный общий модуль УчебныеЗадачи. Фрагмент вставьте в тело ВыполнитьПример() Экспорт и вызовите из серверной команды собственной обработки.
Все таблицы создаются в памяти. Документы, регистры, расчёт себестоимости конфигурации и внешние сервисы не используются.
Номера уравнений и переменных 0 и 1 в этих задачах — собственные ключи. Имена колонок передаются явно; индексы коллекций начинаются с 0.
Не запускайте расчёт больших матриц на рабочем сервере по аналогии с уроком: здесь только две неизвестные и контроль заранее известного решения.
Узлы = Новый ТаблицаЗначений;
Узлы.Колонки.Добавить("Уравнение", Новый ОписаниеТипов("Число"));
Узлы.Колонки.Добавить("B1", Новый ОписаниеТипов("Число"));
Узлы.Колонки.Добавить("B2", Новый ОписаниеТипов("Число"));
Узел0 = Узлы.Добавить();
Узел0.Уравнение = 0;
Узел0.B1 = 5;
Узел0.B2 = 12;
Узел1 = Узлы.Добавить();
Узел1.Уравнение = 1;
Узел1.B1 = 1;
Узел1.B2 = 1;
Связи = Новый ТаблицаЗначений;
Связи.Колонки.Добавить("Уравнение", Новый ОписаниеТипов("Число"));
Связи.Колонки.Добавить("Переменная", Новый ОписаниеТипов("Число"));
Связи.Колонки.Добавить("A1", Новый ОписаниеТипов("Число"));
Связи.Колонки.Добавить("A2", Новый ОписаниеТипов("Число"));
Коэффициенты = Новый Массив;
Коэффициенты.Добавить(Новый Структура("Уравнение,Переменная,A1,A2", 0, 0, 2, 2));
Коэффициенты.Добавить(Новый Структура("Уравнение,Переменная,A1,A2", 0, 1, 1, 3));
Коэффициенты.Добавить(Новый Структура("Уравнение,Переменная,A1,A2", 1, 0, 1, 1));
Коэффициенты.Добавить(Новый Структура("Уравнение,Переменная,A1,A2", 1, 1, -1, -1));
Для Каждого Коэффициент Из Коэффициенты Цикл
НоваяСвязь = Связи.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСвязь, Коэффициент);
КонецЦикла;
Расчет = Новый РасчетСистемЛинейныхУравнений;
Расчет.ИсточникДанныхУзлов = Узлы;
Расчет.ИсточникДанныхСвязей = Связи;
Расчет.КолонкаУравненияВУзлах = "Уравнение";
Расчет.КолонкаУравненияВСвязях = "Уравнение";
Расчет.КолонкаПеременныеВСвязях = "Переменная";
Описание = Расчет.ОписанияСистем.Добавить();
Описание.КолонкаКоэффициентовВСвязях = "A1";
Описание.КолонкаКоэффициентовВУзлах = "B1";
Черновик = Расчет.ОписанияСистем.Добавить();
Черновик.КолонкаКоэффициентовВСвязях = "A2";
Черновик.КолонкаКоэффициентовВУзлах = "B2";
Сообщить(Расчет.ОписанияСистем.Количество() = 2);
Сообщить(Расчет.ОписанияСистем.Получить(0).КолонкаКоэффициентовВСвязях = "A1");
Расчет.ОписанияСистем.Удалить(Черновик);
Сообщить(Расчет.ОписанияСистем.Количество() = 1);
Замена = Расчет.ОписанияСистем.Добавить();
Замена.КолонкаКоэффициентовВСвязях = "A2";
Замена.КолонкаКоэффициентовВУзлах = "B2";
Расчет.ОписанияСистем.Удалить(1);
Сообщить(Расчет.ОписанияСистем.Количество() = 1);
Расчет.ОписанияСистем.Очистить();
Сообщить(Расчет.ОписанияСистем.Количество() = 0);
Сообщить(Узлы.Количество() = 2 И Связи.Количество() = 4);
Сообщить("Исходные таблицы остались в памяти; расчёт после очистки не запускаем.");Разбор по шагам
Создаём собственный объект расчёта с собственными таблицами и одним описанием A1/B1.
Добавляем черновик A2/B2, проверяем два элемента и доступ по индексу 0.
Удалить поддерживает объект элемента и индекс. Показываем оба варианта на разных собственных черновиках.
Очистить удаляет только описания этого объекта в памяти. Исходные таблицы узлов и связей остаются.
После очистки метод расчёта не вызываем: ему требуется хотя бы одно описание системы.
Как проверить результат
Шесть сравнений Истина: оба способа удаления оставляют одну систему, очистка — ноль, источники сохраняют 2/4 строки.
Ни один документ, регистр или внешний файл не изменяется.
Ожидаемый результат
Жизненный цикл коллекции настроек и область очистки объяснены без разрушения исходных данных.
На что обратить внимание
Очистить не заменяет заново сформированную корректную систему. Добавьте описание перед следующим расчётом.
Индекс коллекции начинается с 0, но колонки результата называются Решение1, Решение2: не смешивайте эти номера.
Не используйте удалённый объект описания как действующий элемент коллекции.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.