Разработка и поддержка крупных конфигураций 1С неизбежно сталкивает нас с проблемой высокой сложности кода. Часто приходится разбираться в чужих (или своих, но давно забытых) механизмах, где логика "размазана" по десяткам модулей, общих модулей, подписок на события и форм. Стек вызовов растет, контекст теряется, и на второй день работы над задачей приходится тратить время на то, чтобы вспомнить, "где я и что здесь происходит".
В этой статье мы подробно разберем методы, лайфхаки и инструменты платформы 1С:Предприятие, которые помогают структурировать хаос, упростить навигацию и ускорить отладку сложных алгоритмов.
Когда мы впервые видим сложный механизм, попытка охватить его целиком может привести к когнитивной перегрузке. Рассмотрим стратегии, которые позволяют эффективно "есть слона по частям".
Фиксация контекста
Самый простой, но эффективный совет — не полагаться на память. Как только стек вызовов становится глубже 3-5 уровней, наш мозг начинает терять детали. Используйте внешние инструменты для фиксации:
Стек вызовов можно выделить все строки (Ctrl+A) и скопировать их в текстовый файл. Это даст вам мгновенный снимок пути, по которому программа пришла в точку остановки.Метод локализации проблемы
Не пытайтесь понять, как работает "весь автомобиль", если сломался бензонасос. Наша задача — как можно быстрее сузить круг поиска.
Платформа 1С предоставляет встроенные средства, которые мы часто игнорируем, но они критически важны при работе с "лапшой" кода.
Закладки (Bookmarks)
Это один из самых недооцененных инструментов. Когда логика прыгает между модулем формы, менеджером объекта и общим модулем, перемещаться через F12 неудобно — теряется нить. Используйте закладки:
Shift + F2.F2 (вперед) и Shift + F2 (назад).Это создает "маршрут" вашей отладки, по которому можно быстро циркулировать без повторного поиска нужных процедур.
Разделение окна редактора
Если процедура подготовки данных находится в начале модуля (или вообще в другом модуле), а обработка результата — в конце, постоянная прокрутка ("скроллинг") утомляет и сбивает фокус. Разделите окно:
Это позволяет видеть одновременно и место вызова функции, и ее тело, или же определение запроса и обработку его выборки.
Замер производительности как карта кода
Инструмент Замер производительности нужен не только для оптимизации скорости. Это отличный способ увидеть, какие именно строки кода были выполнены, а какие условия были пропущены.
Одной из главных причин сложности кода в 1С являются гигантские запросы, занимающие тысячи строк. Разберем подходы к работе с ними.
Проблема "Текст запроса в отдельной функции"
Существует два полярных мнения. С одной стороны, вынос текста запроса в отдельную функцию уменьшает размер основной процедуры (снижает цикломатическую сложность). С другой — это усложняет отладку, так как разработчик не видит текст запроса в месте его выполнения.
Если текст запроса все же вынесен далеко, используйте горячие клавиши:
F12 — перейти к определению функции (получить текст).Ctrl + "-" (минус) — вернуться обратно в точку вызова.Использование областей
Чтобы код оставался читаемым без выноса запроса в отдельные методы, хорошей практикой является использование инструкций препроцессора для группировки:
#Область ПодготовкаДанных
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ... огромный текст запроса ...";
#КонецОбласти
Это позволяет сворачивать (коллапсировать) текст запроса в одну строку, когда он вам не нужен, но быстро разворачивать его для редактирования без прыжков по модулям.
Отладка временных таблиц и пакетов
Часто в сложных запросах используются менеджеры временных таблиц. Чтобы понять, что находится в промежуточной таблице, разработчики часто пишут дополнительные запросы ВЫБРАТЬ * ИЗ ВТ. Однако есть более элегантный метод.
Используйте метод ВыполнитьПакетСПромежуточнымиДанными(). Он позволяет получить не только основной результат, но и содержимое всех временных таблиц, участвующих в пакете запроса, без изменения текста запроса.
// Пример использования для отладки
РезультатПакета = Запрос.ВыполнитьПакетСПромежуточнымиДанными();
// В отладчике в переменной РезультатПакета будет массив,
// содержащий результаты всех временных таблиц.
Если вы не просто читаете, а пишете или меняете код, следуйте правилам, которые снизят сложность для вас и ваших коллег в будущем.
Когнитивная сложность и параметры
Разбиение кода на подпрограммы полезно только тогда, когда выделенные блоки являются слабосвязанными. Если вы создаете процедуру, в которую нужно передать 15 параметров локального контекста, вы не упрощаете код, а усложняете его поддержку.
Вместо передачи россыпи параметров рассмотрите следующие варианты:
ПараметрыРасчета и передавайте её.Связующие звенья
При отладке ставьте точки останова (breakpoints) не на каждой строке, а в ключевых "узловых" местах:
Для ускорения процесса используйте Условные точки останова. Например, если ошибка возникает только на 1000-й итерации или для конкретной номенклатуры, в свойствах точки останова пропишите условие: Выборка.Номенклатура = ИскомаяСсылка. Это сэкономит часы прокликивания клавиши F5.
Сложность кода в 1С — это данность, с которой можно эффективно работать. Главные инструменты разработчика в этой борьбе:
ВыполнитьПакетСПромежуточнымиДанными, замер производительности как трассировка, условные точки останова.#Область) и разумное разбиение на процедуры без создания "спагетти-кода" из параметров.Применяя эти методы комплексно, вы сможете уверенно ориентироваться даже в самых запутанных конфигурациях.