Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
19 фев 2026, 21:03

ИИ GigaChat

Автор Rehala, Сегодня в 03:38

0 Пользователей и 1 гость просматривают эту тему.

Rehala

&НаСервере
// 2)
Процедура СформироватьПрогнозПотребностейНаСервере()

Если Не ЗначениеЗаполнено(КоличествоМесяцев) Или КоличествоМесяцев = 0 Тогда
Сообщить("Заполните количество месяцев для прогнозирования");
Возврат;
КонецЕсли;

ТокенДоступа = Константы.ТокенДоступа.Получить();
КлиентID = Константы.КлиентID.Получить();

Если ТокенДоступа = Неопределено Или Не ЗначениеЗаполнено(ТокенДоступа) Тогда
Сообщить("Пустой токен доступа, заполните токен доступа");
Возврат;
КонецЕсли;

Если КлиентID = Неопределено Или Не ЗначениеЗаполнено(КлиентID) Тогда
Сообщить("Пустой клиент id, заполните клиент id");
Возврат;
КонецЕсли;

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| РасходнаяНакладнаяТовары.Номенклатура КАК Номенклатура,
| РасходнаяНакладнаяТовары.Спецификация КАК Спецификация,
| СУММА(РасходнаяНакладнаяТовары.Количество) КАК Количество
|ПОМЕСТИТЬ ВсеМатериалы
|ИЗ
| Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
|ГДЕ
| РасходнаяНакладнаяТовары.Ссылка.Проведен = ИСТИНА
| И РасходнаяНакладнаяТовары.Ссылка.Дата МЕЖДУ ДОБАВИТЬКДАТЕ(&ТекущаяДата, ГОД, -2) И ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, 1)
|
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяТовары.Номенклатура,
| РасходнаяНакладнаяТовары.Спецификация
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СпецификацияМатериалы.Материал КАК Номенклатура,
| СпецификацияМатериалы.Спецификация КАК Спецификация,
| СУММА(СпецификацияМатериалы.Количество * ВсеМатериалы.Количество) КАК Количество
|ИЗ
| ВсеМатериалы КАК ВсеМатериалы
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Спецификация.Материалы КАК СпецификацияМатериалы
| ПО ВсеМатериалы.Спецификация = СпецификацияМатериалы.Ссылка.Ссылка
| И ВсеМатериалы.Номенклатура.Ссылка = СпецификацияМатериалы.Ссылка.Владелец
|
|СГРУППИРОВАТЬ ПО
| СпецификацияМатериалы.Материал,
| СпецификацияМатериалы.Спецификация";

Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());

РезультатЗапроса = Запрос.Выполнить().Выгрузить();

Если РезультатЗапроса.Количество() = 0 Тогда
Сообщить("Не найдены данные за последние 2 года");
Возврат;
КонецЕсли;

ТаблицаПрогноза.Очистить();

    ВсеМатериалы.Загрузить(РезультатЗапроса);

ВсеМатериалыПроверены = Ложь;

Пока ВсеМатериалыПроверены = Ложь Цикл

НомерСтроки = 0;

ТекстПрогнозов = "";

Для Каждого ТекущаяСтрока Из ВсеМатериалы Цикл

Если ЗначениеЗаполнено(ТекущаяСтрока.Спецификация) Тогда

ТекущаяСпецификация = ТекущаяСтрока.Спецификация.ПолучитьОбъект();

Для Каждого ТекущийМатериал Из ТекущаяСпецификация.Материалы Цикл

НовыйМатерииал = ВсеМатериалы.Добавить();
НовыйМатерииал.Номенклатура = ТекущийМатериал.Материал;
НовыйМатерииал.Спецификация = ТекущийМатериал.Спецификация;
НовыйМатерииал.Количество = ТекущийМатериал.Количество * ТекущаяСтрока.Количество;

КонецЦикла;

Прервать;

ИначеЕсли НомерСтроки = ВсеМатериалы.Количество() - 1 Тогда
ВсеМатериалыПроверены = Истина;
КонецЕсли;

ТекстПрогнозов = ТекстПрогнозов + Символы.ПС + СтрШаблон("%1, %2;", Строка(ТекущаяСтрока.Номенклатура), Строка(ТекущаяСтрока.Количество));

НомерСтроки = НомерСтроки + 1;

КонецЦикла;

Если НомерСтроки > 0 И ВсеМатериалыПроверены = Ложь Тогда
ВсеМатериалы.Удалить(НомерСтроки);
КонецЕсли;

КонецЦикла;

Текст = СтрШаблон("Спрогнозируй потребность в материалах на %1 месяц(ев) вперёд на основе данных из 
|заказов и списаниях сырья за последние 2 года, твой ответ не должен превышать и не быть равен значениям за 2 года,
|ответ должен быть в виде перечисления всех данных через знак "","" а в конце должен быть знак "";""   
|после перечисления каждой строки (только после процента уверенности прогноза), знак для разделеня дробной части ""."",
|а каждая строка должна содержать данные в следующем виде:
|Название материала (название как из данных для прогнозирования), количества материала (должно быть только число),
|процент уверенности прогноза (должны быть число и знак процента);
|...
|... 
|
|Формула для каждого материала:
|Прогноз на %1 мес = ОкруглениеВверх((Списание за 2 года / 24) * %1)
|
|Данные потраченных материалов для создания изделий из заказов по продаже для прогнозирования за последние 2 года
|(Порядок: Материал, произведённое количество):%2
|
|Суть прогноза показать материалы которые нужно будет заказать и в каком количестве, по тому сколько мы их потратили за последние 2 года,
|неважно какие изделия делались, важны сами материалы. Выведи только ответ в виде перечисления как упоминалось в начале,
|не должно быть никаких лишних комментариев и рассуждений с твоей стороны",
Строка(КоличествоМесяцев), Лев(ТекстПрогнозов, СтрДлина(ТекстПрогнозов) - 1) + ".");

