gifts2017

Выгрузка стандартных обработок

Опубликовал Серега (SerVer1C) в раздел Программирование - Инструментарий

Задумывались ли вы над тем, чтобы подправить логику работы встроенных в платформу обработок из меню "Все функции"?
Если "Да" - то вам сюда!

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

Идея взята из публикации "Недокументированное использование стандартных обработок из меню "Все функции" http://infostart.ru/public/369487

Ничего нового своего я сюда не вносил, просто материализовал статью Wink

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

 

Код модуля обычной формы:

Перем СоответствияОФ, РазделительОФ;




Процедура КнопкаВыполнитьНажатие(Кнопка)
	КаталогНаДиске = Новый Файл(ПутьВыгрузки);
	
	Если Не КаталогНаДиске.Существует() Тогда
		Сообщить("Выберите существующий каталог", СтатусСообщения.Информация);
		Возврат;
	КонецЕсли;
	
	Для каждого Соответствие Из СоответствияОФ Цикл
		Расширение = РасширениеФайла(Соответствие.Значение);
		
		Попытка
			КопироватьФайл(Соответствие.Значение, ПутьВыгрузки + ?(Прав(ПутьВыгрузки, 1) = РазделительОФ, "", РазделительОФ) + Соответствие.Ключ + "." + Расширение);
			Сообщить("Выгружен файл: <" + Соответствие.Ключ + "." + Расширение + ">");
		Исключение
			Сообщить("Файл не найден: <" + Соответствие.Ключ + "." + Расширение + ">", СтатусСообщения.Внимание);
		КонецПопытки;
	КонецЦикла;
КонецПроцедуры




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




Функция РасширениеФайла(Путь)
	Расширение = "";
	Буфер      = "";
	ДлинаПути  = СтрДлина(Путь);
	
	Для й = 1 По ДлинаПути Цикл
		ТекСимвол = Сред(Путь, ДлинаПути - й + 1, 1);
		
		Если ТекСимвол = "\" Или ТекСимвол = "/" Тогда
			Прервать;
		КонецЕсли;
		
		Если ТекСимвол = "." Тогда
			Расширение = Буфер;
			Прервать;
		КонецЕсли;
		
		Буфер = ТекСимвол + Буфер;
	КонецЦикла;
	
	Возврат Расширение;
КонецФункции




Процедура ПриОткрытии()
	СисИнфо = Новый СистемнаяИнформация;
	ТекПлатформа = СисИнфо.ТипПлатформы;
	            
	Если ТекПлатформа = ТипПлатформы.Windows_x86 Или ТекПлатформа = ТипПлатформы.Windows_x86_64 Тогда 
		РазделительОФ = "\";
		ПутьВыгрузки = "C:\";
	Иначе 
		РазделительОФ = "/";
		ПутьВыгрузки = "/home";
	КонецЕсли;
КонецПроцедуры




СоответствияОФ = Новый Соответствие;
СоответствияОФ.Вставить("Активные пользователи"                     , "v8res://mngbase/StandardActiveUsers.epf");
СоответствияОФ.Вставить("Журнал регистрации"                        , "v8res://mngbase/StandardEventLog.epf");
СоответствияОФ.Вставить("Поиск ссылок на объект"                    , "v8res://mngbase/StandardFindByRef.epf");
СоответствияОФ.Вставить("Проведение документов"                     , "v8res://mngbase/StandardDocumentsPosting.epf");
СоответствияОФ.Вставить("Удаление помеченных объектов"              , "v8res://mngbase/StandardDeleteMarkedObjects.epf");
СоответствияОФ.Вставить("Управление внешними источниками данных"    , "v8res://mngbase/StandardExternalDataSourcesManagement.epf");
СоответствияОФ.Вставить("Управление итогами"                        , "v8res://mngbase/StandardTotalsManagement.epf");
СоответствияОФ.Вставить("Управление полнотекстовым поиском"         , "v8res://mngbase/StandardFullTextSearchManagement.epf");
СоответствияОФ.Вставить("Управление расширениями конфигурации"      , "v8res://mngbase/StandardExtensionsManagement.epf");
СоответствияОФ.Вставить("Конструктор запросов на управляемых формах", "v8res://mngbase/QueryWizard.epf");

 

