Представлен алгоритм решения задачи методом перебора возможных делителей.
Функция ProtoText для формирования порождающего запроса, генерирующего числовую последовательность, взята из статьи Порождающий запрос от ildarovich.
Обработка прилагается.
Процедура Факторизация()
ПроверкаЧисло = 0;
ТабРазложение.Очистить();
Половина = Цел((ЗаданноеЧисло)/2)+1;
МВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МВТ;
Запрос.УстановитьПараметр("П", ЗаданноеЧисло);
Запрос.Текст = ProtoText(Половина)+
";
|Выбрать X как м Поместить ПотенциальныеМножители0 ИЗ #r
|Где X <>1 И (X = 2 или X = 3 или (X -1)/6 - ВЫРАЗИТЬ((X -1)/6 КАК ЧИСЛО(32, 0)) = 0 или (X +1)/6 - ВЫРАЗИТЬ((X +1)/6 КАК ЧИСЛО(32, 0)) = 0);
|Выбрать 1 как ПростойМножитель, 1 как Кратность Поместить Результат;
|Выбрать * ИЗ ПотенциальныеМножители0";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#r", "r"+Формат(Половина, "ЧГ="));
КоличествоПотенциальныхМножителей = Запрос.Выполнить().Выбрать().Количество();
ш = 0;
Накопление = 1;
Остаток = ЗаданноеЧисло;
Пока КоличествоПотенциальныхМножителей <> 0 Цикл
Запрос.Текст = "Выбрать м Поместить ПотенциальныеМножители#Замена2_0 из ПотенциальныеМножители#Замена1
|Где &П/м - ВЫРАЗИТЬ(&П/м КАК ЧИСЛО(32, 0)) = 0;
|Выбрать м Поместить ПотенциальныеМножители#Замена2 Из ПотенциальныеМножители#Замена2_0
|Где Не м В(Выбрать П2.м Из ПотенциальныеМножители#Замена2_0 как П1
| Внутреннее Соединение ПотенциальныеМножители#Замена2_0 Как П2
| По П2.м/П1.м<>1 и П2.м/П1.м - Выразить(П2.м/П1.м КАК ЧИСЛО(32, 0))=0);
|Выбрать ПростойМножитель, Кратность Поместить РезультатВрем ИЗ Результат; Уничтожить Результат;
|Выбрать ПростойМножитель, Кратность Поместить Результат ИЗ РезультатВрем
|Объединить Все
|Выбрать м, 1 Из ПотенциальныеМножители#Замена2; Уничтожить РезультатВрем;
|Уничтожить ПотенциальныеМножители#Замена2_0;
|Выбрать * ИЗ ПотенциальныеМножители#Замена2";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Замена1", Формат(ш, "ЧРГ=; ЧН=; ЧГ="));
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Замена2", Формат(ш+1, "ЧРГ=; ЧГ="));
ТабПроизведение = Запрос.Выполнить().Выгрузить();
НовоеНакопление = 1;
Для каждого Стр Из ТабПроизведение Цикл
НовоеНакопление = НовоеНакопление*Стр.м;
КонецЦикла;
Накопление = Накопление*НовоеНакопление;
КоличествоПотенциальныхМножителей = ТабПроизведение.Количество();
ш = ш + 1;
Остаток = Остаток/НовоеНакопление;
Запрос.УстановитьПараметр("П", Остаток);
КонецЦикла;
Если Накопление = 1 Тогда
ПроверкаЧисло = ЗаданноеЧисло;
Предупреждение("Простое число!", 2);
Иначе
Запрос.Текст = "Выбрать ПростойМножитель, Сумма(Кратность) как Кратность ИЗ Результат где ПростойМножитель <> 1 Сгруппировать по ПростойМножитель";
ТабРазложение.Загрузить(Запрос.Выполнить().Выгрузить());
ПроверкаЧисло = Накопление;
КонецЕсли;
КонецПроцедуры