Разработка на платформе 1С 7.7 в современных условиях часто требует использования внешних компонентов для ускорения работы с данными. Одной из самых мощных и популярных библиотек является 1SQlite. С выходом версии 3.36 (и промежуточных сборок от Djelf) пользователи получили доступ к ряду важных обновлений, которые значительно расширяют возможности штатного SQL-движка внутри «семерки».
В этой статье мы подробно разберем, какие математические функции стали доступны «из коробки», выясним, почему возникла путаница с названиями сборок, и проанализируем технические нюансы типизации объектов 1С в SQL-запросах.
Одной из главных новостей стало включение в состав компоненты полноценной математической библиотеки. Ранее в 1SQlite для выполнения сложных вычислений (например, тригонометрии или извлечения корня) приходилось либо подключать дополнительные расширения, либо выгружать данные в 1С и обрабатывать их перебором, что негативно сказывалось на производительности.
В версиях с суффиксом math (в обсуждениях часто ошибочно упоминается как match) стали доступны следующие стандартные функции SQLite:
sin(), cos(), tan(), asin(), acos(), atan().exp(), log(), log10(), power().sqrt(), ceil(), floor().Рассмотрим пример использования этих функций непосредственно в тексте запроса. Предположим, нам нужно вычислить квадратный корень из остатка товара для неких статистических расчетов:
ТекстЗапроса = "
|SELECT
| Товар as [Товар :Справочник.Номенклатура],
| Остаток,
| sqrt(Остаток) as КореньОстатка,
| power(Остаток, 2) as КвадратОстатка
|FROM ВнешняяТаблицаОстатков
|";
Проанализируем ситуацию: использование таких функций внутри SQLite позволяет перенести тяжелые расчеты на уровень движка базы данных, возвращая в 1С уже готовый результат.
Обновление компоненты до версии 3.36 принесло с собой возможности самого движка SQLite, которые крайне полезны при работе с временными таблицами и индексами в 1С 7.7.
1. Конструкция RETURNING. Это одно из самых ожидаемых нововведений. Теперь при выполнении операций INSERT, UPDATE или DELETE мы можем сразу получить измененные данные без выполнения повторного SELECT. Разберем на примере обновления цен:
UPDATE ЦеныСправочника
SET Цена = Цена * 1.1
WHERE Категория = 'Опт'
RETURNING ID, Цена;
Этот запрос не просто обновит данные, но и вернет таблицу с идентификаторами строк и их новыми значениями. Это значительно упрощает логику синхронизации данных.
2. Удаление колонок (DROP COLUMN). В предыдущих версиях SQLite удаление колонки из таблицы требовало ее полного пересоздания. Начиная с версии 3.35, стала доступна стандартная команда:
ALTER TABLE ВременнаяТаблица DROP COLUMN ЛишнееПоле;
3. Оптимизация обобщенных табличных выражений (CTE). Работа со сложными иерархическими запросами стала быстрее благодаря улучшенному планировщику, который лучше обрабатывает рекурсивные вызовы и материализацию запросов.
Часто программисты сталкиваются с ошибкой: Неправильная типизация в колонке: ВидСпр:ВидСправочника. Это происходит при попытке типизировать пустую строку или результат функции как метаданные 1С. Выясним причину этой ошибки на примере кода, вызвавшего затруднение:
-- Код, вызывающий ошибку
SELECT '' as [ВидСпр :ВидСправочника]
-- Код, который работает корректно
SELECT '' as [ВидДок :ВидДокумента]
Разберем, почему так происходит. Компонента 1SQlite использует «мягкую» типизацию, сопоставляя алиас в квадратных скобках с метаданными загруженной конфигурации. Ошибка типизации ВидСправочника часто связана с несколькими факторами:
ВидДокумента, который в определенных контекстах может определяться более однозначно, ВидСправочника требует четкого понимания, к какому именно справочнику относится поле, если мы пытаемся получить объект.[ВидСпр :ВидСправочника]. Наличие пробела перед двоеточием или после него может сбить парсер 1SQlite в некоторых версиях. Попробуйте использовать формат [ВидСпр:ВидСправочника].'' компонента не может сопоставить «ничего» с конкретным типом справочника.Для корректной передачи пустого значения справочника или документа рекомендуется использовать либо штатные средства получения пустого ID (EmptyID), либо типизировать колонку более явно, указывая конкретный вид справочника, если это возможно:
-- Более надежный вариант типизации
SELECT Спр.ID as [Элемент :Справочник.Номенклатура]
FROM ...
Посмотрим на общие рекомендации по работе с обновленной компонентой:
Объект.Version. Для использования математических функций убедитесь, что в строке версии присутствует упоминание о подключенных модулях.MATCH в SQLite предназначен для полнотекстового поиска (FTS), а не для регулярных выражений. Если вам нужны регулярные выражения (Regexp), их необходимо подключать как отдельное расширение, при этом стоит помнить, что стандартные реализации часто плохо работают с кириллицей без дополнительных манипуляций с кодировками.Подводя итог, можно сказать, что версия 3.36 является мощным инструментом в руках разработчика 1С 7.7. Она не только ускоряет вычисления за счет встроенной математики, но и приближает синтаксис работы с данными к современным стандартам SQL, делая код более читаемым и эффективным.