Изменить префикс расширения 1с

Обновлено: 07.07.2024

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

В качестве ограничений расширения методов можно выделить:

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

В заимствованном в расширение модуле можно:

Механизм аннотаций.

Ниже на примерах рассмотрим каждую аннотацию, а также возможность их комбинаций.

Аннотация &Перед

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

Наглядно это можно отразить на приведенной ниже схеме


В качестве примера решим задачу вывода Фото Физического лица на Форму элемента Справочника Сотрудники в конфигурации ЗУП 3.1. Для этого добавим в расширение метод СотрудникиФормы.СотрудникиПриСозданииНаСервере вызываемый в обработчике Формы ПриСозданииНаСервере.


Запустим 1С Предприятие в режиме конфигуратора и перейдем в общий модуль СотрудникиФормы, далее щелкнув правой кнопкой мыши по заголовку процедуры СотрудникиПриСозданииНаСервере откроем выпадающий список – в нем выберем строчку «Добавить в расширение», система спросит тип аннотации – выберем «Вызывать перед»



Добавим в процедуру код программного вывода изображения на форму:

Запустим 1С в режиме предприятия и убедимся что фото Физлица выведено на Форме Сотрудника


Аннотация &После

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


Для примера рассмотрим задачу изменения цвета текста в поле ФОТ на Форме элемента Справочника Сотрудники в конфигурации ЗУП 3.1. в зависимости от выведенного значения. Если ФОТ < 30 000 сделаем желтый, если значение в диапазоне от 30 000 до 50 000 зеленый, если больше 50 000 – красный.


Вернемся в режим конфигуратора 1С Предприятия, данные ФОТ заполняются в обработчике Формы элемента Справочника Сотрудники ПриЧтенииНаСервере процедурой общего модуля СотрудникиФормы.СотрудникиПриЧтенииНаСервере. Для того чтобы анализировать уже заполненное значение ФОТ добавим метод СотрудникиФормы.СотрудникиПриЧтенииНаСервере в расширение с аннотацией &После


Далее добавим в процедуру код изменяющий цвет текста

Запустим 1С в режиме предприятия и убедимся что цвет текста в поле ФОТ стал зеленым


Аннотация &Вместо

Данная аннотация полностью отключает выполнение расширяемого метода и выполняется только метод расширенный


Стоит отметить, что если для процедур основной конфигурации доступны все три аннотации то при добавлении в расширение функции из основной конфигурации доступна только одна аннотация &Вместо


Для примера запустим 1С Предприятие в режиме конфигуратора и добавим используемую выше функцию получения изображения физлица КадровыйУчетРасширенный.АдресФотографииФизическогоЛица в расширение. Платформа 1С создала функцию Расш1_АдресФотографииФизическогоЛица в расширении со следующим содержимым:


Метод ПродолжитьВызов() рассмотрим ниже, а сейчас заменим содержимое функции слегка доработанным типовым кодом, добавив в него условие, что если пользователю не доступна Роль «Расш1_ПросмотрФото» то адрес изображения возвращаться не будет:

Запустим 1С в режиме предприятия и убедимся, что изображение скрыто даже для пользователя с полными правами


Метод ПродолжитьВызов()

Теперь остановимся на методе платформы 1С ПродолжитьВызов(), если добавить его в расширяемую функцию, то можно обрабатывать его результат как бы было в случае использования аннотации &После для процедуры.

Решим сейчас такую задачу – выведем вместо надписи «Картинка не установлена» собственную картинку для тех Сотрудников у которых в базе нет фото. Для этого добавим также в расширении картинку в ветку метаданных Общие картинки новый элемент Расш1_ПустоеФото с подходящим изображением


Изменим код расширяемой процедуры, чтобы он выглядел следующим образом:

Запустим 1С в режиме предприятия и убедимся, что вместо надписи «Картинка не установлена» мы видим добавленную в расширение картинку-заглушку


Если вернуться к предыдущей задаче, где мы возвращали пустое значение картинки, в случае если у пользователя нет нужной роли, код функции можно переписать, также используя метод ПродолжитьВызов()

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

Совместное использование &Перед и &После


Использование метода ПродолжитьВызов()


