1С 8.3 Расширения
Данные > Примеры кода 1С > 1С 8.3 Расширения
Расширения в 1С 8.3 - это микро конфигурации в формате xml (текст с тегами) которые позволяют дополнить существующую конфигурацию (вклиниться) в виде слоя. Расширения в 1С 8.3 являются одновременно и данными, и метаданными. В одной конфигурации может быть N-е количество и зависимости друг от друга заранее неизвестно. В основном имеет смысл использовать в типовых конфигурациях (на поддержке). Расширение является своеобразным "клином", который можно мигрировать из одной информационной базы в другую.
//* - Работа с механизмом расширения тестировалась на конфигурации 1С 8.3.19.
1. Создание:
Конфигуратор 1С - Меню - Конфигурация - Расширения конфигурации. При применении расширения контролируется порядковый номер версии при одинаковых ID (применяется последняя версия). Имя, синоним, префикс - называем как нам удобно.
Назначение:
- Исправление - применяются на конфигурацию поставщика (вклинивание в логику поставщика bug fix, инъекция в код).
- Адаптация - в логику кода не вмешиваемся. Адаптация без изменения логики и зависит от конфигурации поставщика.
- Дополнение - полностью независимое решение. Автономное решение без связки с конфигурацией поставщика.
Признаки:
- Активно - расширение используется. Если будет ошибка применения - признак автоматически отключится.
- Безопасный режим - влияет на работу в клиент-серверной версии. Актуально только для профилей безопасности SQL (разрешения к доступу).
- Защита от опасных действий - запрещает обращение к серверным модулям, открытие внешних отчетов, работа с интернетом. Аналогично параметрам пользователя
- Используется в распределенной ИБ - миграция расширения по распределенным узлам
- Область действия - использование БД целиком или с разделителями для различных технологий (например, для облаков)
- Использовать основные роли для всех пользователей - Рекомендуется ее отключить т.к. значительно влияет на производительность. Для всех пользователей создастся дополнительная роль (с префиксом) расширения и будет применятся. Роли пользователя в основной конфигурации будут иметь приоритет.
Применение в режиме 1С Предприятие:
- Применилось ли расширение можно увидеть в Меню - Справка - О программе "Конфигурация"
- Если расширений много и не конфликтуют друг с другом - они применяются последовательно по имени и/или версии.
- Отключать расширение (Функции для технического специалиста - Стандартные - Управление расширениями конфигурации) в можно в режиме 1С Предприятие, но при закрытом! конфигураторе. Иначе при попытке отключить признак "Активно" получаем ошибку: Не удалось заблокировать запись. Действие (изменение, удаление или блокировка записи не выполнено). Ошибка блокировки объекта. Объект уже заблокирован: ... После отключения расширения необходим перезапуск пользователя.
2. Принцип разработки:
- Рекомендуется дробить расширения. Создавать на каждый объект своё, так проще контролировать применение и фиксировать ошибки, т.к. при конфликте в режиме 1С Предприятие расширение автоматически отключается.
- Найти пересечения по объектам невозможно. Поэтому расширения должны быть автономны.
- Для новой печатной формы или нового отчета/обработки рекомендуется первично использовать БСП так как количество расширение негативно влияет на производительность
- При удалении расширения сопутствующие данные удаляются без возможности восстановления
- Работать с метаданными основного поставщика не рекомендуется
- Система не поддерживает зависимость объектов в конфигурации поставщика. Применяет слои в порядке их очередности (последовательно), по списку (если они друг с другом не конфликтуют). Первыми будут применятся Исправление, потом Адаптация, а самые последние Дополнение. Далее в списке происходит сортировка по Имени и Версии расширения:Конфигурация поставщикаСлой №1Слой №2...
- Доступно меню для администрирования расширения:
Инъекции в программный код (вклинивание):
1. Создаем расширение (Адаптация)
2. Заимствуем форму документа (родительского объекта)
3. Вклиниваемся в событие и переопределяем его - добавляем в расширение Alt+Shift+F2
4. Выбираем Тип вызова:
- Вызывать перед - перехватчик будет выполнен до того, как начнётся выполнение типового метода.
- Вызывать после - перехватчик будет выполнен после того, как выполнится типовой метод.
- Вызывать вместо - типовой метод вообще не будет выполнен. Вместо него выполнится только ваш перехватчик. ПродолжитьВызов() - если вы вызовете этот метод внутри своей функции-перехватчика, то исполнится та функция, которую вы перекрыли, после чего исполнение кода вернётся в ваш перехватчик:
- Вызывать вместо (с контролем) - упрощает обновление расширений, теперь платформа будет контролировать неизменность кода в вынесенной в расширение процедуры. .
Аннотации &Перед, &После
Аннотация &Вместо
! Порядок кода должен быть именно таким (иначе работать не будет) !
&ИзменениеИКонтроль("ПересчетТаблицы")
&НаКлиенте
Функция Расш1_ПересчетТаблицы(Табл)
&НаКлиенте
Функция Расш1_ПересчетТаблицы(Табл)
FAQ при разработке объектов и их форм в расширениях:
- При изменении существующего или добавлении нового реквизита основной конфигурации через заимствование в расширение. Система создаст новую таблицу чтение которой будет производится через основную таблицу. Поэтому при переопределении свойств реквизита (например: увеличение длины цены с 10 до 12 символов) не рекомендуется использовать заимствование объекта, а создать автономный, новый (в расширении) и работать с ним для исключения конфликтов (как заимствованные объекты). В этом случаем система создаст новую независимую таблицу. Например, также можно реализовывать через Регистр сведений или подчиненный справочник с нужными реквизитами. К баг фиксам данная рекомендация не относится!
- Для переноса данных из основной конфигурации в расширение нужно писать обработку (через внешний источник (*.xml, *.bdf и т.п.) или дежурный регистр).
- При добавлении в расширение из осн.конфигурации реквизита составного типа система заимствует все объекты
- Если объект контролируемый (установлен признак). Система не применит расширение если основной поставщик изменит значение объекта.
В режиме 1С получим ошибку: "Ошибка применения расширения конфигурации. Имя: *****
Критичная: Значение контролируемого свойства Тип у объекта ***** не совпадает со значением в расширяемой конфигурации"
Также можно установить у объекта свойство: Проверять значение при подключении расширения, не запрещать подключение расширения:
- Просмотреть работает ли расширение в пользовательском режиме 1С: Меню - Сервис и настройки - О программе (Расширения конфигурации:).
- Отключить расширения в пользовательском режиме 1С (с правами Администратора): Меню - Сервис и настройки - Функции для технического специалиста - Стандартные - Управление расширениями конфигурации - Снять галки с ненужного расширения (Делать это нужно при закрытом конфигураторе и для применения нужен перезапуск сеанса).
Оглавление:
Частичное изменение метода с помощью аннотации ИзменениеИКонтроль в 1С 8.3:
Функция ПересчетТабличнойЧасти(КолСтрок) // Исходная функция (с ошибкой)
Для Индекс = 1 По КолСтрок Цикл
Сумма = Цена / Количество;
КонецЦикла;
Возврат Сумма;
КонецФункции
&ИзменениеИКонтроль("ПересчетТабличнойЧасти")
Функция Расш1_ПересчетТабличнойЧасти(КолСтрок) // Исправляющая функция
Результат = 1;
Для Индекс = 1 По КолСтрок Цикл
// с помощью директив препроцессора #Вставка … #КонецВставки и #Удаление … #КонецУдаления
// выделяются части кода, которые необходимо добавить и удалить
#Удаление
Сумма = Цена / Количество;
#КонецУдаления
#Вставка
Сумма = Цена * Количество;
#КонецВставки
КонецЦикла;
Возврат Сумма;
КонецФункции
Для Индекс = 1 По КолСтрок Цикл
Сумма = Цена / Количество;
КонецЦикла;
Возврат Сумма;
КонецФункции
&ИзменениеИКонтроль("ПересчетТабличнойЧасти")
Функция Расш1_ПересчетТабличнойЧасти(КолСтрок) // Исправляющая функция
Результат = 1;
Для Индекс = 1 По КолСтрок Цикл
// с помощью директив препроцессора #Вставка … #КонецВставки и #Удаление … #КонецУдаления
// выделяются части кода, которые необходимо добавить и удалить
#Удаление
Сумма = Цена / Количество;
#КонецУдаления
#Вставка
Сумма = Цена * Количество;
#КонецВставки
КонецЦикла;
Возврат Сумма;
КонецФункции
Изменение метода с помощью аннотации Вместо в 1С 8.3:
&Вместо("РассчитатьСумму")
Процедура Расш1_РассчитатьСумму(СтрокаТЧ)
//Введена сумма строки, нужно пересчитать цену с сумму скидки
СтрокаТЧ.Сумма = СтрокаТЧ.Цена * СтрокаТЧ.Количество;
Если СтрокаТЧ.Свойство("СуммаСкидки") Тогда
СтрокаТЧ.СуммаСкидки = СтрокаТЧ.СуммаСкидкиНаценки;
КонецЕсли;
РассчитатьСуммуНДСИВсего(СтрокаТЧ); //Далее
// текст метода
КонецПроцедуры
Процедура Расш1_РассчитатьСумму(СтрокаТЧ)
//Введена сумма строки, нужно пересчитать цену с сумму скидки
СтрокаТЧ.Сумма = СтрокаТЧ.Цена * СтрокаТЧ.Количество;
Если СтрокаТЧ.Свойство("СуммаСкидки") Тогда
СтрокаТЧ.СуммаСкидки = СтрокаТЧ.СуммаСкидкиНаценки;
КонецЕсли;
РассчитатьСуммуНДСИВсего(СтрокаТЧ); //Далее
// текст метода
КонецПроцедуры
Метод ПродолжитьВызов() в 1С 8.3:
&Вместо("РассчитатьСумму")
Функция Расш1_РассчитатьСумму(СтрокаТЧ)
// Выполним код типовой функции.
Результат = ПродолжитьВызов(СтрокаТЧ);
Если Результат=0 Тогда // Сумма не расчитана, выполняем расчет здесь
//Введена сумма строки, нужно пересчитать цену с сумму скидки
СтрокаТЧ.Сумма = СтрокаТЧ.Цена * СтрокаТЧ.Количество;
Если СтрокаТЧ.Свойство("СуммаСкидки") Тогда
СтрокаТЧ.СуммаСкидки = СтрокаТЧ.СуммаСкидкиНаценки;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция Расш1_РассчитатьСумму(СтрокаТЧ)
// Выполним код типовой функции.
Результат = ПродолжитьВызов(СтрокаТЧ);
Если Результат=0 Тогда // Сумма не расчитана, выполняем расчет здесь
//Введена сумма строки, нужно пересчитать цену с сумму скидки
СтрокаТЧ.Сумма = СтрокаТЧ.Цена * СтрокаТЧ.Количество;
Если СтрокаТЧ.Свойство("СуммаСкидки") Тогда
СтрокаТЧ.СуммаСкидки = СтрокаТЧ.СуммаСкидкиНаценки;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Конструктор запроса в расширении в 1С 8.3 (лайфхак от канала Желтый чайник 1С):
В модулях расширения конструктор запроса видит только те метаданные, которые есть в этом расширении.
Но часто приходится делать залипушку, которое просто подменит пару методов конфигурации. И добавлять в расширение все объекты и их поля не очень удобно. Что же делать? 🤔
1. Использовать внешнюю обработку.
Просто создаем внешнюю обработку, копируем в неё модуль\метод\кусок кода и открываем конструктор запроса. Потом переносим обратно.
2. Использовать шаблон текста
Интересно, что если открывать конструктор запроса из шаблона текста, то он работает в контексте основной конфигурации. А значит и видит метаданные конфигурации.
Простой шаблон текста:
"<?"", ТекстЗапроса>"
Его так же можно включить в контекстное меню.
3. Редактировать запрос в режиме Предприятия
Оба метода выше видят только те метаданные, что есть в конфигурации.
Но если запустить конструктор в режиме Предприятия, то сможем писать запрос, обращаясь ко всем существующим в ИБ данным.
Вот только придётся либо открывать в обычных формах, либо пользоваться так не полюбившимся 1Сникам "тонким конструктором".
Ну или пользоваться альтернативами (например, IS Toolkit).
Официальная документация по расширениям (при наличии подписки ИТС) https://its.1c.ru/db/v8318doc#bookmark:dev:TI000001513
💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом #Расширения:
📰 Актуальные новости Шаблоны (готовые модели) кода 1С 8.3 с тегом #Расширения:
- реализована поддержка журналов документов и XDTO-пакетов в расширениях.
В версии 8.3.24
- реализована поддержка внешних источников данных.
- добавлен функционал тестирования и исправления логической целостности расширений конфигурации.
- улучшена производительность расширения макетов табличного документа
- появилась возможность создавать регламентные задания в расширениях конфигурации.
- реализована доступность в редакторе запросов расширения объектов основной конфигурации.
- анонсирована возможность по файлу расширения конфигурации программно получить основные параметры расширения, которое будет из него установлено.
- сокращение объема памяти, потребляемого подсистемой XDTO в инфобазе с расширениями. Дедупликация объектов, не модифицированных расширенной фабрикой.
- анонсирована возможность по файлу расширения конфигурации программно получить основные параметры расширения, которое будет из него установлено.
- анонсирована возможность изменения параметров номеров и кодов объектов в расширениях конфигурации.
1
комментарий
Геннадий
13 окт 2022
ДД, в очередной раз пользуюсь Вашими "примерами" (это, по-моему, больше чем примеры) и хочу выразить огромную благодарность: всё всегда по-существу, четко, грамотно!
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник