Принципы ООП в 1С (GoF pattern visitor)

04.07.18

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

Шаблон проектирования visitor, по моему мнению весьма полезен для 1С.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Принципы ООП в 1С (GoF pattern visitor): пример реализации
.zip 10,87Kb
3 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

visitor или посетитель, данный шаблон решает задачу выноса бизнес логики из класса наружу. Приведу аналогию с принципом которому придерживаются разработчики БСП (да в принципе типовых конфигураций), если разработчик разрабатывая какой-то функционал предполагает, что какая-то чать может быть переопределена прикладными разработчиками, он выносит такие методы в переопределяемые общие модули. Переопределяемый общий модуль, это тот же модуль как и все остальные, просто в имени у него  есть слово "Переопределяемый", т.е. у него так же нужно включать возможность изменения если захотим что-то переопределить. По большому счету, все это держится на чистых договоренностях. Шаблон проектирования visitor решает данную задачу тем, что бизнес логика (ту которую в дальнейшем будет переопределяться или вообще отдаваться полностью на откуп прикладных программистов) описывается в самом посетителе.

На объектах 1С схема получается такая:

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

В данном случаи обработка ОбработкаСодержащаяСложныеМетоды, некий контейнер методов какого-то бизнес функционала, она на поддержке, в нем метод КакойтоМетод2() переопределяемый из вне. Вот его содержимое:

Процедура КакойтоМетод2(Посетитель) Экспорт 
	Если Посетитель = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Посетитель.Посетить(Неопределено);
КонецПроцедуры

 

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

Процедура КакойтоМетод2(Посетитель) Экспорт 
	Если Посетитель = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
// базовый алгоритм
	Посетитель.Посетить(Неопределено);
// базовый алгоритм
КонецПроцедуры

 

или например сделать что бы значение какой-то переменной для дальнейшего использования определялось внешним алгоритмом

Процедура КакойтоМетод2(Посетитель) Экспорт 
	Если Посетитель = Неопределено Тогда
		Возврат;
	КонецЕсли;
	

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

 

или сделать так

Процедура КакойтоМетод2(Посетитель) Экспорт 
	Если Посетитель = Неопределено Тогда
		// Алгоритм по умолчанию.
    Иначе
       Посетитель.Посетить(Неопределено);
	КонецЕсли;
КонецПроцедуры

 

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

Пример использования:

	ОбработкаОбъект = Обработки.ОбработкаСодержащаяСложныеМетоды.Создать();
	ОбработкаОбъект.КакойтоМетод(); // Это вызов типового метода
	
	Посетитель = Обработки.Посититель1.Создать().Имплементация("ПосетительИнтерфейс");
	ОбработкаОбъект.КакойтоМетод2(Посетитель); // Вызов переопределяемого метода
	
	Посетитель = Обработки.Посититель2.Создать().Имплементация("ПосетительИнтерфейс");
	ОбработкаОбъект.КакойтоМетод2(Посетитель); // Вызов переопределяемого метода, но уже с другим алгоритмом.

 

 

Вступайте в нашу телеграмм-группу Инфостарт

ООП pattern visitor visitor GoF pattern ООП в 1С

См. также

Инструментарий разработчика Рефакторинг и качество кода Программист Руководитель проекта 1С:Предприятие 8 Абонемент ($m)

MetaVision for 1C PRO — профессиональная версия статического анализатора и визуализатора кода. Загружает выгрузки конфигураций, расширения и внешние файлы, за секунды строит графы функций, находит уязвимости безопасности и подсвечивает проблемы производительности. В арсенале: визуализация логики в виде графов условий, циклов, транзакций и вызовов, статический аудит безопасности с поиском RCE, SSRF, COM-инъекций и паролей в коде, выявление запросов в циклах и вложенных блокировок, полнотекстовый поиск по всем модулям, встроенный редактор с конвертером запросов и автоформатированием, а также честная статистика по объектам и функциям. Главное новшество PRO — до пяти конфигураций одновременно с мгновенным переключением, наложение до пяти расширений как в конфигураторе, анализ внешних файлов в единой связке с основной конфигурацией и пять тем оформления. Инструмент для тех, кто ведёт несколько проектов параллельно и хочет видеть полную картину в одном окне — быстро, наглядно и безопасно.

10 стартмани

19.05.2026    2078    20    KHoroshulinAV    6    

