Вопрос прямой работы с базой данных SQL из среды 1С 7.7 остается актуальным для задач высокой производительности, интеграции со сторонними системами или расширения функционала штатных механизмов платформы. Стандартные методы работы (через объекты метаданных) не всегда обеспечивают нужную скорость, особенно при массовой вставке данных в сторонние таблицы. В этой статье мы разберем основные способы реализации прямой записи, проанализируем необходимые инструменты и выясним технические нюансы, которые помогут избежать порчи данных.
Наиболее мощным и проверенным инструментом для прямой работы с SQL в среде 1С 7.7 является внешняя компонента 1С++. Она предоставляет объектную модель для выполнения произвольных SQL-запросов. Рассмотрим подробнее работу с основным классом для этих задач — ODBCRecordset.
Для начала работы нам необходимо загрузить компоненту и создать объект. Разберем по шагам пример записи данных в произвольную таблицу:
// Загрузка компоненты
Если ЗагрузитьВнешнююКомпоненту("1cpp.dll") = 0 Тогда
Сообщить("Компонента 1С++ не найдена!");
Возврат;
КонецЕсли;
// Создание объекта для работы с запросами
ЗапросSQL = СоздатьОбъект("ODBCRecordset");
// Подготовка текста SQL-запроса для вставки данных
// Допустим, у нас есть собственная таблица MyCustomTable с полями ItemName и Quantity
ТекстЗапроса = "
|INSERT INTO MyCustomTable (ItemName, Quantity)
|VALUES ('Тестовый товар', 100)
|";
// Выполнение команды записи
Попытка
ЗапросSQL.Выполнить(ТекстЗапроса);
Сообщить("Запись успешно добавлена!");
Исключение
Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;
Проанализируем этот код: метод Выполнить() отправляет команду напрямую серверу SQL. В отличие от штатных средств, здесь не происходит проверки бизнес-логики 1С, поэтому мы должны быть уверены в корректности передаваемых данных. Если требуется вставить значения из переменных 1С, рекомендуется использовать типизированные параметры, чтобы избежать SQL-инъекций и проблем с форматами.
Если по каким-то причинам вы не можете использовать сторонние компоненты, можно воспользоваться стандартными средствами Windows — объектами ADO. Этот метод универсален и позволяет подключаться не только к текущей базе 1С, но и к любым другим базам SQL (MS SQL, MySQL, PostgreSQL и др.).
Рассмотрим пример реализации подключения и записи через COM-объекты:
// Создание соединения
Connection = СоздатьОбъект("ADODB.Connection");
Connection.ConnectionString = "Provider=SQLOLEDB;Data Source=ServerName;Initial Catalog=BaseName;User ID=sa;Password=your_password;";
Попытка
Connection.Open();
Исключение
Сообщить("Не удалось подключиться к SQL серверу!");
Возврат;
КонецПопытки;
// Выполнение команды записи
CommandText = "INSERT INTO MyTable (Field1, Field2) VALUES ('Значение1', 500)";
Попытка
Connection.Execute(CommandText);
Сообщить("Данные успешно записаны через ADO");
Исключение
Сообщить("Ошибка выполнения запроса!");
КонецПопытки;
Connection.Close();
В данном случае мы используем ADODB.Connection. Важным моментом здесь является ConnectionString. Выясним причину, почему это удобно: вы можете записывать данные в "соседнюю" базу данных, например, для обмена информацией между 1С и сайтом или производственной системой, не создавая промежуточных файлов.
Если ваша задача — прямая запись в справочники или документы самой 1С 7.7 (таблицы SC*** или DH***/DT***), нужно быть крайне осторожными. Платформа 7.7 имеет специфическую структуру, которую необходимо соблюдать:
YYYYMMDD или в специальном типе datetime, но всегда требуют приведения к стандарту. Посмотрим на пример: дата "15 мая 2023 года" должна превратиться в '20230515'.NOT NULL. Это значит, что при вставке (INSERT) вы обязаны перечислить все поля таблицы и заполнить их хотя бы значениями по умолчанию (пустые строки, нули), иначе SQL вернет ошибку.Разберем пример формирования идентификатора (ID). Обычно для генерации нового ID в 1С++ используют метод УстановитьНовыйID() или обращаются к системной таблице _1SSYSTEM, чтобы получить и инкрементировать текущий счетчик объектов. Помните: несанкционированная запись в таблицы 1С может привести к нарушению ссылочной целостности.
Проанализируем ситуацию, когда в таблице SQL поле имеет составной тип (в конфигураторе — "Неопределенный"). В базе данных такое поле превращается в несколько колонок:
Field_TYPE — тип данных (справочник, документ и т.д.);Field_IDRREF — идентификатор конкретного объекта.При прямой записи необходимо заполнять обе колонки согласованно. Если вы укажете идентификатор, но не укажете тип, 1С увидит в этом поле "Битый объект".
При выполнении массовой записи крайне важно использовать транзакции. Это обеспечит целостность данных: либо запишутся все строки, либо ни одной, если произойдет сбой. В SQL это реализуется командами BEGIN TRANSACTION, COMMIT и ROLLBACK.
Пример использования транзакции в 1С++:
ЗапросSQL = СоздатьОбъект("ODBCRecordset");
ЗапросSQL.Выполнить("BEGIN TRANSACTION");
Попытка
// Цикл по данным
Для к = 1 По СписокДанных.РазмерСписка() Цикл
Текст = "INSERT INTO MyTable ...";
ЗапросSQL.Выполнить(Текст);
КонецЦикла;
ЗапросSQL.Выполнить("COMMIT");
Сообщить("Все данные успешно сохранены");
Исключение
ЗапросSQL.Выполнить("ROLLBACK");
Сообщить("Произошла ошибка, изменения отменены: " + ОписаниеОшибки());
КонецПопытки;
Важный момент: Прямая запись через SQL не вызывает обработчики событий 1С, такие как ПриЗаписи() или ПредопределенныеПроцедуры. Все проверки на заполненность реквизитов, уникальность номеров и логические условия вам придется реализовать самостоятельно в коде SQL или 1С перед выполнением запроса.
Подведем итог: прямая запись в SQL — это мощный инструмент, который требует от программиста четкого понимания структуры базы данных. Для работы внутри одной базы оптимальным выбором будет 1С++ с классом ODBCRecordset, а для внешних интеграций отлично подойдет ADO.