├── .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 | 
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 | КонецФункции
--------------------------------------------------------------------------------