Принципы SOLID для 1С: Путь к чистому коду. Часть 1

21.04.25

Разработка - Рефакторинг и качество кода

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

Предисловие

Стоит завести разговор о SOLID среди 1С разработчиков, как в ответ, либо недоуменные взгляды, либо попытки найти хоть что-то в интернете, после которых вопросов становится только больше. Сегодня эти слова всe чаще звучат на собеседованиях, мелькают в требованиях компаний и в поисковых строках разработчиков. Материалов, которые бы ясно объясняли, как эти принципы работают в нашей платформе, почти нет. В лучшем случае попадаются общие материалы про объектно-ориентированное программирование, не учитывающие специфику платформы. В худшем, разрозненные публикации, оставляющие больше вопросов, чем ответов.

Интерес к этим принципам растeт, и не зря. Наверное, каждый сталкивался с кодом, который превратился в хаос. Методы, переплетeнные, как клубок, где правка одной строки, вызывает ошибку в другом модуль, влечет за собой часы отладки, и исправлений. Был похожий опыт? Или хоть раз приходили мысли: "Всe, пора искать новую работу, этот код меня доконает"?

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

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

Это про наше общее желание сделать код чище, а работу эффективнее и приятнее. И если после этих страниц у вас появится ощущение или даже легкий азарт, что SOLID не просто модное слово, а реально полезный инструмент на пути к порядку, значит, всe было не зря.

Возможно, целиком и сразу, объем информации покажется большим, для тех, кто впервые знакомится с ней. Для удобства я разделил каждый принцип на независимые блоки, которые можно читать отдельно друг от друга. Начнём.

 

Что такое SOLID

SOLID - это пять принципов объектно-ориентированного программирования, которые помогают создавать код, способный расти, меняться и оставаться понятным.

Вместе эти правила формируют подход, где структура программы становится не просто набором строк, а продуманной системой.

Зачем это нужно? Программирование, это не только написание кода, но и его развитие. Без чeтких принципов даже простая задача может превратиться в головоломку, когда требования меняются, а сроки поджимают. SOLID помогает решить эту проблему, давая инструкции для написания кода, который легко поддерживать, расширять и передавать другим. Это не абстрактная теория, а практическая основа, которая помогает избежать путаницы и сделать разработку предсказуемой.

 

Немного о контрактах

Далее я буду использовать слово "контракт", которое может оказаться непривычным для многих. Но это очень важная часть, которая лежит в основе качественного кода и эффективной командной работы.

Контракт - это формальное описание ожидаемого поведения метода, задающее его интерфейс и определяющее, как он взаимодействует с вызывающим кодом. Это позволяет использовать метод, опираясь на гарантированный результат, не зная его внутренней реализации.

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

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

Методы в таких областях, как ПрограммныйИнтерфейс, СлужебныйПрограммныйИнтерфейс задают публичные контракты для других подсистем. Размещение методов в этих областях обязывает разработчиков не вносить в них изменения, которые приведут к изменению условий контракта, например добавление нового обязательного параметра. Лучше добавлять необязательные параметры, либо создавать новые методы, перенося старые в область УстаревшиеПроцедурыИФункции. При этом, если вы используете SonarQube или EDT, использование устаревших методов будет анализироваться.

Пример заданного контракта:

#Область ПрограммныйИнтерфейс

// Получает события журнала регистрации по отбору, выполняет проверку получения и передает результат
// в виде текста.
//
// Параметры:
//  ПараметрыОтбора - Структура - структура с ключами:
//   * ДатаНачала    - Дата - начало периода журнала;
//   * ДатаОкончания - Дата - конец периода журнала;
//   * Событие       - Массив - массив событий;
//   * Метаданные    - Массив, Неопределено - массив метаданных для отбора;
//   * Уровень       - УровеньЖурналаРегистрации - уровень важности событий журнала регистрации;
//  ДанныеВложений - Массив Из Структура - подготовленные данные вложений:
//   *Представление - Строка - представление вложения;
//   *Текст - Строка - текст файла вложения;
//   *Размер - Число - размер файла вложения в байтах.
//
// Возвращаемое значение:
//  Структура - результат подготовки:
//    *КодОшибки - Строка - идентификатор ошибки при отправки:
//    *СообщениеОбОшибке - Строка, ФорматированнаяСтрока - сообщение об ошибке для пользователя.
//
Функция ПодготовитьТекстЖурналаРегистрации(ПараметрыОтбора, ДанныеВложений) Экспорт
	
	// Логика метода, обеспечивающая исполнение контракта.
	