ДанныеВозврата = ОбщегоНазначения.ПолучитьДанныеИзИИ(Текст);

Попытка

Если ДанныеВозврата <> Неопределено Тогда

ДанныеВозврата = ДанныеВозврата.choices[0].message.content;

ДанныеВозврата = СтрРазделить(ДанныеВозврата, ";", Ложь);

Для Каждого ТекущаяСтрока Из ДанныеВозврата Цикл

НомерПервогоРазделителя = СтрНайти(ТекущаяСтрока, ",");
НомерВторогоРазделителя = СтрНайти(ТекущаяСтрока, ",",,, 2);

НовыйПрогноз = ТаблицаПрогноза.Добавить();
НовыйПрогноз.Материал = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Лев(ТекущаяСтрока, НомерПервогоРазделителя - 1)));
НовыйПрогноз.Количество = Число(СокрЛП(Сред(ТекущаяСтрока, НомерПервогоРазделителя + 1, НомерВторогоРазделителя - НомерПервогоРазделителя - 1)));
НовыйПрогноз.ПроцентУверенностиПрогноза = СокрЛП(Прав(ТекущаяСтрока, СтрДлина(ТекущаяСтрока) - НомерВторогоРазделителя - 1));

КонецЦикла;

КонецЕсли;

Исключение
Сообщить("Ошибка при обработке ответа от ИИ");
КонецПопытки;

КонецПроцедуры

Rehala

&НаСервере
// 3)
Процедура СформироватьИзмененияОстатковМатериалов()
   
    ГрафикИзмененияОстатков.АвтоТранспонирование = Ложь;
    ГрафикИзмененияОстатков.Обновление = Ложь;
   
    ГрафикИзмененияОстатков.Очистить();
   
    СерияТекущийОстаток = ГрафикИзмененияОстатков.Серии.Добавить("Текущий остаток");
    СерияОстатокСУчётомПрогноза = ГрафикИзмененияОстатков.Серии.Добавить("Остаток с учётом прогноза");
   
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |    ЗапасыНаСкладахОстатки.Номенклатура КАК Номенклатура,
        |    ЗапасыНаСкладахОстатки.Спецификация КАК Спецификация,
        |    СУММА(ЗапасыНаСкладахОстатки.КоличествоОстаток) КАК КоличествоОстаток
        |ИЗ
        |    РегистрНакопления.ЗапасыНаСкладах.Остатки КАК ЗапасыНаСкладахОстатки
        |ГДЕ
        |    ЗапасыНаСкладахОстатки.Спецификация.Ссылка ЕСТЬ NULL
        |
        |СГРУППИРОВАТЬ ПО
        |    ЗапасыНаСкладахОстатки.Номенклатура,
        |    ЗапасыНаСкладахОстатки.Спецификация";
   
    ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();
   
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
       
        Точка = ГрафикИзмененияОстатков.УстановитьТочку(Строка(ВыборкаДетальныеЗаписи.Номенклатура));
        Точка.Текст = Строка(ВыборкаДетальныеЗаписи.Номенклатура);
       
        ГрафикИзмененияОстатков.УстановитьЗначение(Точка, СерияТекущийОстаток, ВыборкаДетальныеЗаписи.КоличествоОстаток);
       
        Для Каждого ТекущаяСтрока Из ТаблицаПрогноза Цикл
           
            Если Строка(ТекущаяСтрока.Материал) = Строка(ВыборкаДетальныеЗаписи.Номенклатура) Тогда
                ГрафикИзмененияОстатков.УстановитьЗначение(Точка, СерияОстатокСУчётомПрогноза, ВыборкаДетальныеЗаписи.КоличествоОстаток - ТекущаяСтрока.Количество);   
                Прервать;   
            КонецЕсли;
           
        КонецЦикла;
       
    КонецЦикла;
   
    Для Каждого ТекущаяСтрока Из ТаблицаПрогноза Цикл 
       
        ТакойТочкиНету = Истина;
       
        Для Каждого ТекущаяТочка Из ГрафикИзмененияОстатков.Точки Цикл
           
            Если ТекущаяТочка.Текст = Строка(ТекущаяСтрока.Материал) Тогда
                ТакойТочкиНету = Ложь;
                Прервать;   
            КонецЕсли;
           
        КонецЦикла;
       
        Если ТакойТочкиНету = Истина Тогда
           
            Точка = ГрафикИзмененияОстатков.УстановитьТочку(Строка(ТекущаяСтрока.Материал));
           
            ГрафикИзмененияОстатков.УстановитьЗначение(Точка, СерияТекущийОстаток, 0);
            ГрафикИзмененияОстатков.УстановитьЗначение(Точка, СерияОстатокСУчётомПрогноза, -ТекущаяСтрока.Количество); 
           
        КонецЕсли;
       
    КонецЦикла;
               
    ГрафикИзмененияОстатков.АвтоТранспонирование = Истина;
    ГрафикИзмененияОстатков.Обновление = Истина;
   
КонецПроцедуры

Теги: abp 

Похожие темы (1)

84660

Автор Rehala


Рейтинг@Mail.ru

Поиск