1C_Bases/Main_v3.py

269 lines
15 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import os
import tkinter as tk
from tkinter import messagebox
import pyodbc
import uuid
print("""
....:::::::::
::::::::::-----::::::
::::------------=--------::..
:::--=--============---==+===-:::.
::---========++=++++======+++++==--:.:
:--==++++++++++++++++++========---==-::.
--==++++++++++++++++++++=====---:::-==--::
:-==+**++++++++++++++++++====------::-==-::
-==+**++++++++++++++++++++=====--------=-::
-=++*++++++++++++++++++++++=========-----::
-=+++++++++++++++++++++++++===========----:
:=++++++++++++++++++++++++++==========---::
-=++++++++++++++++++===+++++===-----====--
-=++++++++++++++++++++==+++++=====-----==-
-++++++++++++++++++++++++++++++++====-----
==+++++++*#####*******++++++++++++++++=--=
+===++++++****##%%%%##*****++++**###%##*+==-
+*++=++++****#%##%@%%%%###***++*#%%%%%###*===-
+*++=++++**####*#%@%#%%%##**++*#%%%@@%+*%%*+=-
*++=+++++**+****####%%##*++==+#%%#%%#+++*+==-
+*+++++++++++****###****++=====*####*++=====-
+*=+++++++++++++++++++++++=======+**++=-----
+*=+++++++++++++++++***++++==-=====+++==----
++=+++++++++++++++*****+++==---===========--
+=+++++++++++++*****+++++===---++======--=-
==++++++++++**********+++++==--+++++=====-
-==+++++++++*********##*******==++++++===-
-==++++++++*****#**##*####**+====++++++==
#%%%%%===+++++++++***##*****####**++++++==+++=-
*+*#%%%#*+====++++++++**#%%%##****##********+====-
++++++*##%@%#+++**====+++++++*##############***###*+====-
++******###%%@@@@@%####*+=+==+++++**************+++++=+*++===-
#***+**#*###%@@@@@@@@@@@@@%###*+=+==++++*****++*********++==++++=-=+=+=-
#*#%%%###%%@@@@@@@@@@@@@@@@%###*++++++++**+************+++========*****++==-
%%%######%%####%@@@@@@@@@@@@@@%%**+++++++++++++++***+++=========*###******+++++==
%%@@@@%%%%%%%%%#%%@@@@@@@@@@@@@@%#**+*+**++++++++++++++++=====+%###########***++++*
%@@@@@@@@@%%@@%%%%%%%@@@@@@@@@@@@@@###*****++++++*+++++++===+**#%####%###%####***+***
%%%@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@%####**++++***++++*#####*%##%####%#%%%%##*******
%%%%@%@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@%%%%%%##%%%@%%####*%%#%####%#%%%%%#########
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%##%#*#%#%####%##%%%%%%###%#%##
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%#%%###%######%##%#%%%%%%%%%%%##
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%####%%#####%##%%%%%%%%%%%%%###
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%####%%#%%##%#%%%%%%%%%%@%@%###
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%#####%%%#%%%%#%%%%%%%@@@@@@@%%##
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%#%%%%##%%#%%%%%%%%%%%%@@@@@@@%%#**
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%@@@%####%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@@@@@@%%%#**
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%@@@@%%%%%%%#%%%%%%%##%%%%%%%%%%%%%%%%%@@@@@@%%%%##**
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%@@@@%%@@@@@@@%%%%%%##%%%%%%%###%%%%%%%%%%%%%%%%%@@%%%%%%%%##*+
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%@@@@@@@@%%%%@@@@@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%###%%*#
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@@@@@%@@@%@@@@@@@%%%@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@%%%%
""")
class RemoteFolderSelector(tk.Tk):
def __init__(self):
super().__init__()
self.title("Remote Folder and SQL Database Selector")
self.geometry("600x400")
# Создадим фреймы для лучшей компоновки элементов
self.frame_left = tk.Frame(self)
self.frame_left.grid(row=0, column=0, padx=10, pady=10, sticky="nsew")
self.frame_right = tk.Frame(self)
self.frame_right.grid(row=0, column=1, padx=10, pady=10, sticky="nsew")
# Сделаем окна масштабируемыми
self.grid_columnconfigure(0, weight=1)
self.grid_columnconfigure(1, weight=1)
self.grid_rowconfigure(0, weight=1)
# Переменные для выбора пользователя и базы данных
self.selected_user = None
self.base_name = None
self.server_name = None
self.ip_address = None
# Поле ввода IP-адреса
self.ip_label = tk.Label(self.frame_left, text="Enter IP (optional):")
self.ip_label.grid(row=0, column=0, padx=5, pady=5, sticky="w")
self.ip_entry = tk.Entry(self.frame_left, width=30)
self.ip_entry.grid(row=1, column=0, padx=5, pady=5, sticky="w")
self.connect_button = tk.Button(self.frame_left, text="Load Users", command=self.load_users)
self.connect_button.grid(row=2, column=0, padx=5, pady=5)
# Список пользователей
self.folder_listbox = tk.Listbox(self.frame_left, width=30, height=10)
self.folder_listbox.grid(row=3, column=0, padx=5, pady=5)
self.folder_listbox.bind("<Double-Button-1>", self.select_user)
# Поля для ввода данных SQL
self.server_label = tk.Label(self.frame_right, text="SQL Server:")
self.server_label.grid(row=0, column=0, padx=5, pady=5, sticky="w")
self.server_entry = tk.Entry(self.frame_right, width=30)
self.server_entry.grid(row=1, column=0, padx=5, pady=5, sticky="w")
self.server_entry.insert(0, "SERVERSQL")
self.login_label = tk.Label(self.frame_right, text="SQL Login:")
self.login_label.grid(row=2, column=0, padx=5, pady=5, sticky="w")
self.login_entry = tk.Entry(self.frame_right, width=30)
self.login_entry.grid(row=3, column=0, padx=5, pady=5, sticky="w")
self.login_entry.insert(0, "sa")
self.password_label = tk.Label(self.frame_right, text="SQL Password:")
self.password_label.grid(row=4, column=0, padx=5, pady=5, sticky="w")
self.password_entry = tk.Entry(self.frame_right, show="*", width=30)
self.password_entry.grid(row=5, column=0, padx=5, pady=5, sticky="w")
self.sql_button = tk.Button(self.frame_right, text="Load Databases", command=self.load_databases)
self.sql_button.grid(row=6, column=0, padx=5, pady=5)
# Список баз данных
self.db_listbox = tk.Listbox(self.frame_right, width=30, height=10)
self.db_listbox.grid(row=7, column=0, padx=5, pady=5)
self.db_listbox.bind("<Double-Button-1>", self.select_database)
# Кнопка добавления базы
self.add_button = tk.Button(self.frame_left, text="Add to ibases.v8i", command=self.add_database_to_ibases)
self.add_button.grid(row=4, column=0, padx=5, pady=5)
# Загрузка пользователей с локального компьютера по умолчанию
self.load_users()
def load_users(self):
"""Загружаем пользователей с указанного IP-адреса или локального ПК."""
self.ip_address = self.ip_entry.get()
if not self.ip_address: # Если IP не указан, используем локальный ПК
local_path = r"C:\Users"
self.load_local_users(local_path)
else:
try:
# Используем указанный IP для подключения к удалённому ПК
remote_path = f"\\\\{self.ip_address}\\C$\\Users"
self.load_remote_users(remote_path)
except Exception as e:
messagebox.showerror("Error", f"Could not load users: {str(e)}")
def load_local_users(self, path):
"""Загружаем список пользователей с локального ПК."""
try:
folders = os.listdir(path)
self.folder_listbox.delete(0, tk.END)
for folder in folders:
if os.path.isdir(os.path.join(path, folder)):
self.folder_listbox.insert(tk.END, folder)
except Exception as e:
messagebox.showerror("Error", f"Could not load local users: {str(e)}")
def load_remote_users(self, remote_path):
"""Загружаем список пользователей с удалённого ПК."""
try:
folders = os.listdir(remote_path)
self.folder_listbox.delete(0, tk.END)
for folder in folders:
if os.path.isdir(os.path.join(remote_path, folder)):
self.folder_listbox.insert(tk.END, folder)
except Exception as e:
messagebox.showerror("Error", f"Could not load remote users: {str(e)}")
def select_user(self, event):
"""Обработчик двойного клика для выбора пользователя."""
selected_index = self.folder_listbox.curselection()
if selected_index:
self.selected_user = self.folder_listbox.get(selected_index)
messagebox.showinfo("User Selected", f"Selected User: {self.selected_user}")
def load_databases(self):
"""Подключаемся к SQL серверу и загружаем список баз данных."""
server = self.server_entry.get()
login = self.login_entry.get()
password = self.password_entry.get()
try:
connection_string = f"DRIVER={{SQL Server}};SERVER={server};UID={login};PWD={password};"
connection = pyodbc.connect(connection_string)
cursor = connection.cursor()
cursor.execute("SELECT name FROM sys.databases")
databases = cursor.fetchall()
self.db_listbox.delete(0, tk.END)
for db in databases:
self.db_listbox.insert(tk.END, db[0])
cursor.close()
connection.close()
except Exception as e:
messagebox.showerror("Error", f"Could not connect to SQL server: {str(e)}")
def select_database(self, event):
"""Обработчик двойного клика для выбора базы данных."""
selected_index = self.db_listbox.curselection()
if selected_index:
self.base_name = self.db_listbox.get(selected_index)
self.server_name = self.server_entry.get()
messagebox.showinfo("Database Selected", f"Selected Database: {self.base_name}\nServer: {self.server_name}")
def add_database_to_ibases(self):
"""Добавляем выбранную базу в файл ibases.v8i, создавая папки и файл при необходимости."""
if not self.selected_user or not self.base_name or not self.server_name:
messagebox.showerror("Error", "User, database, or server not selected!")
return
try:
# Определяем путь к файлу ibases.v8i в зависимости от локальности
if not self.ip_address:
# Локальный путь
base_path = f"C:\\Users\\{self.selected_user}\\AppData\\Roaming\\1C\\1CEStart"
else:
# Удалённый путь
base_path = f"\\\\{self.ip_address}\\C$\\Users\\{self.selected_user}\\AppData\\Roaming\\1C\\1CEStart"
ibases_path = os.path.join(base_path, "ibases.v8i")
# Проверяем наличие папок, если их нет, создаём
if not os.path.exists(base_path):
os.makedirs(base_path)
messagebox.showinfo("Info", f"Created missing directories: {base_path}")
# Проверяем наличие файла ibases.v8i, если его нет, создаём
if not os.path.exists(ibases_path):
with open(ibases_path, "w", encoding="utf-8") as f:
f.write("") # Создаём пустой файл
messagebox.showinfo("Info", f"Created missing file: {ibases_path}")
# Формируем запись базы
new_base = f"""
[{self.base_name}]
Connect=Srvr="{self.server_name}";Ref="{self.base_name}";
ID={uuid.uuid4()}
OrderInList=255
Folder=/
OrderInTree=16640
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.3
DefaultApp=ThickClient
DisableLocalSpeechToText=0
"""
# Добавляем запись в файл ibases.v8i
with open(ibases_path, "a", encoding="utf-8") as ibases_file:
ibases_file.write(new_base)
messagebox.showinfo("Success", f"Database added to ibases.v8i for user: {self.selected_user}")
except Exception as e:
messagebox.showerror("Error", f"Could not add database to ibases.v8i: {str(e)}")
if __name__ == "__main__":
app = RemoteFolderSelector()
app.mainloop()