Последовательность выполнения расширенных методов

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

Порядок следования расширений в конфигурации


Порядок обхода аннотаций &Перед и &После


Порядок обхода аннотации &Вместо совместно с методом ПродолжитьВызов() и аннотациями &Перед и &После


Порядок обхода аннотации &Вместо без метода ПродолжитьВызов()


Важно отметить что в данном случае будет выполнятся только код из Расширения 2

В данной статье мы на примерах разобрали, как работает механизм аннотаций при расширении методов начиная с версии платформы 1С 8.3.9.1818. Удачи в программировании. Спасибо.

За такое нужно руки отрывать. Комментарий к объектам метаданных для слабаков?

(14) если до конфы не добрался рукожоп и не снял все объекты с поддержки, то значок напротив объекта метаданных всегда подскажет, типовой он или нет

по мне надо находить баланс как то, вот в клюшках было все просто, все что в глобальнике бало с прификсом "Гл", в снеговиках это уже больше путает, так что хз
(17) По желтому кубику определяется. Не в проде, конечно - там конфы поставщика быть не должно.
Если на базе чего-то разрабатываешь, то префиксы возможны. Особенно для похожих процедур. Но без фанатизма. Т.к. наличие замочков помогает понять что к чему.Например, в расширениях они явно рекомендованы на уровне платформы.
(0) Префиксы - это удобно. Удобно - значит быстрее. Быстрее - значит эффективнее. Эффективнее - значит больше денег. Вывод: Префиксы - к деньгам.
(14) должная быть своя подсистема, куда входят все новые объекты
(0) отраслевые частенько выходят не только как самостоятельные решения, но и как модули к ERP, там то префиксы и пригодятся
(24) Лишние хлопоты. Если конечно у тебя есть еще как минимум два, а лучше три контура.
Префиксы как универсальное решение можно использовать когда в конфе есть и "стандартные" объекты и добавленные разработчиком.
Префиксы также можно использовать для разработческих реквизитов добавленных в стандартный объект.
Немного пострадает автонабор текста кода, но будет существенный выигрыш в уникальности, разделяемости и определяемости объектов\реквизитов.
Также можно использовать префиксы в названиях переменных\параметров, например, для определения типизации или для отделения их от других свойств с похожим наименованием.
+ префиксы улучшают ситуацию с переносимостью кода в другие конфигурации, главное чтобы они были нейтральными, т.е. без номеров заявок, ФИО и т.п.
(30) "использовать префиксы в названиях переменных\параметров, например, для определения типизации" // Ни одного оправдания этому быть не может
+ само собой для добавленного функционала надо создать отдельную подсистему.
еще бывает в синонимы некое представление подсистемы добавляю, чтобы пользователи могли отличать типовое от нетипового

Для разных подсистем, расширений, поставок и т.д. можно задать свой префикс и хреначить такие же названия метаданных.

Обращаться через моя_подсистема.МойСправочник и т.д.
По умолчанию если префикс не указан но последовательность поиска в платформе, сначала основная конфа/поставка, потом дополнительные поставки, потом подсистемы и расширения.

Если одно название и кто то скосячил да будет упс - решать через платформу чтобы ошибки/неопределенности подобные выводила при проверке.

(32) если разработка ведется под полным контролем архитектора или разработчик один - то да, можно обойтись.
как собственно 1С и поступает.

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

(34)+ А потом останется добавить алиасы это когда разраб может переобозвать подсистему или расширение как ему надо и использовать свое это новое название.

И будет почти как в C++ гы

(32) а в чем недостаток префиксов у переменных ? то что автонабор не работает ? и все ?
(35) "можно наколоться с совпадением названий параметров\переменных" // Приведт пример

(35) Строгая типизация нужна чтобы не перепутать!

А то иш псевдотипизацию через префиксы придумали

