В среде разработчиков 1С часто возникает вопрос: как минимизировать затраты на лицензирование при создании небольших учетных систем или интерфейсов для работы с внешними данными. Одной из самых амбициозных идей является использование максимально дешевых базовых конфигураций, таких как 1С:Деньги, в качестве программной оболочки (клиента) для работы со сторонними базами данных на SQL. Разберем подробно технические и юридические нюансы такого подхода, опираясь на официальные разъяснения правообладателя и практический опыт реализации гибридных систем.
Ключевым вопросом при реализации подобных «гибридов» является соблюдение Лицензионного соглашения. Проанализируем ответ линии консультаций по лицензированию (lic@1c.ru). Основное требование звучит следующим образом: если на каждом рабочем месте установлена отдельная информационная база 1С:Предприятия с конфигурацией 1С:Деньги, к которой осуществляется монопольный доступ, и при этом на каждом компьютере активирована уникальная лицензия с собственным регистрационным номером, то прямого нарушения лицензионного соглашения нет.
Важно понимать, что в данном случае 1С выступает лишь как среда исполнения кода и визуализации интерфейса. Юридические препятствия отсутствуют до тех пор, пока мы не пытаемся использовать базовую версию для многопользовательской работы в одной файловой базе или не пытаемся обойти механизм защиты программного продукта. Таким образом, использование встроенных инструментов 1С для обращения к сторонним серверам (SQL, Web-сервисы) является легальным способом расширения функционала программы.
Прежде чем приступить к разработке, проанализируем ограничения, накладываемые платформой на базовые версии (в частности, на «1С:Деньги»):
Рассмотрим, как обойти ограничение на изменение конфигурации. Единственный эффективный путь — использование внешних обработок (.epf). Весь прикладной код, формы и логика взаимодействия с SQL должны быть вынесены во внешние файлы. Пользователь запускает стандартную «1С:Деньги», открывает внешнюю обработку, которая и становится основным рабочим интерфейсом.
Рассмотрим схему, при которой 1С отвечает за «красивые картинки» и бизнес-логику на стороне клиента, а MySQL или PostgreSQL — за надежное хранение данных и многопользовательский доступ. Это позволяет создать систему, где данные доступны одновременно и через 1С-клиент, и, например, через веб-сайт на PHP/Python.
Для реализации этой схемы нам необходимо организовать подключение через объект ADODB.Connection. Разберем пример кода для инициализации соединения с внешней базой данных:
&НаКлиенте
Процедура ПодключитьсяКSQL()
// Создаем объект соединения
Соединение = Новый COMОбъект("ADODB.Connection");
// Формируем строку подключения (пример для MySQL)
ConnectionString = "Driver={MySQL ODBC 8.0 Unicode Driver};Server=localhost;Port=3306;Database=my_custom_db;User=admin;Password=strong_pass;Option=3;";
Попытка
Соединение.Open(ConnectionString);
Сообщить("Связь с SQL-сервером установлена успешно!");
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Проанализируем ситуацию с чтением данных. Поскольку базовые версии не поддерживают объект ВнешниеИсточникиДанных, нам придется работать напрямую с наборами записей (Recordset). Выясним причину, почему это может быть медленнее стандартных механизмов 1С: отсутствие встроенного кэширования и необходимость ручного разбора типов данных SQL в типы 1С.
Поскольку мы не можем создавать объекты в метаданных 1С, нам придется эмулировать их структуру в SQL. Рассмотрим пример создания таблицы для хранения документов:
CREATE TABLE doc_orders (
id INT AUTO_INCREMENT PRIMARY KEY,
doc_date DATETIME,
doc_number VARCHAR(20),
client_name VARCHAR(255),
total_amount DECIMAL(15, 2),
posted TINYINT(1) DEFAULT 0
);
В 1С мы создаем управляемую форму внешней обработки, где размещаем таблицу значений. При открытии формы выполняем SQL-запрос SELECT * FROM doc_orders и заполняем таблицу значений 1С. Для обеспечения производительности при больших объемах данных необходимо реализовать пагинацию (постраничный вывод), так как стандартный динамический список 1С не сможет работать напрямую с таким источником.
Самый ответственный этап — имитация «проведения» документа. В классической 1С это запись в регистры. В нашем гибриде мы должны реализовать транзакционную запись в SQL-таблицы остатков. Разберем по шагам алгоритм проведения:
BeginTrans() объекта соединения.SELECT с блокировкой строк).posted = 1).RollbackTrans(), иначе — CommitTrans().Рассмотрим пример кода для записи данных в SQL:
&НаСервереБезКонтекста
Процедура ЗаписатьДанныеВSQL(СтруктураДанных)
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.Open(ПолучитьСтрокуПодключения());
ТекстЗапроса = "INSERT INTO doc_orders (doc_date, doc_number, client_name, total_amount)
|VALUES ('" + Формат(СтруктураДанных.Дата, "ДФ=yyyy-MM-dd") + "',
| '" + СтруктураДанных.Номер + "',
| '" + СтруктураДанных.Клиент + "',
| " + СтрЗаменить(Строка(СтруктураДанных.Сумма), ",", ".") + ")";
Соединение.Execute(ТекстЗапроса);
Соединение.Close();
КонецПроцедуры
Преимущества:
Риски и сложности:
01.01.0001 и NULL в SQL).Использование 1С:Деньги в качестве клиента к сторонней базе данных — это вполне рабочая и, что немаловажно, юридически чистая стратегия для специфических задач автоматизации. Мы проанализировали ситуацию и выяснили, что такая архитектура идеально подходит для создания «переходных» систем, когда бизнес хочет получить преимущества структурированного хранения данных в SQL, сохраняя привычный для многих бухгалтеров и менеджеров интерфейс 1С. Рассмотрим этот путь как создание собственного фреймворка на базе мощной платформы, позволяющего за минимальные деньги получить профессиональный инструмент учета.