Смотрел я на запросы в 1С, потом смотрел на то как народ создаёт библиотеки с API в "текучем" стиле. И решил это совместить. Ведь есть же такой замечательный продукт от Microsoft - Linq! Сначала подумал что буду первопроходцем. Но оказывается всё уже придумано до нас: Раз, Два. Может быть ещё что есть, а я не нашел.
Библиотека позволяет писать запросы 1С Предприятия в функциональном стиле. Например, вот такой код:
ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура").ВТаблицуЗначений();
будет аналогичен:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
ТаблицаЗначений = Запрос.Выполнить().Выгрузить();
- уменьшение количества кода при той же читабельности / наглядности;
- избавление от уродских конструкций типа:
Запрос.ТекстЗапроса = СтрЗаменить(Запрос.ТекстЗапроса, "&Условие", "Номенклатура.ЭтоГруппа = ЛОЖЬ");
- излишне многословны;
- не готовы к применению в рабочих конфигурациях;
- не соответствуют стандартам разработки;
- статья на инфостарте так и осталась лишь статьёй, не вылившись в какую-то готовую разработку;
- отсутствует автодополнение кода;
- не полная функциональность (разработка пока в статусе 'beta')
Сначала я был полон энтузиазма. Потом, по мере написания кода, начали появляться сомнения. Нужно ли это? Верной ли дорогой иду? Но когда я увидел как вот это:
Функция ТаблицаАдресныхСокращений(НаименованияАдресныхОбъектов)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| УровниСокращенийАдресныхСведений.Значение КАК Наименование,
| УровниСокращенийАдресныхСведений.Сокращение КАК Сокращение
|ИЗ
| РегистрСведений.УровниСокращенийАдресныхСведений КАК УровниСокращенийАдресныхСведений
|ГДЕ
| &Условие
|
|СГРУППИРОВАТЬ ПО
| УровниСокращенийАдресныхСведений.Значение,
| УровниСокращенийАдресныхСведений.Сокращение
|
|УПОРЯДОЧИТЬ ПО
| Наименование";
Если ТипЗнч(НаименованияАдресныхОбъектов) = Тип("Массив") И НаименованияАдресныхОбъектов.Количество() > 0 Тогда
Условие = "ИСТИНА";
Иначе
Условие = "УровниСокращенийАдресныхСведений.Значение В(&АдресныеСокращения)";
Запрос.УстановитьПараметр("АдресныеСокращения", НаименованияАдресныхОбъектов);
КонецЕсли;
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", Условие);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
превратилось вот в это:
Функция ТаблицаАдресныхСокращений(НаименованияАдресныхОбъектов)
Запрос = СЗ_Запрос.НовыйЗапрос("РегистрСведений.УровниСокращенийАдресныхСведений")
.Выбрать("Значение КАК Наименование, Сокращение")
.Сгруппировать("Значение, Сокращение")
.Упорядочить("Наименование");
Если ТипЗнч(НаименованияАдресныхОбъектов) = Тип("Массив") И НаименованияАдресныхОбъектов.Количество() > 0 Тогда
Запрос = Запрос
.Где(СЗ_Запрос.Предикат()
.Реквизит("Значение").В(НаименованияАдресныхОбъектов));
КонецЕсли;
Возврат Запрос.ВТаблицуЗначений();
КонецФункции
все сомнения отпали! 16 строк вместо 30-ти при сохранении общей читабельности. И качество кода улучшилось за счет отказа от конструкции СтрЗаменить()
.
По-моему это заявка на успех!
Пока отсутствует. Работа ведётся.
- Вариант 1: скачать файл с расширением cf из раздела Releases и объединить со своей конфигурацией;
- Вариант 2: скачать файл с расширением cfe из раздела Releases и установить это расширение в свою базу данных;
- Вариант 3: скачать исходники из репозитория, собрать при помощи команды
npm run build
(потребуется установленная NodeJS) и использовать результаты сборки по своему усмотрению;
Тесты писались при помощи расширения для запуска тестов YAxUnit. И выполнялись на типовой конфигурации Управление торговлей ред.11.5 (11.5.18.41). Это надо учитывать при самостоятельном запуске тестов.
- создание документации;
- расширение API методов:
- вложенные запросы;
- пакетные запросы;
- временные таблицы;
- индексирование;
- увеличение полноты покрытия тестами;
- обработка-конструктор, которая преобразует обычный запрос 1С в "текучие" выражения и обратно;
- вариант библиотеки для OneScript. Пока не понятно, возможно ли и нужно ли? Идея на этапе исследования;
- CI/CD
- YAxUnit - ребята, вы лучшие!
- 1CFilesConverter - давно пользуюсь этими скриптами. Очень помогают.