Чего не хватает в 1С:Предприятие 8.3 и как решаются основные ограничения платформы?

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

Разработка на платформе 1С:Предприятие часто вызывает двоякие чувства у специалистов, имеющих опыт работы с языками программирования общего назначения (C++, C#, Java). С одной стороны, мы имеем высокую скорость разработки бизнес-логики, с другой — сталкиваемся с «закрытостью» системы. В этой статье мы подробно проанализируем основные претензии сообщества к платформе и разберем, какие из этих «болей» уже закрыты в последних версиях 1С (8.3.24, 8.3.25), а что до сих пор требует «костылей» или обходных путей.

Ограничения языка запросов: Оконные функции и временные таблицы

Долгое время программисты 1С завидовали коллегам, работающим напрямую с SQL, из-за отсутствия оконных функций. Это заставляло нас писать громоздкие запросы с множественными соединениями и использованием временных таблиц там, где в стандартном SQL достаточно одной строки кода. Рассмотрим подробнее, что изменилось с выходом последних обновлений.

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

  1. Конструкция OVER: Позволяет определить «окно» данных, над которым будет выполнена агрегатная функция.
  2. PARTITION BY: Группировка данных внутри окна без схлопывания строк (в отличие от обычного СГРУППИРОВАТЬ ПО).
  3. ORDER BY внутри окна: Определение порядка расчета, что критично для функций типа SUM (нарастающий итог) или ROW_NUMBER.

Еще одна давняя проблема — невозможность модификации временных таблиц. Раньше мы могли только создать временную таблицу один раз на основе результата запроса. В версии 8.3.25 реализована возможность ВСТАВИТЬ В (аналог SQL-оператора INSERT INTO). Теперь мы можем дополнять уже существующую временную таблицу новыми данными в процессе работы одного пакета запросов, что значительно оптимизирует алгоритмы со сложной предварительной подготовкой данных.

Проблема рекурсивных запросов и иерархий

Несмотря на прогресс, рекурсивные запросы (Common Table Expressions — CTE) во встроенном языке 1С до сих пор отсутствуют. Проанализируем ситуацию: как нам обходить деревья иерархии (например, спецификации номенклатуры или подчиненность подразделений)?

На данный момент мы вынуждены использовать один из трех подходов:

  1. Итерационный цикл в коде: Выполняем запрос на один уровень вниз, выгружаем в таблицу значений, и повторяем, пока есть данные. Это медленно и создает лишнюю нагрузку на сервер.
  2. Механизмы СКД: Система компоновки данных умеет работать с иерархией «из коробки», но это применимо только в рамках отчетов или программного вызова компоновщика.
  3. Использование дополнительных свойств: Хранение «полного пути» или «левого и правого ключа» (Nested Sets) в справочниках, что требует сложной логики при записи объектов.

Многопоточность и модель вычислений

Программисты часто сравнивают 1С с языком Go, отмечая нехватку легких потоков (goroutines). В 1С параллелизм реализован через ФоновыеЗадания. Выясним причину, почему это не всегда удобно: каждое фоновое задание — это отдельный сеанс, требующий инициализации параметров сеанса, повторного чтения некоторых данных и потребляющий значительный объем оперативной памяти на сервере.

Тем не менее, платформа активно движется в сторону асинхронности. Введены механизмы Обещания (Promises) и асинхронные методы (НачатьПомещениеФайла, Ждать), которые позволяют не блокировать интерфейс пользователя. Посмотрим на пример логики работы с файлом в современном стиле:


// Пример использования асинхронности для работы с файлами
&НаКлиенте
Асинхрон Процедура ЗагрузитьФайл()
    Описание = Новый ОписаниеПередаваемогоФайла("C:\temp\data.txt");
    Результат = Ждать ПоместитьФайлНаСерверАсинхрон(Описание);
    Если Результат.ФайлПомещен Тогда
        // Продолжаем логику обработки
    КонецЕсли;
КонецПроцедуры

Однако полноценной «общей памяти» между потоками внутри одного сеанса всё еще нет, что обусловлено архитектурой клиент-серверного взаимодействия 1С и необходимостью обеспечения целостности данных.

Разработка и DevOps: Интеграция с Git и EDT

Одной из самых острых тем обсуждения является «закрытость» Конфигуратора. Профессиональные команды давно переросли стандартный поиск по коду и отсутствие контроля версий. Решением от фирмы 1С стала среда 1C:Enterprise Development Tools (EDT), базирующаяся на Eclipse.

Разберем основные преимущества перехода на EDT для крупной разработки:

Для тех, кто остается в классическом Конфигураторе, в версии 8.3.25 были сделаны важные шаги по юзабилити: глобальный поиск стал фоновым. Это значит, что при поиске строки по всей конфигурации интерфейс больше не «замирает», и разработчик может продолжать анализ кода в других окнах.

Интерфейс и расширяемость: HTML и Расширения

Многие жалуются на ограниченность форм 1С. Действительно, стандартный набор элементов управления (кнопки, таблицы, поля ввода) жестко задан платформой. Но и здесь есть выход. Рассмотрим подробнее использование ПолеHTMLДокумента.

Современная 1С позволяет встраивать внутрь форм полноценный HTML5 и JavaScript. Это открывает возможности для создания:

Взаимодействие между кодом 1С и JavaScript внутри формы происходит через событие ПриНажатии или через асинхронные вызовы JS-функций из встроенного языка 1С. Это снимает практически любые ограничения на визуальное представление данных.

Также нельзя забывать про Систему расширений. Если раньше расширения воспринимались как временные «патчи», то сегодня это мощный инструмент архитектора. Мы можем добавлять новые справочники, документы и регистры в расширение, не снимая основную конфигурацию с поддержки. Это позволяет сохранять типовые решения чистыми, что критически важно для регулярных обновлений.

Чего всё еще не хватает?

Проанализировав дискуссию и текущее состояние платформы, можно выделить три направления, которые остаются слабыми местами 1С:

  1. Нативный менеджер пакетов: В 1С до сих пор нет официального аналога NuGet или npm. Обмен кодом между проектами часто происходит через ручное копирование модулей или использование сторонних неофициальных инструментов (например, пакетов из сообщества разработчиков).
  2. Строгая типизация: Встроенный язык 1С остается динамически типизированным. Это упрощает порог входа, но усложняет поддержку огромных систем, где ошибку «Поле объекта не обнаружено» программист видит только в рантайме (во время выполнения).
  3. Доступ к СУБД: Прямой доступ к SQL-таблицам по-прежнему запрещен. Это цена, которую мы платим за универсальность (код работает одинаково на MS SQL, PostgreSQL и Oracle), но это лишает нас возможности использовать всю мощь хранимых процедур и специфических функций конкретных СУБД.

Подведем итог: Платформа 1С 8.3 сегодня — это уже не та «ложка для копания траншей», о которой писали 10 лет назад. Внедрение оконных функций, развитие EDT и асинхронности приближает её к промышленным стандартам. Однако разработчику по-прежнему важно понимать специфику экосистемы и использовать современные инструменты (EDT, расширения, асинхронность), чтобы не чувствовать себя ограниченным в возможностях.

← На главную