КонецФункции

#КонецОбласти

Теперь, вернемся к SOLID, начнeм с первого принципа и посмотрим, как одна простая мысль меняет всe.

 
 S (Принцип единственной ответственности / Single Responsibility Principle / SRP)
 
 O (Принцип открытости/закрытости / Open/Closed Principle / OCP)
 
 L (Принцип подстановки Барбары Лисков / Liskov Substitution Principle / LSP)
 
 I (Принцип разделения интерфейсов / Interface Segregation Principle / ISP)
 
 D (Принцип инверсии зависимостей / Dependency Inversion Principle / DIP)

 

Как применять на практике

Весь этот материал, не просто теория, а руководство к действию, которое может изменить ваш взгляд на код. Начав мыслить принципами SOLID, вы увидите код по-новому, вместо набора методов, он превратится в систему взаимосвязанных компонентов, где каждая часть играет свою роль. Это, как переключиться с хаотичного "пишу как получится" на структурированное "проектирую с целью". Используйте материал как чек-лист при проектировании.

   S: Анализируйте задачи с точки зрения ответственности, одна программная сущность - одна цель.

   O: Проектируйте код с возможностью добавления функциональности через точки расширения.

   L: Проверяйте, чтобы подмена базовой логики не нарушала контракт.

   I: Упрощайте интерфейсы, убирая из них всe лишнее для конкретного клиента.

   D: Внедряйте абстракции, чтобы разорвать жeсткие связи между "высокоуровневой" логикой и "низкоуровневыми" деталями реализации.

Примеры из статьи - это шаблоны, адаптируйте их под свои задачи. Постепенно внедряйте принципы в рабочие процессы, начиная с небольших доработок, чтобы увидеть эффект на практике.

 

Послесловие

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

 

Автор: Григорьев Руслан

 

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

См. также

Рефакторинг и качество кода Программист Платформа 1С v8.3 Россия Бесплатно (free)

Цель статьи: кратко показать инструмент и возможности Cursor IDE.

вчера в 17:00    484    dimzfresh    3    

10

Рефакторинг и качество кода Обновление 1С Программист Платформа 1С v8.3 Бесплатно (free)

Методика, описанная в статье, выработана при переезде с 1С:ДО 2.1 на 1С:ДО 3.0. Может также применяться при переходе с 1С:УПП на 1C:ERP, 1C:ERP на 1C:ERP УХ и т. п. Учтены все необходимые доработки при переезде на новую конфигурацию и предупреждены возможные ошибки.

вчера в 11:00    334    PROSTO-1C    2    

3

Рефакторинг и качество кода Программист Платформа 1С v8.3 Россия Бесплатно (free)

Диалог "Вопрос" использовался очень интенсивно в старых версиях кода и также его используют в УФ довольно часто. Иногда очень неудобно использовать рефакторинг через асинхронные вызовы ПоказатьВопрос и ВопросАсинх по разным причинам. Есть ещё одно решение, как избежать больших переделок кода, когда Вы не планируете его использовать где-то на других платформах и Веб-клиентах.

26.03.2025    439    ksuman    6    

3

HighLoad оптимизация Рефакторинг и качество кода Технологический журнал Программист Платформа 1С v8.3 Россия Бесплатно (free)

Технологии бегут вперёд, но боль производительности 1С остаётся вечной: инфраструктура, код или настройки? Пока ИИ не научился чинить всё «на лету», мы автоматизировали ключевое — диагностику. Читайте статью — показываем, как превратить хаос диагностики в понятные графики и цифры. Спойлер: это работает даже если ваша 1С — «чёрный ящик» на старом железе.

19.03.2025    2940    EFSOL_oblako    9    

9

Рефакторинг и качество кода Программист Стажер Платформа 1С v8.3 Бесплатно (free)

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

17.03.2025    2482    Bukaska    5    

8

Нейросети Рефакторинг и качество кода Тестирование QA Программист Платформа 1С v8.3 Бесплатно (free)

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

11.03.2025    5470    mrXoxot    52    

53

Рефакторинг и качество кода Тестирование QA Программист Платформа 1С v8.3 Бесплатно (free)

В последней статье по докладу Александра Кириллова, с которым он выступил на конференции INFOSTART TECH EVENT 2024, обсудим особенности тестирования после завершения рефакторинга платформеннозависимого кода