Код модуля управляемой формы:

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ПриОткрытииНаСервере();
КонецПроцедуры




&НаСервере
Процедура ПриОткрытииНаСервере()
	СисИнфо = Новый СистемнаяИнформация;
	ТекПлатформа = СисИнфо.ТипПлатформы;
	
	Если ТекПлатформа = ТипПлатформы.Windows_x86 Или ТекПлатформа = ТипПлатформы.Windows_x86_64 Тогда 
		Объект.Разделитель = "\";
		ПутьВыгрузки = "C:\";
	Иначе 
		Объект.Разделитель = "/";
		ПутьВыгрузки = "/home";
	КонецЕсли;
	
	
	Соответствия = Новый Соответствие;
	Соответствия.Вставить("Активные пользователи"                     , "v8res://mngbase/StandardActiveUsers.epf");
	Соответствия.Вставить("Журнал регистрации"                        , "v8res://mngbase/StandardEventLog.epf");
	Соответствия.Вставить("Поиск ссылок на объект"                    , "v8res://mngbase/StandardFindByRef.epf");
	Соответствия.Вставить("Проведение документов"                     , "v8res://mngbase/StandardDocumentsPosting.epf");
	Соответствия.Вставить("Удаление помеченных объектов"              , "v8res://mngbase/StandardDeleteMarkedObjects.epf");
	Соответствия.Вставить("Управление внешними источниками данных"    , "v8res://mngbase/StandardExternalDataSourcesManagement.epf");
	Соответствия.Вставить("Управление итогами"                        , "v8res://mngbase/StandardTotalsManagement.epf");
	Соответствия.Вставить("Управление полнотекстовым поиском"         , "v8res://mngbase/StandardFullTextSearchManagement.epf");
	Соответствия.Вставить("Управление расширениями конфигурации"      , "v8res://mngbase/StandardExtensionsManagement.epf");
	Соответствия.Вставить("Конструктор запросов на управляемых формах", "v8res://mngbase/QueryWizard.epf");


	
	Объект.Соответствия = Новый СписокЗначений;
	Объект.Соответствия.Добавить(Соответствия);
КонецПроцедуры




&НаСервере
Функция РасширениеФайла(Путь)
	Расширение = "";
	Буфер      = "";
	ДлинаПути  = СтрДлина(Путь);
	
	Для й = 1 По ДлинаПути Цикл
		ТекСимвол = Сред(Путь, ДлинаПути - й + 1, 1);
		
		Если ТекСимвол = "\" Или ТекСимвол = "/" Тогда
			Прервать;
		КонецЕсли;
		
		Если ТекСимвол = "." Тогда
			Расширение = Буфер;
			Прервать;
		КонецЕсли;
		
		Буфер = ТекСимвол + Буфер;
	КонецЦикла;
	
	Возврат Расширение;
КонецФункции




&НаКлиенте
Процедура ПутьВыгрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ДиалогВыбораПапки = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
	ДиалогВыбораПапки.Заголовок	= "Выберите папку для выгрузки";
	ДиалогВыбораПапки.Каталог = ПутьВыгрузки;
	
	Если ДиалогВыбораПапки.Выбрать() Тогда
		ПутьВыгрузки = ДиалогВыбораПапки.Каталог;
	КонецЕсли;
КонецПроцедуры




&НаСервере
Процедура ВыполнитьНаСервере()
	КаталогНаДиске = Новый Файл(ПутьВыгрузки);
	
	Если Не КаталогНаДиске.Существует() Тогда
		Сообщить("Выберите существующий каталог", СтатусСообщения.Информация);
		Возврат;
	КонецЕсли;
	
	ЭлементСписка = Объект.Соответствия.Получить(0);
	
	Для каждого Соответствие Из ЭлементСписка.Значение Цикл
		Расширение = РасширениеФайла(Соответствие.Значение);
		
		Попытка
			КопироватьФайл(Соответствие.Значение, ПутьВыгрузки + ?(Прав(ПутьВыгрузки, 1) = Объект.Разделитель, "", Объект.Разделитель) + Соответствие.Ключ + "." + Расширение);
			Сообщить("Выгружен файл: <" + Соответствие.Ключ + "." + Расширение + ">");
		Исключение
			Сообщить("Файл не найден: <" + Соответствие.Ключ + "." + Расширение + ">", СтатусСообщения.Внимание);
		КонецПопытки;
	КонецЦикла;
