Молочников Олег Spb. 2024
Хитрости создания расширений для конфигураций на БСП. Часть 1.
Рассмотрим пример создания расширения от начала и до конца на примере создания расширения: Подсистема "Входной контроль" для ERP 2.4, УТ 11
Для начала создадим в расширении подсистему, которая будет отображаться в интерфейсе и назовем ее, к примеру, “Входной контроль”. Далее следует вполне рутинная работа по программированию документов, справочников, обработок и других объектов нашей системы.
И вот тут начинаются наши особенности. Первое, что нам нужно сделать, это добавить две роли, на чтение и запись наших объектов, для того, чтоб к ним могли иметь доступ пользователи без полных прав:
Если мы оставим, как есть, то наша подсистема не будет доступна пользователям с полными правами, несмотря на наличие любых других прав. Чтобы этого избежать, достаточно включить в расширение роль “полные права” и дать ей права на наши объекты.
Создание на основании
Далее по логике системы документ “Акт входного контроля ” может вводиться на основании документа “Приобретение товаров услуг”. Необходимо, чтоб в списке документов, которые можно создать на основании Приобретение товаров услуг” был и наш документ.
Затянем в нашу конфигурацию модуль : “СозданиеНаОснованииПереопределяемый” и добавим примерно следующий код, только для ваших объектов.
&После("ПриОпределенииОбъектовСКомандамиСозданияНаОсновании")
// Определяет список объектов конфигурации, в модулях менеджеров которых предусмотрена процедура
// ДобавитьКомандыСозданияНаОсновании, формирующая команды создания на основании объектов.
// Синтаксис процедуры ДобавитьКомандыСозданияНаОсновании см. в документации.
//
// Параметры:
// Объекты — Массив — объекты метаданных (ОбъектМетаданных) с командами создания на основании.
//
// Пример:
// Объекты.Добавить(Метаданные.Справочники.Организации);
//
Процедура ВК_ПриОпределенииОбъектовСКомандамиСозданияНаОсновании(Объекты) Экспорт
Объекты.Добавить(Метаданные.Документы.мо_АктВходногоКонтроля);
Объекты.Добавить(Метаданные.Документы.мо_АктОНепрохождениеВходногоКонтроля);
КонецПроцедуры
Наша функция не переписывает системную процедуру, а только вызывается после нее и слегка дорабатывает результат, включая его в наши объекты, так что это не скажется на обновлениях.
В модуле менеджера документа надо добавить примерно следующий код:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область СлужебныеПроцедурыИФункции
// Определяет список команд создания на основании.
//
// Параметры:
// КомандыСозданияНаОсновании - ТаблицаЗначений - Таблица с командами создания на основании. Для изменения.
// См. описание 1 параметра процедуры СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании().
// Параметры - Структура - Вспомогательные параметры. Для чтения.
// См. описание 2 параметра процедуры СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании().
//
Процедура ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры) Экспорт
КонецПроцедуры
// Добавляет команду создания документа "Упаковочный лист".
//
// Параметры:
// КомандыСозданияНаОсновании - ТаблицаЗначений - Таблица с командами создания на основании. Для изменения.
// См. описание 1 параметра процедуры СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании().
//
Функция ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании) Экспорт
Если ПравоДоступа("Добавление", Метаданные.Документы.мо_АктВходногоКонтроля) Тогда
КомандаСоздатьНаОсновании = КомандыСозданияНаОсновании.Добавить();
КомандаСоздатьНаОсновании.Менеджер = Метаданные.Документы.мо_АктВходногоКонтроля.ПолноеИмя();
КомандаСоздатьНаОсновании.Представление = ОбщегоНазначенияУТ.ПредставлениеОбъекта(Метаданные.Документы.мо_АктВходногоКонтроля);
КомандаСоздатьНаОсновании.РежимЗаписи = "Проводить";
Возврат КомандаСоздатьНаОсновании;
КонецЕсли;
Возврат Неопределено;
КонецФункции
// Определяет список команд отчетов.
//
// Параметры:
// КомандыОтчетов - ТаблицаЗначений - Таблица с командами отчетов. Для изменения.
// См. описание 1 параметра процедуры ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов().
// Параметры - Структура - Вспомогательные параметры. Для чтения.
// См. описание 2 параметра процедуры ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов().
//
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
Возврат; //В дальнейшем будет добавлен код команд
КонецПроцедуры
#Область Печать
#КонецОбласти
#КонецОбласти
#КонецЕсли
Команды печати
Наш документ “Акт о непрохождении входного контроля” имеет печаную форму.
Необходимо, чтоб она выводилась на форме в командах печати.
Создайте на форме подменю печати:
В модуле формы создайте следующие процедуры:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// СтандартныеПодсистемы.ПодключаемыеКоманды
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры
// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Объект, Результат);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
Убедитесь, что процедура ПриСозданииНаСервере вызывается при вызове формы.
Затянем в нашу конфигурацию модуль : “ УправлениеПечатьюПереопределяемый” и добавим примерно следующий код, только для ваших объектов:
&После("ПриОпределенииОбъектовСКомандамиПечати")
// Определяет объекты конфигурации, в модулях менеджеров которых размещена процедура ДобавитьКомандыПечати,
// формирующая список команд печати, предоставляемых этим объектом.
// Синтаксис процедуры ДобавитьКомандыПечати см. в документации к подсистеме.
//
// Параметры:
// СписокОбъектов — Массив — менеджеры объектов с процедурой ДобавитьКомандыПечати.
//
Процедура ВК_ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
СписокОбъектов.Добавить(Документы.мо_АктОНепрохождениеВходногоКонтроля);
КонецПроцедуры
В модуле менеджера в область “Печать” надо прописать примерно следующий код:
#Область Печать
// Заполняет список команд печати.
//
// Параметры:
// КомандыПечати — ТаблицаЗначений — состав полей см. в функции УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "Акт прохождения входного контроля";
КомандаПечати.Представление = НСтр("ru = ‘Акт прохождения входного контроля’");
КомандаПечати.ПроверкаПроведенияПередПечатью = Ложь;
КонецПроцедуры
// Сформировать печатные формы объектов
//
// ВХОДЯЩИЕ:
// ИменаМакетов — Строка — Имена макетов, перечисленные через запятую
// МассивОбъектов — Массив — Массив ссылок на объекты которые нужно распечатать
// ПараметрыПечати — Структура — Структура дополнительных параметров печати
//
// ИСХОДЯЩИЕ:
// КоллекцияПечатныхФорм — Таблица значений — Сформированные табличные документы
// ПараметрыВывода — Структура — Параметры сформированных табличных документов
//
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "Акт прохождения входного контроля") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "Акт прохождения входного контроля", НСтр("ru = ‘Акт прохождения входного контроля’"), СформироватьПечатнуюФормуАктПрохожденияВходногоКонтроля(МассивОбъектов, ОбъектыПечати, ПараметрыПечати));
КонецЕсли;
ФормированиеПечатныхФорм.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов, КоллекцияПечатныхФорм);
КонецПроцедуры
Функция СформироватьПечатнуюФормуАктПрохожденияВходногоКонтроля(МассивОбъектов, ОбъектыПечати, ПараметрыПечати = Неопределено)
//Ваш код
Возврат ТабДок;
КонецФункции
#КонецОбласти
Не забудьте снять галочку "Безопасный режим". Удачи!
Продолжение Часть 2: //infostart.ru/public/1044424/
Получившиеся расширение гарантированно будет работать на платформе 8.3 (тестировано на релизе 8.3.13.1644) 1С:ERP Управление предприятием 2 (3.1.8.216) и Управление торговлей, редакция 11 (11.4.6.188) Режим совместимости Версия 8.3.12 и выше.
Акция! Вы можете скачать архив всех моих разработок, которые я предлагаю за StartMone, по Специальной цене: //infostart.ru/public/960899/#archive
P.S.: Надеюсь, вам понравится эта и другие мои статьи и разработки на //infostart.ru/profile/48714/.
Молочников Олег Spb. 2024
(0) Оформите, пожалуйста, код в виде блока код, чтобы раскрасить его автоматом и убрать лишние пустые строки
ну что в копилку — должно пригодиться
Спасибо. Пригодится.
В чем ньюансы то? Напиши в самом начале что решает этот этюд.
Вы включили полные права в зависимости расширения. При каждом обновлении они будут изменяться. Расширение гарантированно не будет работать после первого же обновления конфигурации?
(5) Нет. В расширении вы можете настроить для затянутой роли права доступа только на объекты расширения. Другие не затрагиваются.
Режим совместимости вручную меняли?
Если я включу возможность изменения конфигурации, то и так могу документы-справочники добавить. В чем тогда смысл расширения?
Когда уже в типовой режим совместимости уберут??
(7)
Режим совместимости нужен, чтоб возможности новых версий платформы не мешали работать старому коду. Режим совместимости Версия 8.3.12+ означает, что я использую в расширении возможности, которые появились с платформы 8.3.12. Во всех конфигурация которые рассчитаны на эту и более поздние версии платформы мое расширение будет работать, может быть только понадобиться поменять режим совместимости, чтобы он соответствовал конфигурации. Для более ранних конфигураций я сделал конфигурацию для объединения.
При этом вы усложните поддержку конфигурации. В новые конфигурации некоторые изменения придется переносить вручную при каждом обновлении, особенно если затрагиваются процедуры модулей.
Расширение не требует рутинной работы, механизмы контроля предупредят о критических изменениях.
Расширений может быть неограниченное количество, их легко распространять и администрировать.
Никогда. Это удобный механизм контроля совместимости версий платформы, конфигураций, расширений.