Как проектировать программный интерфейс и структуру кода в 1С перед началом разработки

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

Разработка сложных систем на встроенном языке 1С часто сталкивается с проблемой «умственного жонглирования». Когда программист пытается одновременно удержать в голове структуру запросов, состав полей таблиц значений, параметры методов БСП и логику ветвления, вероятность ошибки возрастает экспоненциально. Проектирование кода перед его написанием — это способ минимизировать когнитивную нагрузку и создать стройную архитектуру системы. Рассмотрим подробнее, какие инструменты и методики позволяют «разложить все по полочкам» еще до того, как будет написана первая строка логики.

Проектирование «сверху вниз» через функции-заглушки

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

Сначала мы создаем основную процедуру, которая описывает бизнес-процесс на высоком уровне. Внутри нее мы вызываем другие процедуры и функции, которых еще не существует. Эти функции мы создаем как «заглушки», которые не выполняют действий, но определяют программный интерфейс (входные и выходные параметры).

Посмотрим на пример реализации такого скелета:


Процедура ВыполнитьСложныйРасчетИЗагрузку()
    // 1. Получаем данные из внешнего источника
    ДанныеДляРасчета = ПолучитьДанныеИзВнешнейСистемы();
    
    // 2. Рассчитываем показатели на основе полученных данных
    РезультатыРасчета = РассчитатьПоказатели(ДанныеДляРасчета);
    
    // 3. Записываем результат в базу данных
    ЗаписатьРезультатыВБазу(РезультатыРасчета);
КонецПроцедуры

Функция ПолучитьДанныеИзВнешнейСистемы()
    Возврат Неопределено; // Заглушка
КонецФункции

Функция РассчитатьПоказатели(ВходныеДанные)
    Возврат Неопределено; // Заглушка
КонецФункции

Процедура ЗаписатьРезультатыВБазу(ТаблицаРезультатов)
    // Заглушка
КонецПроцедуры

Такой подход позволяет сначала связать блоки данных между собой. Вы определяете, что Функция1 вернет Массив, а Процедура2 примет этот Массив как параметр. Когда структура готова, вы постепенно наполняете «пустышки» реальным кодом. Это избавляет от необходимости помнить всю цепочку вызовов целиком.

Визуальное проектирование с помощью языка ДРАКОН

Если задача слишком сложна для текстового описания, на помощь приходят визуальные инструменты. Проанализируем использование визуального алгоритмического языка ДРАКОН (Дружелюбный Русский Алгоритмический язык, Который Обеспечивает Наглядность). В отличие от классических блок-схем или UML, ДРАКОН жестко ограничивает правила рисования, что делает схему однозначной и легко читаемой.

Основные преимущества использования таких схем при проектировании в 1С:

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

Использование визуальных схем особенно полезно в задачах со сложной бизнес-логикой, например, при расчете себестоимости или в алгоритмах распределения партий товаров.

Предварительное планирование через объявление переменных

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

Перед тем как писать тело процедуры, попробуйте объявить в начале все ключевые переменные, которые вам понадобятся. Это заставляет мозг заранее продумать алгоритм:


Процедура ОбработатьЗаказ(СсылкаНаЗаказ)
    Перем ТекстЗапроса;
    Перем РезультатЗапроса;
    Перем ТаблицаТоваров;
    Перем ПараметрыПроведения;
    
    // Описание логики пойдет здесь...
КонецПроцедуры

Если в процессе планирования переменных становится слишком много (более 7–10), это верный признак того, что процедура перегружена ответственностью. В этот момент, еще не написав логику, вы можете принять решение о разделении метода на несколько вспомогательных. Также это помогает избегать слишком длинных имен переменных, так как контекст использования становится понятен из структуры метода.

Системная организация модулей с помощью областей

Проектирование программного интерфейса модуля — это не только список методов, но и их логическая группировка. Разберем стандарт, который активно применяется в библиотеке стандартных подсистем (БСП) и помогает структурировать мышление разработчика. Используйте тег #Область для разделения кода на уровни доступа:

  1. ПрограммныйИнтерфейс: Здесь располагаются экспортные методы, предназначенные для вызова из других модулей. Проектирование начинается именно отсюда — что ваш модуль «обещает» внешнему миру.
  2. СлужебныйПрограммныйИнтерфейс: Методы, которые могут использоваться другими подсистемами вашей же конфигурации, но не рекомендуются для общего использования.
  3. СлужебныеПроцедурыИФункции: «Внутренняя кухня» модуля. Здесь скрыта реализация, о которой не нужно знать вызывающему коду (инкапсуляция).
  4. ОбработчикиСобытий: Если это модуль формы или объекта.

Такое разделение позволяет при «нырянии» в чужой или свой старый код сразу понять, какие методы являются входными точками, а какие — деталями реализации.

Использование «живых» комментариев и TDD-лайт

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

Некоторые разработчики идут дальше и применяют элементы TDD (Test Driven Development). Даже если вы не пишете полноценные автоматизированные тесты, попробуйте сначала написать код, который вызывает ваш будущий метод с конкретными параметрами. Это заставит вас спроектировать удобный интерфейс с точки зрения «потребителя» кода, а не его «создателя».

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

← На главную