Сообщество разработчиков 1С постоянно формирует запросы к платформе, стремясь сделать процесс разработки более гибким, быстрым и соответствующим мировым стандартам программирования. В этой статье мы подробно разберем ключевые технические аспекты, которые обсуждаются специалистами: реализацию сложных агрегатов в запросах, вопросы производительности типов данных, работу с внешними файлами и внедрение современных практик разработки, таких как асинхронность и версионирование кода.
Один из часто возникающих вопросов — возможность получения агрегатов (максимум, минимум, количество, сумма) напрямую из регистров сведений, подобных тем, что реализованы в регистрах накопления. Проанализируем ситуацию: регистр накопления жестко привязан к регистратору и ориентирован на хранение итогов. Регистр сведений же зачастую используется для хранения состояний, не всегда имеющих логическую привязку к документу-регистратору.
Если ваша задача требует частого получения сумм или остатков, рассмотрим рекомендацию: используйте РегистрНакопления. Платформа оптимизирована для инкрементального обновления итогов именно в этом объекте. Однако, если данные загружаются из внешних источников (например, файлы объемом 100 млн записей) и не меняются, использование регистра сведений оправдано его структурой. В этом случае агрегаты вычисляются на лету с помощью языка запросов.
Многие разработчики сталкиваются с трудностями при попытке наложить условия на агрегатные функции в консоли или конструкторе запросов. Выясним причину: путаница между операторами ГДЕ и ИМЕЮЩИЕ (HAVING). Оператор ГДЕ фильтрует исходные записи до группировки, в то время как ИМЕЮЩИЕ работает уже с результатами агрегатных функций.
Разберем по шагам, как правильно использовать этот механизм в конструкторе и коде:
СУММА(Поле1) > 0. Конструктор автоматически перенесет это условие в секцию ИМЕЮЩИЕ.ИМЕЮЩИЕ можно использовать только те поля, которые участвуют в группировке или являются агрегатами.Пример корректного использования сложных условий в запросе:
ВЫБРАТЬ
Продажи.Контрагент КАК Контрагент,
СУММА(Продажи.СуммаОбороти) КАК ОбщаяСумма,
МАКСИМУМ(Продажи.Цена) КАК МаксимальнаяЦена
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
СГРУППИРОВАТЬ ПО
Продажи.Контрагент
ИМЕЮЩИЕ
СУММА(Продажи.СуммаОбороти) > 1000
ИЛИ МАКСИМУМ(Продажи.Цена) > 500;
Важный момент: конструктор запросов при обратном редактировании может «разворачивать» псевдонимы полей обратно в полные функции, что иногда затрудняет чтение кода, но не влияет на результат выполнения.
Внутренняя реализация платформы 1С во многом опирается на тип данных Variant. Проанализируем производительность: использование нетипизированных переменных дает колоссальную гибкость, но создает накладные расходы на уровне процессора. При каждой операции системе приходится выполнять проверку типа (оператор case на уровне C++).
Результаты технических тестов показывают, что операции с жестко типизированными числами могут быть до 20 раз быстрее, чем с вариантами. В строковых операциях разрыв меньше, так как основное время тратится на выделение памяти (realloc), но при больших итерациях разница становится заметной. Посмотрим на пример логики замера производительности (в псевдокоде низкого уровня):
// Типизированный цикл (условно)
Для i = 1 По 100000000 Цикл
ЧислоА = ЧислоА + 10; // Быстрая операция
КонецЦикла;
// Вариантный цикл
Для i = 1 По 100000000 Цикл
ВариантБ = ВариантБ + 10; // Затраты на определение типа ВариантБ
КонецЦикла;
Для разработчика 1С это означает: в критических по скорости участках кода (сложные расчеты в памяти) старайтесь минимизировать количество преобразований типов и промежуточных вычислений в коллекциях с неявной типизацией.
Платформа 1С совершила качественный скачок в сторону профессиональных инструментов разработки. Рассмотрим подробнее два ключевых направления:
1. Асинхронное программирование. Вместо громоздкой «лапши» из процедур обратного вызова в БСП, современные версии платформы поддерживают конструкцию Асинх/Ждать. Это позволяет писать линейный код для операций, которые фактически выполняются асинхронно (например, выбор файла или открытие окна).
&НаКлиенте
Асинх Процедура ЗагрузитьФайл()
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Результат = Ждать Диалог.ВыбратьАсинх();
Если Результат <> Неопределено Тогда
// Обработка файла
КонецЕсли;
КонецПроцедуры
2. Версионирование кода. Традиционное «Хранилище конфигурации» постепенно уступает место Git. Использование 1С:EDT (Enterprise Development Tools) позволяет полноценно использовать ветвление кода, pull-requests и интеграцию с системами CI/CD. Это решает проблему «заблокированных объектов» и позволяет большим командам работать параллельно над одной задачей.
Долгое время работа с Excel требовала наличия установленного Microsoft Office на сервере или использования сложных COM-объектов. Проанализируем текущие возможности: современные версии платформы нативно поддерживают чтение и запись XLSX. Это позволяет обрабатывать прайсы и отчеты на Linux-серверах и в облачных средах без установки стороннего ПО.
Также в платформу была внедрена поддержка регулярных выражений (объект РегулярноеВыражение). Разберем ситуацию: раньше для сложного поиска в строке приходилось писать многоэтажные условия с Лев(), Прав() и Найти(). Теперь это делается одной строкой паттерна. Это значительно упрощает разбор входящих HTTP-запросов, логов и данных из внешних систем.
Подведем итог: Платформа 1С:Предприятие эволюционирует в сторону открытости и производительности. Понимание внутренних механизмов работы запросов и эффективное использование новых инструментов, таких как EDT и асинхронность, позволяет разработчику создавать решения, которые не только функциональны, но и легко масштабируемы в современных условиях бизнеса.