Снятся ли 1С-никам абстрактные интерфейсы?

24.02.26

Разработка - EDT

Использование абстрактных интерфейсов в 1С.

ПРЕДУПРЕЖДЕНИЕ. Все ниженаписанное является плодом хронического недосыпания! Не пытайтесь повторить это в конфигураторе здорового человека. Работает только в 1С:EDT с плагином V8 Code Style, в идеале - с типизацией строгого режима @strict-types (но можно и без нее).

 

Приснилось мне как-то раз, что в 1С есть абстрактные интерфейсы.

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

А сколько есть в 1С способов реализации такого хранилища на сервере?

  • Просто в оперативной памяти (объект Соответствие).
  • Во временном хранилище (тот же объект Соответствие, помещенный во временное хранилище).
  • В параметрах сеанса.
  • В хранилище настроек пользователя.
  • В регистре сведений.
  • … (тут еще уйма вариантов)

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

А работал я в EDT. И решил я сделать обработку с именем ИХранилищеЗначений. А в модуле обработки описать программный интерфейс с пустыми методами. Вот такой:

 
 Обработка ИХранилищеЗначений. Модуль объекта.
// @strict-types
// @skip-check module-empty-method

#Если Сервер ИЛИ ВнешнееСоединение ИЛИ ТолстыйКлиентОбычноеПриложение Тогда

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

#Область ИХранилищеЗначений

// Прочитать значение по ключу.
// 
// Параметры:
//  Ключ - Произвольный
// 
// Возвращаемое значение:
//  Произвольный
//  
Функция Прочитать(Знач Ключ) Экспорт
КонецФункции

// Записать значение по ключу.
// 
// Параметры:
//  Ключ - Произвольный
//  Значение - Произвольный
//  
Процедура Записать(Знач Ключ, Знач Значение) Экспорт
КонецПроцедуры

// Удалить значение по ключу.
// 
// Параметры:
//  Ключ - Произвольный
// 
Процедура Удалить(Знач Ключ) Экспорт
КонецПроцедуры

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

#КонецОбласти // ПрограммныйИнтерфейс

#Область Инициализация
ВызватьИсключение "Не надо создавать экземпляр абстрактного интерфейса, он вообще не для этого!";
#КонецОбласти

#КонецЕсли

 

 

Получилось у меня описание абстрактного интерфейса и новый тип ОбработкаОбъект.ИХранилищеЗначений.

Почему обработка, спросите вы? Ну, во-1х, это объект, порождающий новый тип (в отличие от общего модуля, например). Во-2х, это самый безобидный из объектов: он не создает никаких таблиц в информационной базе и имеет наименьшее количество собственных предопределенных методов и событий, которые нам в данном случае вообще не нужны, так что чем их меньше - тем лучше. У обработки их всего 5 (4 метода и 1 событие).

А потом я написал уж не помню какую процедуру вот таким образом:

 
 Какая-то процедура...

 

 

Ну и здорово, подумал я: EDT выдает подсказку по всем методам интерфейса. Правда, в списке мельтешат предопределенные методы обработки, но с этим можно мириться. А если ошибиться с именем метода, то подчеркивает красненьким. При этом я еще даже не написал ни одного варианта реализации!

Дальше мне пришло в голову вот что. Полиморфизм в 1С — это хорошо, но иногда его бывает слишком много. Например, если процедура может получать объекты разных типов, то как понять, что за объект ей передали, и что с ним можно делать, а что нельзя? И при этом сохранять спокойный сон, по-прежнему ничего не зная о способе реализации объекта? Другими словами, нужно как-то узнавать, какой интерфейс реализует полученный объект. К слову, он ведь может реализовывать и больше одного интерфейса.

И тогда я измыслил абстрактнейший из абстрактных интерфейсов. Так и назвал его: ИАбстрактный. Тоже сделал в виде обработки, но на этот раз описал всё в модуле менеджера, для разнообразия. Он содержит всего один метод.

 
 Обработка ИАбстрактный. Модуль менеджера.
// @strict-types
// @skip-check module-empty-method

#Если Сервер ИЛИ ВнешнееСоединение ИЛИ ТолстыйКлиентОбычноеПриложение Тогда

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

#Область ИАбстрактный

// Проверяет, реализует ли объект указанный интерфейс.
// 
// Параметры:
//  ИмяИнтерфейса - Строка
// 
// Возвращаемое значение:
//  Булево
// 
Функция РеализуетИнтерфейс(Знач ИмяИнтерфейса) Экспорт
КонецФункции

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

#КонецОбласти // ПрограммныйИнтерфейс

#КонецЕсли

 

 

Теперь каждый приличный объект должен реализовать интерфейс ИАбстрактный, тогда можно будет, при помощи метода РеализуетИнтерфейс проверить, реализует ли он тот интерфейс, который от него ожидается.

 
 Еще какая-то процедура...
// Еще какая-то процедура.
// 
// Параметры:
//  Объект - ОбработкаМенеджер.ИАбстрактный, ОбработкаОбъект.ИХранилищеЗначений -
// 
Процедура ЕщеКакаяТоПроцедура(Знач Объект)
	
	Если Объект.РеализуетИнтерфейс("ИХранилищеЗначений") Тогда
		//...
	КонецЕсли;
	
КонецПроцедуры

 

 

Ну а если вдруг объект не содержит метода РеализуетИнтерфейс, платформа выдаст исключение. Тоже своего рода ответ на вопрос.

А как же реализовать абстрактный интерфейс, спросите вы? А в виде любого серверного объекта, лишь бы он имел модуль, содержащий определения методов интерфейса. Это может быть модуль объекта, модуль набора записей, модуль менеджера, общий модуль, и даже модуль формы в серверном контексте.

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

Слушайте, что дальше было. Приснилось мне, что в EDT появился объект Интерфейс, специально для описания абстрактных интерфейсов. И что теперь не нужно для этого плодить обработки, которые потом будут мертвым грузом висеть в конфигурации. И что поддерживается наследование одного интерфейса от другого, и плагин V8 Code Style контролирует, что реализация интерфейса в модуле совпадает с его описанием… А потом я проснулся.

КонецСказочки;

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

интерфейс абстрактный EDT CodeStyle

См. также

DevOps и автоматизация разработки EDT Программист Бесплатно (free)

Разбираемся, почему ручной деплой в 1С все еще жив и сколько времени он на самом деле занимает, несмотря на стремительное развитие CI/CD-подходов. На реальном кейсе показываем, что корень проблемы чаще кроется не в автоматизации, а в ее неэффективной настройке. Событийная модель вместо расписаний, параллельные тесты, использование кеша Gitlab для оптимизаций и правильные настройки для управления репозиториями на раннерах радикально меняют скорость delivery. Объясняем, почему переход на Docker иногда замедляет процесс, как платформенные особенности 1С влияют на пайплайны и какие стратегии позволяют устранить узкие места. Материал будет полезен тем, кто хочет понять реальную стоимость ручного деплоя и сравнить ее с возможностями правильно настроенной автоматизации.

04.03.2026    1014    konst1231    0    

4

DevOps и автоматизация разработки EDT Программист 1С 8.3 Бесплатно (free)

Входные данные - конфигурация 1С в формате EDT, для системы контроля версий используется Git, две базы - рабочая и тестовая. Задача: коммит в ветку должен автоматически обновлять базу. Без ручного запуска конфигуратора, без «сохрани CF и скопируй на сервер». Инструмент - GitHub Actions + PowerShell-скрипты на сервере. Платформа 8.3.27.

27.02.2026    1420    BiLBelarus    0    

8

EDT Программист Бесплатно (free)

