Экстренные изменения в модулях без обновления конфигурации (8.х)

Администрирование - Системное

"Уважаемые пользователи, просим всех в 9.30 выйти из 1С для обновления (потому что Сергей Степанов лопух)" или "Давай ты на втором этаже отделы обзваниваешь, а я на третьем". Знакомо? Да, а как же. Кто ж не косячит, да так чтоб нужно было обновиться не вечером, а прямо сейчас в разгар рабочего дня. А если еще косяк в узле, а не в главной базе? Ну всяко бывает, не боги горшки обжигают. Но теперь все может стать иначе. Буквально за 5 минут вы сможете решить практически любую возникшую проблему без обновления конфигурации, будь то ошибка в любом модуле или просто срочная доработка. Но изменить структуру конфигурации вы, конечно, не сможете, тут уж извиняйте, придется выгонять всех. Как это работает?

Да очень просто. Нужно будет потратить пару-тройку часов на подготовку, почитать нескучный хелп, аккуратненько все накатить, попробовать что-то специально сломать и починить, чтобы во время боя уже было все знакомо и не отняло много времени. Принцип простой: в самое начало каждой процедуры добавляете 4 строки. Хотя нет. Давайте с самого начала. Предположим есть у вас процедура в общем модуле, которая висит на подписке "ПриЗаписи" любого документа, но обрабатывает пока только Заказ.

Процедура ПриЗаписиДокументов(Источник, Отказ) Экспорт

	Если ТипЗнч(Источник) = Тип("ДокументОбъект.ЗаказПоставщику") Тогда
		ПриЗаписиДокументаЗаказПоставщику(Источник, Отказ);
	КонецЕсли;

КонецПроцедуры

И вот потребовалось нам еще и Платежку обрабатывать при записи или ошибка появилась при обработке Заказа. Причем все это нужно сделать в одном из узлов и прямо сейчас. Что делать? Вариантов несколько, как мы знаем:

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

2. Рискнуть и обновиться динамически. Хм. Вариант. Особенно, если работа надоела, то почему бы и нет.

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

Итак, готовим конфигу. Сделать это можно вручную или автоматом (подробнее в хелпе). Добавляем в начало каждого модуля 4 строки и получаем что-то следующее:

Процедура ПриЗаписиДокументов(Источник, Отказ) Экспорт

	//+ Вставка вызова экстренной процедуры
	СтруктураЭП = Новый Структура("Источник, Отказ", Источник, Отказ);
	Если ЭкстренныеОбновления.ВыполнитьПроцедуру("ПодпискиНаСобытия_ПриЗаписиДокументов", СтруктураЭП) Тогда
		//Если экстренная процедура выполнилась, то дальнейшее выполнение процедуры прерываем
		Возврат;
	КонецЕсли;
	//-

	Если ТипЗнч(Источник) = Тип("ДокументОбъект.ЗаказПоставщику") Тогда
		ПриЗаписиДокументаЗаказПоставщику(Источник, Отказ);
	КонецЕсли;

КонецПроцедуры

Вот теперь самое интересное. Настал момент, когда нам приспичило что-то изменить. Мы не материмся как обычно, а открываем специальный регистр сведений. Создаем в нем новую запись, выставляем настройки и прикручиваем к нему внешнюю обработку, в которой в модуле объекта пишем что-то типа того:

Процедура ВыполнитьЭкстреннуюПроцедуру(СтруктураЭП) Экспорт

    Источник = СтруктураЭП.Источник; 
    Отказ = СтруктураЭП.Отказ;       

    Если ТипЗнч(Источник) = Тип("ДокументОбъект.ЗаказПоставщику") Тогда
        ПодпискиНаСобытия.ПриЗаписиДокументаЗаказПоставщику(Источник, Отказ);
    ИначеЕсли ТипЗнч(Источник) = Тип("ДокументОбъект.ПлатежноеПоручениеВходящее") Тогда
        //...
        //Ваш любой код
        //...
    КонецЕсли;

КонецПроцедуры

Т.е. мы оставили стандартную обработку Заказа и добавили обработку Платежки. Теперь мы ждем 10 минут, пока запустится оперативный обмен данными с узлами или запускаем его вручную или вообще все это делаем в узле, как уж удобнее по ситуации. А затем говорим пользователю, что все готово и ему даже перезапускать сеанс не нужно. Здорово? Конечно, здорово!

С производительностью проблем нет. При начале работы сеанса делается один простенький запрос с выбором только активных записей из нашего нового регистра сведений и все данные помещаются сначала в структуру, а потом в параметр сеанса, т.е. все висит в памяти, но много ее не отъедает. Когда выполняются те 4 строчки кода в каждом модуле, то там происходит поиск записи по идентификатору в параметре сеанса. Если запись есть, то управление передается сначала в новый общий модуль, а затем во внешнюю обработку или в команду Выполнить(). Да, тут есть варианты на ваше усмотрение, либо использовать внешнюю обработку, либо команду Выполнить(). Это все указывается в записи регистра сведений. И там и там есть свои ограничения, действуйте по ситуации. В команде Выполнить() нельзя использовать оператор Возврат, его нужно предварительно заменить на метку Перейти, а саму метку поставить в конец процедуры. Эта замена тоже предусмотрена и делается все автоматом, т.е. парсится код процедуры и если есть Возврат, то он заменяется на Перейти ~ПерейтиВозврат; в конец процедуры добавляется ~ПерейтиВозврат:. При использовании команды Выполнить() не нужно передавать контекст. А при использовании внешней обработки нет проблем с оператором Возврат, но зато нужно передавать в нее весь необходимый контекст. Давайте покажу коротенький пример с командой Выполнить().

Имеем в какой-то процедуре такой код, в котором возникает ошибка деления на 0:

Если Источник.Дата <= Дата('20150101') Тогда
	Возврат;
КонецЕсли;

//В этом коде возникает ошибка деления на 0, будем ее исправлять
Источник.Прибыльность = Источник.СуммаВыручки / Источник.СуммаЗатрат;

Копируем этот текст в нашу запись регистра сведений и нажимаем волшебную кнопку "Заменить Возвраты". Получаем такой код:

Если Источник.Дата <= Дата('20150101') Тогда
	//Автозамена Возврата на метку ~ПерейтиВозврат
	Перейти ~ПерейтиВозврат;
КонецЕсли;

//В этом коде возникает ошибка деления на 0, будем ее исправлять
Источник.Прибыльность = Источник.СуммаВыручки / Источник.СуммаЗатрат;

//Добавляется метка в конец процедуры
~ПерейтиВозврат:

Остается только исправить ошибку, что мы и делаем:

Если Источник.Дата <= Дата('20150101') Тогда
	//Автозамена Возврата на метку ~ПерейтиВозврат
	Перейти ~ПерейтиВозврат;
КонецЕсли;

//Исправляем ошибку деления на 0
Если Источник.СуммаЗатрат <> 0 Тогда
	Источник.Прибыльность = Источник.СуммаВыручки / Источник.СуммаЗатрат;
КонецЕсли;

//Добавляется метка в конец процедуры
~ПерейтиВозврат:

Бинго! Звоним пользователю и говорим, что проблема решена и он может дальше спокойно проводить документ. Все решилось за 5 минут без обновления конфигурации и узлов! Ничего сложного тут нет, все без лишних слов описано в хелпе.

Если мы сначала хотим протестировать, то что мы внесли во внешнюю обработку, то без проблем можем даже воспользоваться отладчиком, он отлично заходит в нашу обработку (при условии, что она выполняется на клиенте, конечно).

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

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

Корректно обрабатываются процедуры с пометкой "Сервер", "Клиент" (обычный и управляемый).

Требования к системе:

Работает на обычных и управляемых формах, прикрутить можно к любой конфигурации на восьмерке (8.0, 8.1, 8.2, 8.3), при необходимости доработать под свои нужды - все модули открыты.

Техподдержка бесплатная на весь период. Вопросы задавайте здесь же или в личку.

Поставка:

1. Файл выгрузки конфигурации (для обычных или управляемых форм)

2. Инструкция по внедрению и описание доработки в одном файле. Вам нужно будет самостоятельно объединить вашу конфигурацию с конфигурацией поставки.

3. Обработка с дополнительными примерами вызова экстренных процедур (находятся в модуле обработки).

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

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

Вроде все, жду ваших вопросов и предложений. Могу за умеренную плату доработать именно под ваши нужды. Час = 700 рублей, минимум 2 часа. Всем добра!)

ВНИМЕНИЕ!!! Пока доступна только конфигурация для обычного приложения. Буквально на днях закончу конфигу и для управляемого приложения, о чем сообщу дополнительно.

Гарантия возврата денег

Гарантия возврата денег

ООО "Инфостарт" гарантирует Вам 100% возврат оплаты, если программа не соответствует заявленному функционалу из описания. Деньги можно вернуть в полном объеме, если вы заявите об этом течение 14-ти дней со дня поступления денег на наш счет.

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

Для возврата оплаты просто свяжитесь с нами.

Скачать файлы

Наименование Файл Версия Размер
Инструкция по работе с доработкой
.pdf 933,66Kb
07.06.15
7
.pdf 933,66Kb 7 Скачать бесплатно
Дополнительные примеры вызова экстренных процедур
.epf 4,94Kb
07.06.15
5
.epf 4,94Kb 5 Скачать бесплатно
Обработка Добавление вызова экстренной процедуры в начало процедур модуля
.epf 7,86Kb
07.06.15
6
.epf 7,86Kb 6 Скачать бесплатно
07.06.2015
1900 руб.

Моментальная
доставка



Новый вопрос

E-mail*
Тема (вопрос)*

См. также

PowerTools от 1 000