├── .gitignore ├── temp ├── clipboard.txt └── code-explanation.html ├── 1c-designer-copilot.exe ├── .vscode └── settings.json ├── README.md ├── src ├── utils │ └── Модули │ │ ├── РаботаСJSON.os │ │ └── РаботаСФайлами.os ├── Модули │ ├── СкриптСозданияКода.os │ └── СкриптАнализаКода.os └── gemini │ └── Классы │ └── Gemini.os └── 1c-designer-copilot.ahk /.gitignore: -------------------------------------------------------------------------------- 1 | env.json -------------------------------------------------------------------------------- /temp/clipboard.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /1c-designer-copilot.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KamranV21/1c-designer-copilot/HEAD/1c-designer-copilot.exe -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "AHK++.v2.file": { 3 | "compileBaseFile": "", 4 | "helpPath": "C:/Program Files/AutoHotkey/v2/AutoHotkey.chm", 5 | "interpreterPath": "C:\\Program Files\\AutoHotkey\\v2\\AutoHotkey.exe", 6 | "maxScanDepth": 2, 7 | "templateSnippetName": "AhkTemplateV2" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Copilot для конфигуратора 1С 2 | 3 | Простая реализация генерации и анализа кода 1С с помощью AutoHotkey, OneScript и Gemini. 4 | 5 | Подробнее на Инфостарт: 6 | 7 | https://infostart.ru/public/2276516/ 8 | 9 | ![Infostart](https://infostart.ru/bitrix/templates/sandbox_empty/assets/tpl/abo/img/logo.svg) 10 | -------------------------------------------------------------------------------- /src/utils/Модули/РаботаСJSON.os: -------------------------------------------------------------------------------- 1 | Функция JSONИзЗначения(Значение) Экспорт 2 | 3 | ЗаписьJSON = Новый ЗаписьJSON; 4 | ЗаписьJSON.УстановитьСтроку(); 5 | ЗаписатьJSON(ЗаписьJSON, Значение); 6 | 7 | Возврат ЗаписьJSON.Закрыть(); 8 | 9 | КонецФункции 10 | 11 | Функция ЗначениеИзJSON(JSON, ПрочитатьВСоответствие = Ложь, ИменаСвойствСоЗначениемДата = "") Экспорт 12 | 13 | ЧтениеJSON = Новый ЧтениеJSON; 14 | ЧтениеJSON.УстановитьСтроку(JSON); 15 | 16 | Возврат ПрочитатьJSON(ЧтениеJSON, ПрочитатьВСоответствие, ИменаСвойствСоЗначениемДата); 17 | 18 | КонецФункции -------------------------------------------------------------------------------- /src/utils/Модули/РаботаСФайлами.os: -------------------------------------------------------------------------------- 1 | Функция СодержимоеТекстовогоДокумента(ПутьКФайлу) Экспорт 2 | 3 | ТекстовыйФайл = Новый ТекстовыйДокумент; 4 | ТекстовыйФайл.Прочитать(ПутьКФайлу, КодировкаТекста.UTF8); 5 | Возврат ТекстовыйФайл.ПолучитьТекст(); 6 | 7 | КонецФункции 8 | 9 | Процедура ЗаписатьТекстовыйДокумент(ПутьКФайлу, Содержимое) Экспорт 10 | 11 | ТекстовыйФайл = Новый ТекстовыйДокумент; 12 | ТекстовыйФайл.УстановитьТекст(Содержимое); 13 | ТекстовыйФайл.Записать(ПутьКФайлу, КодировкаТекста.UTF8, Символы.ВК + Символы.ПС); 14 | 15 | КонецПроцедуры -------------------------------------------------------------------------------- /src/Модули/СкриптСозданияКода.os: -------------------------------------------------------------------------------- 1 | #Использовать "../gemini" 2 | #Использовать "../utils" 3 | 4 | JSON = РаботаСФайлами.СодержимоеТекстовогоДокумента(ТекущийСценарий().Каталог + "\..\..\env.json"); 5 | env = РаботаСJSON.ЗначениеИзJSON(JSON); 6 | 7 | ПутьКФайлу = ТекущийСценарий().Каталог + "\..\..\temp\clipboard.txt"; 8 | 9 | Промт = РаботаСФайлами.СодержимоеТекстовогоДокумента(ПутьКФайлу); 10 | 11 | Gemini = Новый Gemini(env.geminiApiKey); 12 | Результат = Gemini.СформироватьКодПоОписанию(Промт); 13 | 14 | РаботаСФайлами.ЗаписатьТекстовыйДокумент(ПутьКФайлу, Результат.Ответ); 15 | -------------------------------------------------------------------------------- /temp/code-explanation.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Анализ кода 7 | 26 | 27 | 28 |
29 | 30 | 31 | -------------------------------------------------------------------------------- /1c-designer-copilot.ahk: -------------------------------------------------------------------------------- 1 | #Requires AutoHotkey v2.0 2 | 3 | SaveTextToFile(Path, Content) { 4 | File := FileOpen(A_ScriptDir Path, "w", "UTF-8") 5 | File.Write(Content) 6 | File.Close() 7 | } 8 | 9 | FileContent(Path) { 10 | File := FileOpen(A_ScriptDir Path, "r", "UTF-8") 11 | Content := File.Read(unset) 12 | File.Close() 13 | return Content 14 | } 15 | 16 | ^1:: { 17 | 18 | ClipboardFilePath := "\temp\clipboard.txt" 19 | 20 | A_Clipboard := "" 21 | Send("^c") 22 | ClipWait(1, 1) 23 | Promt := A_Clipboard 24 | SaveTextToFile(ClipboardFilePath, Promt) 25 | 26 | ScriptPath := A_ScriptDir "\src\Модули\СкриптСозданияКода.os" 27 | Disk := "/c" 28 | RunWait("cmd " Disk " oscript " ScriptPath) 29 | 30 | A_Clipboard := FileContent(ClipboardFilePath) 31 | Send("^v") 32 | 33 | } 34 | 35 | ^2:: { 36 | 37 | A_Clipboard := "" 38 | Send("^c") 39 | ClipWait(1, 1) 40 | Content := A_Clipboard 41 | SaveTextToFile("\temp\clipboard.txt", Content) 42 | 43 | ScriptPath := A_ScriptDir "\src\Модули\СкриптАнализаКода.os" 44 | Disk := "/c" 45 | RunWait("cmd " Disk " oscript " ScriptPath) 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/Модули/СкриптАнализаКода.os: -------------------------------------------------------------------------------- 1 | #Использовать "../gemini" 2 | #Использовать "../utils" 3 | 4 | JSON = РаботаСФайлами.СодержимоеТекстовогоДокумента(ТекущийСценарий().Каталог + "\..\..\env.json"); 5 | env = РаботаСJSON.ЗначениеИзJSON(JSON); 6 | 7 | КодКАнализу = РаботаСФайлами.СодержимоеТекстовогоДокумента(ТекущийСценарий().Каталог + "\..\..\temp\clipboard.txt"); 8 | 9 | Gemini = Новый Gemini(env.geminiApiKey); 10 | Результат = Gemini.АнализироватьКод(КодКАнализу); 11 | 12 | ПутьКФайлуHTML = ТекущийСценарий().Каталог + "\..\..\temp\code-explanation.html"; 13 | СодержимоеHTML = РаботаСФайлами.СодержимоеТекстовогоДокумента(ПутьКФайлуHTML); 14 | 15 | КомментарийОткрытияMarkdown = "//++ Mardown"; 16 | КомментарийЗакрытияMarkdown = "//-- Mardown"; 17 | 18 | ПозицияНачалаMarkdown = СтрНайти(СодержимоеHTML, КомментарийОткрытияMarkdown); 19 | ПозицияЗавершенияMarkdown = СтрНайти(СодержимоеHTML, КомментарийЗакрытияMarkdown); 20 | 21 | ДлинаКомментария = СтрДлина(КомментарийОткрытияMarkdown); 22 | ЧислоСимволовКЗамене = ПозицияЗавершенияMarkdown - ДлинаКомментария - ПозицияНачалаMarkdown; 23 | 24 | ТекстОтвета = Результат.Ответ; 25 | ТекстОтвета = СтрЗаменить(ТекстОтвета, Символы.ПС, "\n"); 26 | ТекстОтвета = СтрЗаменить(ТекстОтвета, "'", """"); 27 | 28 | ТекстКЗамене = Сред(СодержимоеHTML, ПозицияНачалаMarkdown + ДлинаКомментария, ЧислоСимволовКЗамене); 29 | ТекстКподстановке = СтрШаблон(" 30 | |const markdown = '%1'; 31 | |", ТекстОтвета); 32 | СодержимоеHTML = СтрЗаменить(СодержимоеHTML, ТекстКЗамене, ТекстКподстановке); 33 | 34 | РаботаСФайлами.ЗаписатьТекстовыйДокумент(ПутьКФайлуHTML, СодержимоеHTML); 35 | 36 | ЗапуститьПриложение(ПутьКФайлуHTML); 37 | -------------------------------------------------------------------------------- /src/gemini/Классы/Gemini.os: -------------------------------------------------------------------------------- 1 | #Использовать "../../utils" 2 | 3 | // BSLLS:ExportVariables-off 4 | Перем ТокенAPI; 5 | // BSLLS:ExportVariables-on 6 | 7 | Процедура ПриСозданииОбъекта(ЗначениеТокена) 8 | 9 | ТокенAPI = ЗначениеТокена; 10 | 11 | КонецПроцедуры 12 | 13 | Функция АнализироватьКод(Код) Экспорт 14 | 15 | Сообщить("Анализируем код..."); 16 | 17 | Промт = СтрШаблон("Объясни, что делает этот код 1С: %1", Код); 18 | 19 | ПараметрыЗапросаHTTP = НоваяСтруктураПараметровЗапросаHTTP(); 20 | ПараметрыЗапросаHTTP.АдресРесурса = СтрШаблон("/v1beta/models/gemini-1.5-flash:generateContent?key=%1", ТокенAPI); 21 | ПараметрыЗапросаHTTP.HTTPМетод = "POST"; 22 | ПараметрыЗапросаHTTP.Заголовки.Вставить("Content-Type", "application/json"); 23 | ПараметрыЗапросаHTTP.ТелоЗапроса = ТелоЗапросаКGemini(Промт); 24 | 25 | Возврат ВыполнитьЗапросHTTP(ПараметрыЗапросаHTTP); 26 | 27 | КонецФункции 28 | 29 | Функция СформироватьКодПоОписанию(Промт) Экспорт 30 | 31 | Сообщить("Пишем код..."); 32 | 33 | Промт = СтрШаблон("Напиши код 1С по описанию. Никакого другого текста - только код. 34 | |%1", Промт); 35 | 36 | ПараметрыЗапросаHTTP = НоваяСтруктураПараметровЗапросаHTTP(); 37 | ПараметрыЗапросаHTTP.АдресРесурса = СтрШаблон("/v1beta/models/gemini-1.5-flash:generateContent?key=%1", ТокенAPI); 38 | ПараметрыЗапросаHTTP.HTTPМетод = "POST"; 39 | ПараметрыЗапросаHTTP.Заголовки.Вставить("Content-Type", "application/json"); 40 | ПараметрыЗапросаHTTP.ТелоЗапроса = ТелоЗапросаКGemini(Промт); 41 | 42 | Возврат ВыполнитьЗапросHTTP(ПараметрыЗапросаHTTP); 43 | 44 | КонецФункции 45 | 46 | Функция ВыполнитьЗапросHTTP(ПараметрыЗапроса) 47 | 48 | Результат = НоваяСтруктураРезультатаЗапроса(); 49 | 50 | HTTPЗапрос = Новый HTTPЗапрос; 51 | HTTPЗапрос.Заголовки = ПараметрыЗапроса.Заголовки; 52 | HTTPЗапрос.АдресРесурса = ПараметрыЗапроса.АдресРесурса; 53 | HTTPЗапрос.УстановитьТелоИзСтроки(ПараметрыЗапроса.ТелоЗапроса); 54 | 55 | Таймаут = 30; 56 | АдресРесурса = "https://generativelanguage.googleapis.com"; 57 | 58 | HTTPСоединение = Новый HTTPСоединение(АдресРесурса, , , , , Таймаут); 59 | 60 | СтатусУспешно = 200; 61 | 62 | Попытка 63 | HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод(ПараметрыЗапроса.HTTPМетод, HTTPЗапрос); 64 | Если HTTPОтвет.КодСостояния = СтатусУспешно Тогда 65 | JSON = HTTPОтвет.ПолучитьТелоКакСтроку(); 66 | ДанныеОтвета = РаботаСJSON.ЗначениеИзJSON(JSON, Истина); 67 | Результат.Ответ = ИзвлечьТекстИзОтветаGemini(ДанныеОтвета); 68 | Иначе 69 | JSONОшибки = HTTPОтвет.ПолучитьТелоКакСтроку(); 70 | Результат.Ответ = СтрШаблон("Произошла ошибка: %1", JSONОшибки); 71 | КонецЕсли; 72 | Исключение 73 | Результат.ТекстОшибки = СтрШаблон("Произошла ошибка: %1", ОписаниеОшибки()); 74 | КонецПопытки; 75 | 76 | Возврат Результат; 77 | 78 | КонецФункции 79 | 80 | Функция ТелоЗапросаКGemini(ТекстЗапроса) 81 | 82 | СтруктураЗапроса = Новый Структура("text", ТекстЗапроса); 83 | 84 | СписокСоставных = Новый Массив; 85 | СписокСоставных.Добавить(СтруктураЗапроса); 86 | 87 | Контент = Новый Структура("parts", СписокСоставных); 88 | 89 | СписокКонтента = Новый Массив; 90 | СписокКонтента.добавить(Контент); 91 | 92 | ДанныеЗапроса = Новый Структура("contents", СписокКонтента); 93 | 94 | Возврат РаботаСJSON.JSONИзЗначения(ДанныеЗапроса); 95 | 96 | КонецФункции 97 | 98 | Функция ИзвлечьТекстИзОтветаGemini(ДанныеОтвета) 99 | 100 | Возврат ДанныеОтвета["candidates"][0]["content"]["parts"][0]["text"]; 101 | 102 | КонецФункции 103 | 104 | Функция НоваяСтруктураПараметровЗапросаHTTP() 105 | 106 | ПараметровЗапросаHTTP = Новый Структура; 107 | ПараметровЗапросаHTTP.Вставить("АдресРесурса", ""); 108 | ПараметровЗапросаHTTP.Вставить("HTTPМетод", "GET"); 109 | ПараметровЗапросаHTTP.Вставить("Заголовки", Новый Соответствие); 110 | ПараметровЗапросаHTTP.Вставить("ТелоЗапроса", ""); 111 | 112 | Возврат ПараметровЗапросаHTTP; 113 | 114 | КонецФункции 115 | 116 | Функция НоваяСтруктураРезультатаЗапроса() 117 | 118 | Результат = Новый Структура; 119 | Результат.Вставить("Ответ", ""); 120 | Результат.Вставить("ТекстОшибки", ""); 121 | 122 | Возврат Результат; 123 | 124 | КонецФункции --------------------------------------------------------------------------------