Показываем, как сочетание небольшого собственного продукта и EDT помогает решать реальные задачи разработки, а не просто следовать моде. Делимся опытом перехода от монорепозитория к форкам, рассказываем об архитектуре решения и особенностях командной работы. А также раскрываем плюсы и минусы EDT, которые стоит учитывать при выборе среды для продуктовой разработки.

26.01.2026    1569    nalivai-chai    0    

6

EDT Обновление 1С Программист Бесплатно (free)

На примере рассмотрим одну из стратегий обновления проекта на новый релиз поставщика через 1С:EDT.

19.01.2026    4069    eakomarov    12    

20

EDT Программист Стажер 1С 8.3 Россия Бесплатно (free)

С высоты своего многолетнего стажа работы в программе 1С:Предприятие с ужасом вспоминаю начало двухтысячных годов, когда только-только начинал свои первые шаги в программирование. Вроде бы уже был опыт программирования в других языках, но всё равно было как-то не по себе.

22.12.2025    5520    chuevsf    11    

3

EDT Программист Стажер 1С:Предприятие 8 Россия Абонемент ($m)

Данная публикация посвящена работе с новым функционалом в 1С:EDT, а точнее ИИ 1С:Напарник. Этот материал будет полезен для начинающих программистов, а также для программистов, которые желают научиться работать в 1С:EDT с применением ИИ.

2 стартмани

05.11.2025    7396    chuevsf    7    

11

EDT Групповая разработка (Git, хранилище) Программист 1С:Предприятие 8 Бесплатно (free)

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

04.08.2025    12147    ZigRinat85    52    

49

DevOps и автоматизация разработки EDT Программист Бесплатно (free)

Цель статьи – показать, что DevOps можно внедрять в проектах любого масштаба, даже с ограниченными ресурсами. Автор делится личным опытом: рассказывает, как начиналось внедрение, какие ресурсы потребовались, какие задачи удалось решить и как организован текущий рабочий процесс. Вы узнаете, как DevOps-практики помогают участникам разработки и чем DevOps-инженеры полезны для всех, кто участвует в создании решений. В статье подробно разбираются преимущества, которые дал переход на EDT, его влияние на процессы сборки, а также анализируется опыт внедрения Kubernetes – что это уже принесло и что принесет в будущем.

11.07.2025    4521    ptica    0    

7
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Asmody 24.02.26 14:05 Сейчас в теме
"Можно, но зачем?"
ef42; bulpi; +2 Ответить
2. korvintorson 87 24.02.26 14:24 Сейчас в теме
(1) Зачем нужны абстрактные интерфейсы? Почитайте профильную литературу, там написано.
3. Asmody 25.02.26 07:32 Сейчас в теме
(2) вы не улавливаете иронии.
В большей степени она относится не к вам, но к нашему жёлтому вендору
4. korvintorson 87 25.02.26 09:00 Сейчас в теме
5. mip128 04.03.26 11:35 Сейчас в теме
В принципе, все ОбщегоНазначения и созданы как абстрактный интерфейс.
6. korvintorson 87 04.03.26 14:21 Сейчас в теме
(5) Можете более развернуто пояснить вашу мысль?
7. mip128 04.03.26 17:54 Сейчас в теме
(6) Общего назначения создан так, что он ничего не знает о специфике любого прикладного решения, в рамках которого существует. Он в 1С является абстрактным.
8. korvintorson 87 04.03.26 19:15 Сейчас в теме
(7) То, о чем вы пишете - это независимость вызываемой стороны от вызывающей. Появилось в незапамятные времена, с изобретением процедурных языков. Не имеет отношения к понятию "абстрактный интерфейс".

Абстрактный интерфейс решает строго противоположную задачу - обеспечивает независимость вызывающей стороны от вызываемой. Принцип инверсии зависимости (DIP) - направление зависимости противоположно направлению потока управления.
Для отправки сообщения требуется регистрация/авторизация