КонецПроцедуры




&НаКлиенте
Процедура ВыполнитьДействие(Команда)
	ВыполнитьНаСервере();
КонецПроцедуры

 

Для совсем ленивых прилагаю обработку.

Обработка для выгрузки работает и в управляемых, и в обычных формах. Проверено на платформах 8.2.19 - 8.3.6. (В 8.2 есть не все обработки, что имеются в 8.3).

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

Наименование Файл Версия Размер
Выгрузка стандартных обработок 20
.epf 12,29Kb
18.09.15
20
.epf 1.0 12,29Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Марина Чирина (chmv) 21.09.15 14:54
2. Серега (SerVer1C) 22.09.15 08:50
(1) chmv, суть в том, что вы можете сохранить (выгрузить во внешние файлы) зашитые в платформу стандартные обработки и использовать их там, где вам удобно. Или доработать (допилить) их под свои нужды. Еще один из вариантов использования - когда у пользователя закрыт доступ к меню "Все функции", а ему нужно использовать, например, одну из тех обработок - вы можете разместить ее в разделе внешних обработок.
3. Алексей Ермилов (Alex_E) 22.09.15 09:07
(2) SerVer1C, Да уж, про одну обработку из меню Все функции...кто мешает сохранить как внешнюю в конфигураторе и использовать не понятно... Да и закрыто меню "Все функции" - это сильно.... Вообще, ИМХО,то этот "инструмент" не для пользователя, а для того, кто не знает интерфейс - т.к. всё, что нужно именно для работы пользователя есть именно в интерфейсе пользователя, но никак не во всех функциях :-)
4. Серега (SerVer1C) 22.09.15 10:21
(3) Alex_E, или я не знаю интерфейс, или кто-то из нас двоих...
Создаю новую конфу, создаю 2 роли - "ПолныеПрава" и "ТолькоЧтение". Создаю 2 пользователя - один с полными правами, другой - только чтение. Внимание: Вопрос1: как мне из конфигуратора сохранить внешнюю обработку (которая есть в стандартных), например, "Поиск ссылок на объекты"?; Вопрос 2: как второму пользователю с правами только на чтение предоставить доступ к обработке (которая есть в стандартных), например, "Поиск ссылок на объекты"?
5. Алексей Ермилов (Alex_E) 22.09.15 10:44
(4) SerVer1C, Конечно я. И ещё, я даже представить не могу, зачем пользователю с правами Только чтение разрешать что то делать, например сохранять и запускать внешние обработки, если из названия прав он может только смотреть?
И таки да, если Вы создаёте самописную конфу, в которой доступ к части объектов будет только через все функции, то интерфейс в принципе не нужен вовсе - всё и так доступно во всех функциях.
6. Серега (SerVer1C) 22.09.15 11:01
(5) Alex_E, набор прав "ТолькоЧтение" я привел в качестве примера, в "продакшн" все сложнее. Цель данной статьи не показать, как строить интерфейсы, а в том, что данные обработки (для 8.3 - в количестве 10 штук) зашиты в саму платформу и их можно оттуда заполучить, а что с ними делать, когда они окажутся внешними - каждый решает сам.
7. Алексей Ермилов (Alex_E) 22.09.15 12:29
(6) SerVer1C, Получить из конфигуратора - не айс? Тогда - ценно. Я Вас понял, что это нужно для того, чтобы тот, кому "не положено" мог получить, другого применения не придумать..... Ну да ладно, сразу сказал, что это ИМХО))))))))))))))))
8. Vladimir Glumov (Vovan58) 03.07.16 16:13
(7) Alex_E, А что , разве возможно обработку Удаление помеченных получить из конфигуратора? Это в какой ветке Конфигуратора?
9. Алексей Ермилов (Alex_E) 04.07.16 09:39
(8) Vovan58, Ветка обработки, правой кнопкой - сохранить как внешний отчет (обработку)...