10

Запросы Рефакторинг и качество кода Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Есть запросы, которые сразу вызывают подозрение: десятки соединений, множество временных таблиц, объединения, группировки и длинный список условий. Но чаще проблемы прячутся в другом месте — в запросах, которые выглядят вполне приемлемо. Пара обращений через точку, отбор после виртуальной таблицы, РАЗЛИЧНЫЕ «чтобы убрать дубли», большой список в параметре, реквизит регистратора через составной тип — и вот уже на тестовой базе все летает, а в рабочей базе отчет открывается минуту. Разберу такие случаи из практики: не синтаксические ошибки, а именно запросы, которые формально нормальные, но на больших данных начинают вести себя плохо.

04.05.2026    1402    YA_2060655612    11    

9

Рефакторинг и качество кода Программист Бесплатно (free)

Почему рефакторинг, призванный улучшать код, иногда приводит к сбоям, потерям времени и новым ошибкам? Показываем типичные ситуации, когда рефакторинг становится токсичным: работа с legacy-кодом, изменения перед релизом, рефакторинг про запас и без тестирования. Объясняем, как универсальные мегаметоды, преждевременные абстракции и отсутствие понимания бизнес-логики ухудшают систему. А также рассказываем, когда рефакторинг действительно нужен, и какие принципы помогают делать его безопасно и осознанно.

29.04.2026    813    _apelsin4ik    0    

5

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

Код в 1С редко начинает тормозить сразу. Намного чаще он долго выглядит нормальным, а проблемы проявляются позже — когда растут данные, пользователи и количество доработок. В статье разбираю типичные причины такой деградации: запросы в цикле, лишние ПолучитьОбъект(), тяжёлые формы и обработку “по одному”. Статья практическая: с примерами, типичными ошибками и понятными признаками того, что код уже плохо масштабируется.

21.04.2026    1823    YA_2060655612    6    

11

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

Инструмент для тех, кто устал читать модули по 50 тысяч строк и искать ошибки глазами. MetaVision загружает выгруженные файлы конфигурации и за секунды строит графы функций, находит уязвимости и подсвечивает проблемы производительности. Ключевые возможности: Визуализация логики функций (графы условий, циклов, транзакций и вызовов). Статический аудит безопасности (RCE, SSRF, COM-инъекции, пароли в коде). Поиск проблем производительности (запросы в циклах, вложенные блокировки). Полнотекстовый поиск по всем модулям конфигурации. Статистика по объектам и функциям. Безопасность: Программа работает строго локально. Код вашей конфигурации не отправляется в интернет и не анализируется на сторонних серверах. Попробуйте MetaVision сегодня — узнайте, что скрывает ваш код.

20.04.2026    10502    1110    KHoroshulinAV    55    

86

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

Как быстро разобраться в чужом коде? Как не забыть через полгода алгоритм работы своего собственного кода? Как наглядно проектировать? Ответам на эти вопросы посвящена данная публикация.

17.04.2026    755    chuprina_as    4    

4

Нейросети Рефакторинг и качество кода Программист Бесплатно (free)

Создадим скрипт на Пайтон, предназначенный для автоматизированного подбора чанков (фрагментов требований к коду) при разработке на 1С. Она помогает разработчику формировать качественные промпты для ИИ, включающие все необходимые требования безопасности, производительности и стандартов кодирования. Кому интересно, покритикуйте и предложите улучшения. Результаты опубликуем.

20.03.2026    1533    ksnik    4    

5

Нейросети Рефакторинг и качество кода Программист Бесплатно (free)

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

17.03.2026    2098    IgorVasilyev    54    

27
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. MaCCapAkIII 31.07.24 13:14 Сейчас в теме
А чем данная реализация отличается, скажем, от использования расширений конфигурации? Ведь, насколько я понимаю, используя расширения мы также ничего не меняем в заимствованных объектах метаданных и расширяемых методах, все реализуется в расширении...
И еще. Правильно понимаю, что для применимости паттерна Посетитель необходимо, чтобы поддержка этого паттерна была реализована в самом посещаемом объекте? То есть если мы собираемся посетить КакойтоМетод2, то необходимо в коде этого метода прописать возможность обращения к методам посетителя? Это считается "без изменения основного класса"? Или я неправильно понимаю?
Для отправки сообщения требуется регистрация/авторизация