11.03.2025    581    it-expertise    0    

3

Инструментарий разработчика Рефакторинг и качество кода Программист Платформа 1С v8.3 Бесплатно (free)

Расширяемый форматтер структуры модулей 1С. Умеет автоматически расставлять стандартные области и раскидывать по ним процедуры и функции модуля, оформлять стандартные комментарии к методам с помощью ИИ. Также умеет анализировать модуль - извлекать структуру вызовов, используемые поля и т.д. Реализован в виде расширения (.cfe). Можно использовать как платформу для обработки кода в своих задачах автоматизации разработки.

12.02.2025    7505    478    wonderboy    45    

120
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. VAAngelov 541 21.04.25 12:34 Сейчас в теме
Отличная статья! Спасибо за проделанный труд.
ivnik; user1948830; RPGrigorev; +3 Ответить
2. RPGrigorev 746 21.04.25 12:46 Сейчас в теме
(1) Спасибо за помощь и поддержку!
ivnik; VAAngelov; +2 Ответить
3. brr 184 21.04.25 16:35 Сейчас в теме
Наличие ОМ ОбщегоНазначения зачеркивает букву S в SOLID.
4. brr 184 21.04.25 16:42 Сейчас в теме
С L забавно получилось, выдавать костыль за реализацию принципа это сильно.
Должно быть вот так:

Функция ПодбиратьВидыЗапасовПоИнтеркампани(Документ) Экспорт
	
	Результат = Документ.ДополнительныеСвойства.ПодбиратьВидыЗапасовПоИнтеркампани;
	
	Возврат Результат;
	
КонецФункции


То есть все документы которые попадают в эту функцию в ДополнительныеСвойства должны иметь инициализированное свойство ПодбиратьВидыЗапасовПоИнтеркампани.
9. VAAngelov 541 21.04.25 17:15 Сейчас в теме
(4) Интересно. А можно вас попросить какие-то примеры? Как неправильно и как правильно. Чтобы наглядно это было видно сразу. Просто очень хочется понять, что же тут неправильно, но я пока не понимаю. Это просьба.
RPGrigorev; +1 Ответить
5. shalik 21.04.25 16:46 Сейчас в теме
Спасибо за статью. Жду комментарии от гуру1спрожженых программистов что всякие паттерны, солиды в 1с не нужны и не работают!
quazare; VAAngelov; RPGrigorev; +3 Ответить
8. VAAngelov 541 21.04.25 17:07 Сейчас в теме
(5) Сейчас тут будет море таких комментов).
RPGrigorev; +1 Ответить
14. quazare 3903 22.04.25 05:01 Сейчас в теме
(5) не понятно - нужны или нет, - заказчику точно не нужны… вылизовать код - это привилегия
15. shalik 22.04.25 09:20 Сейчас в теме
(14) Заказчику в принципе до фонаря что там в коде и как написано, если решение работает)
16. quazare 3903 22.04.25 09:30 Сейчас в теме
(15) категорически согласен) но вот автор статьи считает иначе походу
6. brr 184 21.04.25 16:49 Сейчас в теме
Нет инверсии в примере D, добавьте в ДанныеУстановленнойЦены третий параметр и передавайте модуль, и не обязательно общий, можно и модуль менеджера и объект. Будет инверсия. В зависимости от переданного модуля у вас по разному будут считаться центы. Передаваемый модуль естественно должен содержать интерфейс ДанныеУстановленнойЦены.
7. brr 184 21.04.25 16:50 Сейчас в теме
В примерах ТС ненавязчиво использует паттерн Информационный эксперт. За что ему респект. :)
10. RPGrigorev 746 21.04.25 17:31 Сейчас в теме
(7) Пожалуйста, аргументируйте и приведите "правильные" примеры.
12. brr 184 21.04.25 17:42 Сейчас в теме
(10) СкладПоУмолчанию в ММ справочника Склады. Типичное применение информационного эксперта. Ответственность за выполнение задачи должен нести класс, который обладает всей необходимой для этого информацией.
RPGrigorev; +1 Ответить
11. ivnik 617 21.04.25 17:32 Сейчас в теме
Статья очень полезная, на простом "крестьянском" языке. Спасибо!
RPGrigorev; VAAngelov; +2 Ответить
13. maxrubtsoff 19 21.04.25 21:00 Сейчас в теме
Только легенды знают, что это перезалив. Рад, что статья снова доступна)
RPGrigorev; +1 Ответить
Оставьте свое сообщение