Я Иван Кузьминов, ведущий разработчик 1С и тимлид компании Programming Store.
В этой статье я расскажу, как в конфигурации 1С:ERP 2.5 при начале работы системы настроить открытие своих нетиповых форм (в том числе и из внешних обработок).
Данную методику можно использовать как на тонком клиенте, так и на мобильном или веб-клиенте, а также в мобильном приложении.
Содержание:
2. Настройка открытия нетиповой обработки при начале работы системы.
3. Настройка открытия нетиповой ВНЕШНЕЙ обработки при начале работы системы.
- Регистр сведений НастройкиОткрытияФормПриНачалеРаботыСистемы
- Общий модуль ОткрытиеФормПриНачалеРаботыСистемыКлиентСерверПереопределяемый процедура НастройкиФормы()
- Перечисление ФормыОткрываемыеПриНачалеРаботыСистемы
- Новая роль
- Новая обработка в конфигурации
- Новая внешняя обработка
Доработку типовых механизмов будем вести в расширении. На момент написания статьи версия ERP - 2.5.17.155.
Часть 1. Настройка открытия нетиповой обработки при начале работы системы
- Создаем новую обработку в дереве конфигурации. Назовем ее Расш_НачальнаяОбработка. Добавляем в нее новую форму “Форма”. В рамках этой части задачи важно лишь наличие формы и ее имя. Структура формы не имеет значения.
- Создаем новую роль. Назовем ее Расш_ИспользованиеНачальнойОбработки. Синоним – Использование начальной обработки. Даем права на использование и просмотр обработке из п.1.
По этой роли надо будет настроить группы доступа. Но об этом чуть позже.
- Переносим перечисление ФормыОткрываемыеПриНачалеРаботыСистемы в расширение и в это перечисление добавляем новое значение, равное имени обработки из п. 1 - Расш_НачальнаяОбработка.
- В общем модуле ОткрытиеФормПриНачалеРаботыСистемыКлиентСерверПереопределяемый ищем функцию НастройкиФормы().
Переносим ее в расширение с типом вызова вызывать вместо (изменение и контроль) и вставляем след. код (наша доработка окаймлена метками #Вставка #КонецВставки):
#Вставка ИначеЕсли Форма = ПредопределенноеЗначение("Перечисление.ФормыОткрываемыеПриНачалеРаботыСистемы.Расш_НачальнаяОбработка") Тогда СтруктураПараметров.Вставить("ИмяЗапускаемойФормы", "Обработка.Расш_НачальнаяОбработка.Форма.Форма"); СтруктураПараметров.Вставить("Роль", "Расш_ИспользованиеНачальнойОбработки"); СтруктураПараметров.Вставить("ПараметрЗапуска", "rash_UseProcessing"); #КонецВставки
Функция настройкиФормы() приобретает следующий вид:
&ИзменениеИКонтроль("НастройкиФормы")
Функция Расш_НастройкиФормы(Форма)
СтруктураПараметров = ОписаниеНастроекФормы();
Если Форма = ПредопределенноеЗначение("Перечисление.ФормыОткрываемыеПриНачалеРаботыСистемы.ПомощникПродаж") Тогда
СтруктураПараметров.Вставить("ИмяЗапускаемойФормы", "Обработка.ПомощникПродаж.Форма.Форма");
СтруктураПараметров.Вставить("Роль", "ИспользованиеПомощникаПродаж");
СтруктураПараметров.Вставить("ПараметрЗапуска", "SaleAssistant");
ИначеЕсли Форма = ПредопределенноеЗначение("Перечисление.ФормыОткрываемыеПриНачалеРаботыСистемы.РабочееМестоРаботникаСклада") Тогда
СтруктураПараметров.Вставить("ИмяЗапускаемойФормы", "Обработка.РабочееМестоРаботникаСклада.Форма.ФормаРабочегоМеста");
СтруктураПараметров.Вставить("Роль", "ИспользованиеРабочегоМестаРаботникаСклада");
СтруктураПараметров.Вставить("ПараметрЗапуска", "WarehouseMobileWorkplace");
СтруктураПараметров.Вставить("НеобходимыНастройки", Истина);
СтруктураПараметров.Вставить("ИмяФормыНастроек", "Обработка.РабочееМестоРаботникаСклада.Форма.НастройкиПараметров");
ИначеЕсли Форма = ПредопределенноеЗначение("Перечисление.ФормыОткрываемыеПриНачалеРаботыСистемы.ЧекККМ") Тогда
СтруктураПараметров.Вставить("ИмяЗапускаемойФормы", "Документ.ЧекККМ.Форма.ФормаДокументаРМК");
СтруктураПараметров.Вставить("Роль", "ДобавлениеИзменениеЧековККМ");
СтруктураПараметров.Вставить("ПараметрЗапуска", "CashRegisterReceipt");
ИначеЕсли Форма = ПредопределенноеЗначение("Перечисление.ФормыОткрываемыеПриНачалеРаботыСистемы.РабочееМестоМенеджераПоДоставке") Тогда
СтруктураПараметров.Вставить("ИмяЗапускаемойФормы", "Обработка.РабочееМестоМенеджераПоДоставке.Форма.Форма");
СтруктураПараметров.Вставить("Роль", "ИспользованиеРабочегоМестаДоставки");
СтруктураПараметров.Вставить("ПараметрЗапуска", "DeliveryWorkplace");
//++ НЕ УТКА
ИначеЕсли Форма = ПредопределенноеЗначение("Перечисление.ФормыОткрываемыеПриНачалеРаботыСистемы.РабочееМестоВыполнениеОпераций") Тогда
СтруктураПараметров.Вставить("ИмяЗапускаемойФормы", "Обработка.ВыполнениеОпераций2_2.Форма.МобильноеПриложениеНачальнаяСтраница");
СтруктураПараметров.Вставить("Роль", "ИспользованиеРабочегоМестаВыполнениеОпераций");
СтруктураПараметров.Вставить("ПараметрЗапуска", "ShopFloorManagement");
СтруктураПараметров.Вставить("НеобходимыНастройки", Истина);
СтруктураПараметров.Вставить("ИмяФормыНастроек", "Обработка.ВыполнениеОпераций2_2.Форма.НастройкаПараметровРабочегоМеста");
//-- НЕ УТКА
ИначеЕсли Форма = ПредопределенноеЗначение("Перечисление.ФормыОткрываемыеПриНачалеРаботыСистемы.МобильноеРабочееМестоСборкиИКурьерскойДоставки") Тогда
СтруктураПараметров.Вставить("ИмяЗапускаемойФормы", "Обработка.МобильноеРабочееМестоСборкиИКурьерскойДоставки.Форма.РабочийСтол");
СтруктураПараметров.Вставить("Роль", "ИспользованиеРабочегоМестаСборкиИКурьерскойДоставки");
СтруктураПараметров.Вставить("ПараметрЗапуска", "AssemblyAndCourierDeliveryWorkplace");
ИначеЕсли Форма = ПредопределенноеЗначение("Перечисление.ФормыОткрываемыеПриНачалеРаботыСистемы.МобильноеРабочееМестоКладовщика") Тогда
СтруктураПараметров.Вставить("ИмяЗапускаемойФормы", "Обработка.МобильноеРабочееМестоКладовщика.Форма.РабочийСтол");
СтруктураПараметров.Вставить("Роль", "ИспользованиеРабочегоМестаКладовщика");
СтруктураПараметров.Вставить("ПараметрЗапуска", "WarehouseWorkplace");
ИначеЕсли Форма = ПредопределенноеЗначение("Перечисление.ФормыОткрываемыеПриНачалеРаботыСистемы.МониторЦелевыхПоказателей") Тогда
СтруктураПараметров.Вставить("ИмяЗапускаемойФормы", "Отчет.МониторЦелевыхПоказателей.Форма.ФормаМониторЦелевыхПоказателей");
СтруктураПараметров.Вставить("Роль", "РазделОтчетыИМониторингЦелевыеПоказатели");
СтруктураПараметров.Вставить("ПараметрЗапуска", "PerformanceDashboard");
#Вставка
ИначеЕсли Форма = ПредопределенноеЗначение("Перечисление.ФормыОткрываемыеПриНачалеРаботыСистемы.Расш_НачальнаяОбработка") Тогда
СтруктураПараметров.Вставить("ИмяЗапускаемойФормы", "Обработка. Расш_ НачальнаяОбработка.Форма.Форма");
СтруктураПараметров.Вставить("Роль", " Расш_ИспользованиеНачальнойОбработки");
СтруктураПараметров.Вставить("ПараметрЗапуска", "rash_UseProcessing ");
#КонецВставки
КонецЕсли;
Возврат СтруктураПараметров;
КонецФункции
Обратим внимание на Ключ "ПараметрЗапуска". О нем поговорим чуть позже.
- Обновляем базу.
- Заходим в режим предприятия. Для роли из п.2 создаем профиль и группу доступа.
Создаем профиль с ролью из п.2.
Создаем группу доступа по этому профилю. Добавляем пользователей.
- После создания профиля и группы доступа по п.6 появится настройка открытия нашей обработки. Настройку можно увидеть в карточке пользователя по этой гиперссылке. Данные настроек хранятся в регистре сведений НастройкиОткрытияФормПриНачалеРаботыСистемы.
- Заходим в настройку, ставим галочку “открывать по умолчанию”.
- Кликаем “Записать и закрыть”. Галочка установлена
- Перезаходим в базу. Наша форма действительно открывается при начале работы системы. Задача решена!
В п.4. мы упоминали про ключ “ПараметрЗапуска”. Так вот если базу запустить с этим параметром запуска, то галочку из п. 8 ставить необязательно.
ВАЖНО! На мобильном клиенте данная особенность может не работать.
Часть 2. Настройка открытия нетиповой ВНЕШНЕЙ обработки при начале работы системы
Часто бывает, что необходимо быстрое изменение обработки, а штатное обновление базы происходит всего 1-2 раза в неделю.
Немного доработаем нашу обработку, чтобы при начале работы системы открывалась внешняя обработка.
- В форму “Форма” обработки Расш_НачальнаяОбработка добавим реквизит
ИмяОбработкиСлужебное. Тип - строка неограниченной длины.
- В модуль формы добавим следующий код:
Не забываем добавить обработчики событий ПриСозданииНаСервере, ПриОткрытии и ПередЗакрытием.
#Область ОбработчикиСобытийФормы
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЭтотОбъект.Закрыть();
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если Не Отказ Тогда
ОткрытьНовуюФорму();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ИмяОбработки = РеквизитФормыВЗначение("Объект").Метаданные().Имя;
ПостФикс = "ВО";
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ДопОтчетыИОбработки.Ссылка КАК Ссылка
|ИЗ
| Справочник.ДополнительныеОтчетыИОбработки КАК ДопОтчетыИОбработки
|ГДЕ
| ДопОтчетыИОбработки.ИмяОбъекта = &ИмяОбработки
| И ДопОтчетыИОбработки.Публикация =
| ЗНАЧЕНИЕ(Перечисление.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется)";
Запрос.УстановитьПараметр("ИмяОбработки", СтрШаблон("%1_%2", ИмяОбработки, Постфикс));
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Отказ = Истина;
Иначе
Выборка = Результат.Выбрать();
Выборка.Следующий();
ИмяОбработкиСлужебное =
ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(Выборка.Ссылка);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
Процедура ОткрытьНовуюФорму()
ИмяФормы = СтрШаблон("ВнешняяОбработка.%1.Форма.Форма", ИмяОбработкиСлужебное);
ОткрытьФорму(ИмяФормы);
КонецПроцедуры
#КонецОбласти
Как нетрудно догадаться, здесь мы открываем форму внешней обработки из справочника доп. отчетов и обработок через форму нашей обработки Расш_НачальнаяОбработка.
ВАЖНО!
Во избежание лишнего “хардкода” для внешней обработки должны выполняться 3 условия:
- Имя объекта в справочнике доп. отчетов и обработок должно совпадать с именем обработки конфигурации, из которой она открывается + постфикс (значение указано в коде).
В качестве постфикса можно использовать любое строковое значение быть пробелов и спецсимволов. - Настройка публикации – используется
- Наименование формы внешней обработки должно быть “Форма”
- С соблюдением условий выше создаем внешнюю обработку и сохраняем ее в справочник доп. отчетов и обработок.
Таким образом, при начале работы системы будет открываться уже внешняя обработка.
Аналогичным образом можно добавлять и другие обработки. Пропишем плюсы и минусы фичи.
Достоинства:
- Способ не требует вмешательства в основную конфигурацию и подходит для расширений.
- Максимально эффективное использование типовых механизмов с минимумом изменений.
- Простая и быстрая реализация.
- Работает как на тонком клиенте, так и на мобильном или веб-клиенте, а так же в мобильном приложении.
- В случае внешних обработок есть возможность быстрого внесения изменений без обновления базы.
Недостатки:
- В расширении в общем модуле используются тип вызова вызывать вместо (изменение и контроль).
На этом все :)