Развитие возможностей платформы 1С:Предприятие: от агрегатов в регистрах до современных инструментов разработки

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Сообщество разработчиков 1С постоянно формирует запросы к платформе, стремясь сделать процесс разработки более гибким, быстрым и соответствующим мировым стандартам программирования. В этой статье мы подробно разберем ключевые технические аспекты, которые обсуждаются специалистами: реализацию сложных агрегатов в запросах, вопросы производительности типов данных, работу с внешними файлами и внедрение современных практик разработки, таких как асинхронность и версионирование кода.

Агрегаты и выбор типа регистра: Сведения против Накопления

Один из часто возникающих вопросов — возможность получения агрегатов (максимум, минимум, количество, сумма) напрямую из регистров сведений, подобных тем, что реализованы в регистрах накопления. Проанализируем ситуацию: регистр накопления жестко привязан к регистратору и ориентирован на хранение итогов. Регистр сведений же зачастую используется для хранения состояний, не всегда имеющих логическую привязку к документу-регистратору.

Если ваша задача требует частого получения сумм или остатков, рассмотрим рекомендацию: используйте РегистрНакопления. Платформа оптимизирована для инкрементального обновления итогов именно в этом объекте. Однако, если данные загружаются из внешних источников (например, файлы объемом 100 млн записей) и не меняются, использование регистра сведений оправдано его структурой. В этом случае агрегаты вычисляются на лету с помощью языка запросов.

Мастерство владения языком запросов: работа с оператором ИМЕЮЩИЕ

Многие разработчики сталкиваются с трудностями при попытке наложить условия на агрегатные функции в консоли или конструкторе запросов. Выясним причину: путаница между операторами ГДЕ и ИМЕЮЩИЕ (HAVING). Оператор ГДЕ фильтрует исходные записи до группировки, в то время как ИМЕЮЩИЕ работает уже с результатами агрегатных функций.

Разберем по шагам, как правильно использовать этот механизм в конструкторе и коде:

  1. В конструкторе запросов перейдите на закладку «Условия».
  2. Для фильтрации по сумме или количеству используйте конструкцию вида СУММА(Поле1) > 0. Конструктор автоматически перенесет это условие в секцию ИМЕЮЩИЕ.
  3. Помните, что в ИМЕЮЩИЕ можно использовать только те поля, которые участвуют в группировке или являются агрегатами.

Пример корректного использования сложных условий в запросе:


ВЫБРАТЬ
    Продажи.Контрагент КАК Контрагент,
    СУММА(Продажи.СуммаОбороти) КАК ОбщаяСумма,
    МАКСИМУМ(Продажи.Цена) КАК МаксимальнаяЦена
ИЗ
    РегистрНакопления.Продажи.Обороты КАК Продажи
СГРУППИРОВАТЬ ПО
    Продажи.Контрагент
ИМЕЮЩИЕ
    СУММА(Продажи.СуммаОбороти) > 1000
    ИЛИ МАКСИМУМ(Продажи.Цена) > 500;

Важный момент: конструктор запросов при обратном редактировании может «разворачивать» псевдонимы полей обратно в полные функции, что иногда затрудняет чтение кода, но не влияет на результат выполнения.

Производительность: Типизация против Варианта

Внутренняя реализация платформы 1С во многом опирается на тип данных Variant. Проанализируем производительность: использование нетипизированных переменных дает колоссальную гибкость, но создает накладные расходы на уровне процессора. При каждой операции системе приходится выполнять проверку типа (оператор case на уровне C++).

Результаты технических тестов показывают, что операции с жестко типизированными числами могут быть до 20 раз быстрее, чем с вариантами. В строковых операциях разрыв меньше, так как основное время тратится на выделение памяти (realloc), но при больших итерациях разница становится заметной. Посмотрим на пример логики замера производительности (в псевдокоде низкого уровня):


// Типизированный цикл (условно)
Для i = 1 По 100000000 Цикл
    ЧислоА = ЧислоА + 10; // Быстрая операция
КонецЦикла;

// Вариантный цикл
Для i = 1 По 100000000 Цикл
    ВариантБ = ВариантБ + 10; // Затраты на определение типа ВариантБ
КонецЦикла;

Для разработчика 1С это означает: в критических по скорости участках кода (сложные расчеты в памяти) старайтесь минимизировать количество преобразований типов и промежуточных вычислений в коллекциях с неявной типизацией.

Современный стек: Асинхронность и Git

Платформа 1С совершила качественный скачок в сторону профессиональных инструментов разработки. Рассмотрим подробнее два ключевых направления:

1. Асинхронное программирование. Вместо громоздкой «лапши» из процедур обратного вызова в БСП, современные версии платформы поддерживают конструкцию Асинх/Ждать. Это позволяет писать линейный код для операций, которые фактически выполняются асинхронно (например, выбор файла или открытие окна).


&НаКлиенте
Асинх Процедура ЗагрузитьФайл()
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Результат = Ждать Диалог.ВыбратьАсинх();
    Если Результат <> Неопределено Тогда
        // Обработка файла
    КонецЕсли;
КонецПроцедуры

2. Версионирование кода. Традиционное «Хранилище конфигурации» постепенно уступает место Git. Использование 1С:EDT (Enterprise Development Tools) позволяет полноценно использовать ветвление кода, pull-requests и интеграцию с системами CI/CD. Это решает проблему «заблокированных объектов» и позволяет большим командам работать параллельно над одной задачей.

Работа с внешними данными без «костылей»

Долгое время работа с Excel требовала наличия установленного Microsoft Office на сервере или использования сложных COM-объектов. Проанализируем текущие возможности: современные версии платформы нативно поддерживают чтение и запись XLSX. Это позволяет обрабатывать прайсы и отчеты на Linux-серверах и в облачных средах без установки стороннего ПО.

Также в платформу была внедрена поддержка регулярных выражений (объект РегулярноеВыражение). Разберем ситуацию: раньше для сложного поиска в строке приходилось писать многоэтажные условия с Лев(), Прав() и Найти(). Теперь это делается одной строкой паттерна. Это значительно упрощает разбор входящих HTTP-запросов, логов и данных из внешних систем.

Подведем итог: Платформа 1С:Предприятие эволюционирует в сторону открытости и производительности. Понимание внутренних механизмов работы запросов и эффективное использование новых инструментов, таких как EDT и асинхронность, позволяет разработчику создавать решения, которые не только функциональны, но и легко масштабируемы в современных условиях бизнеса.

← На главную