(37) Усложнение изменения кода (рефакторинг или доработка), в результате которого тип переменной приходится поменять
Ну и почти всегда - ухудшение читаемости из-за всяких этих "б", "мс", "тз" и прочее
(40) ИМХО наоборот рефакторинг станет понятнее\надежнее. А замену легко сделать и пакетно. Главное чтобы переменная существовала в контексте функции\процедуры и только, как и правильно в общем-то.
(41) префикс должен быть в нижнем регистре, тогда он со временем "игнорится" мозгом, а когда надо "воспринимается".
мне привычны варианты и с и без - не вызывает проблем, наверное привычка
(43) временами стал уходить от передачи нескольких параметров в сторону передачи структуры параметров,
тогда вопрос с рефакторингом на точках входа автоматически решается.
предвижу следующий вопрос :))
(45) + так кстати иногда поступает сама 1С при передаче параметров в типовые конструкции - значит и мне можно :)
(45) Ну так структуру-то ты в точке вызова все равно инициализируешь, т.е. заводишь под ее значения переменные
(39) так ее ж не дали! я б с удовольствием. и иногда когда никто не видит раз в пятилетку этой фичей можно воспользоваться ;)
(46) так это и в стандарте есть, но с оговорками - структура должна не один элемент содержать, а несколько.
(48) Если ты добавляешь реквизит в форму, то присваиваешь ему префикс по подсистеме. Таким образом совпасть он с уже имеющейся в модуле форме переменной никак не сможет.
А если наоборот - ты добавляешь в модуль формы переменную, совпадающую с уже имеющимся реквизитом формы, то сам виноват - смотреть надо. Добавляя префикс _типа_ к имени переменной ты по сути снимаешь с себя бремя необходимости такого контроля и вместе с тем почти наверняка снижаешь сопровождаемость кода.
(50) меня эта тема СИЛЬНО выручает когда разработка без четкого ТЗ и изменения надо вносить ОПЕРАТИВНО

(51) как раз префиксы к реквизитам формы добавлять я против - почему-то так сложилось - может с сортировкой связано по представлению.

"
ты добавляешь в модуль формы переменную, совпадающую с уже имеющимся реквизитом формы, то сам виноват - смотреть надо

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

(55) + я же говорю - если архитектор\разработчик один и так будет ВЕЧНО - можно не париться
Структура в параметрах это тоже отдельный вид зла. Должна быть крайним средством
(57) ну мы же в адинэсе - тут не существует идеальных решений :)
(58) + в семерке еще были глобальные переменные - тоже отдельный вид зла
(54) ну надо от конкретной ситуации идти. иногда это простые типы данных, которые врядли поменяют тип (при проектировании это обдумывается), иногда это таблица значений, которая собирается из простых типов и т.п.
Вместо соответствий, массивов лучше использовать ТЗ сразу как универсальную коллекцию. Это как бы хитрости которые приходят со временем в "гибкой" разработке. Никому не навязываю подходы естественно :)

(51)
"Добавляя префикс _типа_ к имени переменной ты по сути снимаешь с себя бремя необходимости такого контроля и вместе с тем почти наверняка снижаешь сопровождаемость кода."

Речь веду про конфигурации которые врядли выйдут в коммерческую серию. А раз так то это разработка под конкретный бизнес, а бизнесу первично 24/7 стабильная работа, а то что разработчики страдают - это для бизнеса вторично.
Если случится так что попаду в коммерческую разработку и даже о боже! в саму 1С, естественно подход изменится в соответствии со стандартами данной конторы, но тогда я рассчитываю что в конторе будет человек (а может и я) который отвечает за архитектуру решения :)

Для управления расширениями в конфигураторе предназначен диалог Расширения конфигурации. Доступ к этому диалогу осуществляется через меню Конфигурация ‑ Расширения конфигурации. С помощью данного диалога можно создать новое расширение, удалить существующее, открыть конфигурацию расширения, сохранить расширение в файл, а также выполнять другие операции.

Рис. 681. Управление расширениями в конфигураторе

В общем случае получить доступ к командам работы с расширением конфигурации можно следующими способами:

1. С помощью команд командная панель панели окна Расширения конфигурации.

2. С помощью контекстного меню выбранного расширения в окне Расширения конфигурации.

3. С помощью меню Действия ‑ Конфигурация окна с расширением конфигурации.

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

Описание свойств Активно и Область действия см. здесь.

33.2.1.2. Создание расширения

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

Рис. 682. Новое расширение

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

33.2.1.3. Сохранение расширения в файл

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

33.2.2. В режиме 1С:Предприятие

