Писать код руками - моветон
Тренд на low-code и автоматизацию генерации кода захватил экосистему 1С. Но за красивой обёрткой «не пиши руками» скрывается ловушка: слепое доверие генераторам и конструкторам часто приводит к неоптимальным решениям, которые невозможно поддерживать. Рассматриваем, когда ручной код остаётся единственно верным выбором, а когда его использование — действительно моветон.
Контекст и ситуация
Современные инструменты — EDT, конструкторы запросов, автогенерация форм, шаблоны БСП — обещают разработчику освобождение от рутины. Однако на практике мы наблюдаем обратную сторону: сгенерированный код часто содержит избыточные вызовы, не учитывает специфику бизнес-логики и, что самое опасное, маскирует ошибки, которые проявляются только при нагрузке или обновлении платформы.
Ключевой тезис: «Писать код руками — моветон» — это не про отказ от автоматизации, а про осознанный выбор инструмента под задачу. Бездумное использование генераторов — такой же моветон, как и написание всего с нуля.
Опытный специалист 1С должен понимать, где проходит граница между эффективной автоматизацией и вредным упрощением. Рассмотрим три типовые ситуации, в которых ручной код не просто оправдан, а необходим.
Ловушка №1: Генерация запросов — скрытые блокировки и неоптимальные планы
Когда конструктор запроса врёт
Конструктор запроса в конфигураторе или EDT генерирует синтаксически корректный текст, но часто не учитывает особенности индексов и статистики. Например, при соединении таблиц через ЛЕВОЕ СОЕДИНЕНИЕ с условием в ГДЕ конструктор может создать неявное преобразование типов, которое приводит к полному сканированию таблицы.
// Пример: ручной код с явным приведением типов
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Ссылка КАК Товар,
| Остатки.КоличествоОстаток КАК Остаток
|ИЗ
| Справочник.Товары КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(,
| &Дата, Товары.Ссылка = Остатки.Товар) КАК Остатки
| ПО Товары.Ссылка = Остатки.Товар
|ГДЕ
| Товары.ЭтоГруппа = ЛОЖЬ
| И Товары.Ссылка В (&СписокТоваров)";
Запрос.УстановитьПараметр("Дата", ТекущаяДата());
Запрос.УстановитьПараметр("СписокТоваров", МассивТоваров);
Результат = Запрос.Выполнить();
Конструктор часто генерирует ВЫРАЗИТЬ(Товары.Ссылка КАК Справочник.Товары) в условиях соединения, если типы не совпадают. Ручное управление типами и явное указание индексов (через ИНДЕКСИРОВАТЬ ПО) даёт выигрыш в производительности до 10 раз на больших объёмах.
Предупреждение: Никогда не доверяйте автоматически сгенерированному запросу без анализа плана выполнения. Используйте
Выполнить()с выводом плана черезПолучитьПланЗапроса()(доступно в режиме отладки).
Ловушка №2: Автогенерация форм — потеря контроля над событиями
Когда расширение формы становится «чёрным ящиком»
Современные конфигурации активно используют механизм «СоздатьНаСервере» и автоматическую привязку реквизитов. Однако при ручной доработке формы (например, добавление динамического списка с произвольным запросом) генератор может перезаписать ваши обработчики или создать неочевидные зависимости.
// Пример: ручное управление событием ПриОткрытии
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Ручной код: инициализация параметров, которые не поддерживаются генератором
Параметры.Вставить("РежимПросмотра", Истина);
Если Параметры.Свойство("ДокументОснование") Тогда
Элементы.ДокументОснование.Видимость = Истина;
КонецЕсли;
КонецПроцедуры
Генератор форм часто создаёт пустые обработчики, которые потом «затираются» при обновлении конфигурации. Ручное размещение кода в процедурах с явным указанием &НаКлиенте / &НаСервере и отказ от автосоздания форм (режим «Не создавать автоматически») даёт полный контроль.
Опыт: В одном из проектов автоматически сгенерированная форма документа содержала 12 неиспользуемых реквизитов и 3 пустых обработчика. После ручной чистки производительность открытия выросла на 40%.
Практическое руководство: когда писать руками — норма, а когда — моветон
Чек-лист принятия решения
- Критичная производительность — ручной код обязателен (запросы с временными таблицами, управление блокировками, пакетная обработка).
- Нестандартная бизнес-логика — генераторы не умеют обрабатывать сложные ветвления и исключения.
- Интеграция с внешними системами — HTTP-запросы, работа с файлами, криптография требуют ручного контроля.
- Обновляемость — если вы пишете код в расширении, а не в конфигурации, ручной подход позволяет точнее контролировать совместимость.
Когда генерация оправдана: типовые формы, простые отчёты, стандартные обработки (заполнение табличных частей, печатные формы). Но даже в этих случаях проверяйте сгенерированный код на избыточность.
Типичные ошибки
- Ошибка 1: Использование конструктора движений для регистров без анализа остатков — приводит к дублированию записей.
- Ошибка 2: Автоматическое создание реквизитов формы через «Добавить реквизит» без указания типа — платформа генерирует
ОписаниеТиповс неявнымНеопределено, что вызывает ошибки при проверке. - Ошибка 3: Полная замена типового кода на ручной в механизмах БСП (например, переписывание
ОбщегоНазначения.ПолучитьСтруктуруПечатныхФорм) — при обновлении конфигурации код сломается.
Что делать прямо сейчас
- Проведите аудит существующего кода: найдите места, где используется автоматическая генерация (формы, запросы, обработчики).
- Для каждого такого места оцените, можно ли заменить генерацию на ручной код с явным управлением.
- Внедрите правило: любой сгенерированный код перед сдачей в релиз должен быть проверен на наличие неявных преобразований и избыточных вызовов.
- Используйте профилировщик производительности (замер времени выполнения запросов, открытия форм) для сравнения ручного и автоматического подходов.
Итог: Тренд «не пиши руками» — это не догма, а призыв к осмысленной автоматизации. Опытный разработчик 1С должен уметь в нужный момент отключить генератор и написать код, который будет работать быстрее, надёжнее и легче сопровождаться. Моветон — не ручной код, а отсутствие выбора.
Попробовать НОПик →