33.2.3. Удаление расширений

Интерактивное удаление расширений (в конфигураторе или в клиентском приложении) различает удаление расширения, которое не расширяет данные и расширения, которое данные расширяет. В первом случае будет задан стандартный вопрос-подтверждение, после чего расширение будет удалено.

Во втором случае удаление выполняется в два действия. Более подробное описание удаления расширения, расширяющего данные, см. здесь.

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

Механизм расширения конфигурации 1C

Как указано в описании: «Механизм расширения конфигурации – это специальный механизм, предназначенный для доработки расширяемой конфигурации без изменения этой конфигурации (в том числе без снятия с поддержки).»

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

При разработке расширений следует учитывать следующие факты:

Расширение может иметь одно из следующих назначений:

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

Ограничения использования расширений:

Расширения конфигурации не поддерживают создание следующих собственных объектов:

Не поддерживается расширение следующих объектов:

Не поддерживается добавление реквизитов и табличных частей для:

Не поддерживается изменение структуры регистров всех видов. Поддерживается только расширение состава регистраторов.

В базовых версиях прикладных решений работа с расширениями не поддерживается.

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

Как добавить расширение конфигурации 1С 8.3

Для создания расширения необходимо запустить 1С в режиме конфигуратора.

В конфигураторе необходимо зайти в меню «Конфигурация» и выбрать пункт «Расширения конфигурации». Откроется окно со списком расширений (если они есть). Далее нажмем кнопку «Добавить». Мы увидим диалоговое окно создания расширения:


Стоит отдельно выделить поле Назначение – необходимо выбрать его значение в зависимости от решаемой задачи – т.к. мы выполняем добавление объектов по требованиям конкретного заказчика – нам подойдет вариант «Адаптация».


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


Разместим наш новый Справочник в Подсистеме «ШтатноеРасписание» для этого необходимо добавить эту подсистему в Расширение – Перейдем в дерево основной Конфигурации и нажмем правой кнопкой мыши на строке с нужной подсистемой и выберем пункт «Добавить в расширение».


Теперь мы можем управлять ее составом, добавим наш новый объект в подсистему.


Далее добавим в расширение Справочник Должности и добавим для него новый реквизит КатегорияДолжности с типом СправочникСсылка.Расш1_КатегорияДолжностиПоКлассификаторуПредприятия


Далее необходимо решить задачу с выводом реквизита КатегорияДолжности на форму Справочника Должности, реализовать это можно двумя способами:

Останавливаться на плюсах и минусах каждого решения не будем, а ниже рассмотрим оба варианта.

Интерактивное изменение Формы в расширении.

Для того чтобы вывести Реквизит на форму интерактивно: необходимо добавить саму Форму «ФормаЭлемента» в расширение. Обращу ваше внимание на следующий момент – для того чтобы появилась возможность Интерактивного добавления Реквизита объекта на форму необходимо сам Объект тоже добавить в расширение.


Далее добавим новый Реквизит в подходящую Группу на форме.


Запустив 1С в режиме Предприятия убедимся, что новый Справочник появился в интерфейсе


А открыв элемент справочника Должности, увидим, что добавляемый реквизит Категория должности также в нужном месте.


Программное изменение Формы в расширении.

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

Предлагаю воспользоваться одной из процедур вызываемых в обработчике Формы «ПриСозданииНаСервере», в которую передается наша Форма в качестве параметра например УправлениеСвойствами.ПриСозданииНаСервере.


Перейдем в Общий модуль УправлениеСвойствами где находится данная процедура, и кликнем правой кнопкой мыши по процедуре ПриСозданииНаСервере. В выпадающем меню выберем пункт «Добавить в расширение»


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


Далее в добавленную процедуру поместим следующий код:


Готовое расширение можно выгрузить в файл перейдя в конфигураторе в меню «Конфигурация» и выбрать пункт «Расширения конфигурации». В открывшемся списке расширений по правой кнопкой мыши можно вызвать выпадающее меню, либо выбрать пункт командной панели «Конфигурация» и выбрать пункт «Сохранить конфигурацию в файл…». На выходе мы получим Файл типа *.cfe который можно передать заказчику.


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

Читайте также: