Показаны сообщения с ярлыком 1С Предприятие. Показать все сообщения
Показаны сообщения с ярлыком 1С Предприятие. Показать все сообщения

14 мар. 2022 г.

Округление в меньшую сторону \ Отсечь лишние числа 1С

 Взято с интернета

Цел(МоеЧисло * 100) / 100

Из кирилицы в латынь 1С

Процедура ОбработатьНомерДокументаИзХМЛСУчетомПрефиксаНаКирилице(_Строка)
НомерДокумента = КирВЛат(_Строка)
КонецПроцедуры

Функция КирВЛат(Слово)Экспорт
Латиница= "";
СоотвБукв = новый СписокЗначений;
//Кириллица
СоотвБукв.Добавить("й","j");
СоотвБукв.Добавить("ц","c");
СоотвБукв.Добавить("у","u");
СоотвБукв.Добавить("к","k");
СоотвБукв.Добавить("е","e");
СоотвБукв.Добавить("н","n");
СоотвБукв.Добавить("г","g");
СоотвБукв.Добавить("ш","sh");
СоотвБукв.Добавить("щ","sch");
СоотвБукв.Добавить("з","z");
СоотвБукв.Добавить("х","h");
СоотвБукв.Добавить("ъ","#");
СоотвБукв.Добавить("ф","f");
СоотвБукв.Добавить("ы","y");
СоотвБукв.Добавить("в","v");
СоотвБукв.Добавить("а","a");
СоотвБукв.Добавить("п","p");
СоотвБукв.Добавить("р","r");
СоотвБукв.Добавить("о","o");
СоотвБукв.Добавить("л","l");
СоотвБукв.Добавить("д","d");
СоотвБукв.Добавить("ж","zh");
СоотвБукв.Добавить("э""je");
СоотвБукв.Добавить("я","ya");
СоотвБукв.Добавить("ч","ch");
СоотвБукв.Добавить("с","s");
СоотвБукв.Добавить("м","m");
СоотвБукв.Добавить("и","i");
СоотвБукв.Добавить("т","t");
СоотвБукв.Добавить("ь","'");
СоотвБукв.Добавить("б","b");
СоотвБукв.Добавить("ю","ju");
СоотвБукв.Добавить("ё","jo");
//Латиница
СоотвБукв.Добавить("i","i");
СоотвБукв.Добавить("q","q");
СоотвБукв.Добавить("w","w");
СоотвБукв.Добавить("e","e");
СоотвБукв.Добавить("r","r");
СоотвБукв.Добавить("t","t");
СоотвБукв.Добавить("y","y");
СоотвБукв.Добавить("u","u");
СоотвБукв.Добавить("i","i");
СоотвБукв.Добавить("o","o");
СоотвБукв.Добавить("p","p");
СоотвБукв.Добавить("","");
СоотвБукв.Добавить("a","a");
СоотвБукв.Добавить("s","s");
СоотвБукв.Добавить("d","d");
СоотвБукв.Добавить("э","e");
СоотвБукв.Добавить("ы","i");
СоотвБукв.Добавить("f","f");
СоотвБукв.Добавить("g","g");
СоотвБукв.Добавить("h","h");
СоотвБукв.Добавить("j","j");
СоотвБукв.Добавить("k","k");
СоотвБукв.Добавить("l","l");
СоотвБукв.Добавить("z","z");
СоотвБукв.Добавить("х","x");
СоотвБукв.Добавить("c","c");
СоотвБукв.Добавить("v","v");
СоотвБукв.Добавить("b","b");
СоотвБукв.Добавить("n","n");
СоотвБукв.Добавить("m","m");
//Прочее
СоотвБукв.Добавить(" "," ");
СоотвБукв.Добавить("""","""");
СоотвБукв.Добавить("-","-");
СоотвБукв.Добавить(".",".");
СоотвБукв.Добавить(",",",");
СоотвБукв.Добавить("/","/");
СоотвБукв.Добавить("\","\");
СоотвБукв.Добавить("*","*");
СоотвБукв.Добавить("#","#");
СоотвБукв.Добавить("#","№");
СоотвБукв.Добавить("|","|");
СоотвБукв.Добавить("!","!");
СоотвБукв.Добавить("?","?");
СоотвБукв.Добавить("$","$");
СоотвБукв.Добавить("%","%");
СоотвБукв.Добавить("@","@");
СоотвБукв.Добавить("&","&");
СоотвБукв.Добавить("=","=");
СоотвБукв.Добавить("+","+");
СоотвБукв.Добавить("~","~");
СоотвБукв.Добавить("'","'");
СоотвБукв.Добавить("`","`");
СоотвБукв.Добавить(":",":");
СоотвБукв.Добавить(";",";");
СоотвБукв.Добавить("(","(");
СоотвБукв.Добавить(")",")");
СоотвБукв.Добавить("[","[");
СоотвБукв.Добавить("]","]");
СоотвБукв.Добавить("}","}");
СоотвБукв.Добавить("{","{");
//Цифры
СоотвБукв.Добавить("0","0");
СоотвБукв.Добавить("1","1");
СоотвБукв.Добавить("2","2");
СоотвБукв.Добавить("3","3");
СоотвБукв.Добавить("4","4");
СоотвБукв.Добавить("5","5");
СоотвБукв.Добавить("6","6");
СоотвБукв.Добавить("7","7");
СоотвБукв.Добавить("8","8");
СоотвБукв.Добавить("9","9");
Для а=1 по СтрДлина(Слово) Цикл
Латиница = Латиница + СоотвБукв.НайтиПоЗначению(НРЕГ(Сред(Слово,а,1)));
КонецЦикла;
Возврат ВРЕГ(Латиница)

КонецФункции 

Скопировать номенклатуру из папки источник в папку приемник

 Программный код выполняет копирование Номенклатуры из одной папки в другую с сохранением Иерархии папки источника в папке приемник.

При копировании для новой номенклатуры добавляется единица измерения и переноситься штрих код из номенклатуры источника в номенклатуру приемник.

//написано для "обычное приложение"

Процедура КнопкаВыполнитьНажатие(Кнопка)
Если Не ЗначениеЗаполнено(ПапкаИсточник) Тогда // ПапкаИсточник это реквизит формы
Сообщить("Папка источник должна быть заполнена");
Возврат
КонецЕсли;
Если Не ЗначениеЗаполнено(ПапкаПриемник) Тогда //ПапкаПриемник это реквизит формы
Сообщить("Папка приемник должна быть заполнена");
Возврат
КонецЕсли;
Запрос = Новый Запрос("ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)
|УПОРЯДОЧИТЬ ПО
| Номенклатура.Ссылка ИЕРАРХИЯ"
);
Запрос.УстановитьПараметр("Группа", ПапкаИсточник);
//Вызываем рекурсивную процедуру, параметр "ПапкаПриемник" - это "получатель", куда будет скопирована ветка
Копировать(ПапкаПриемник,Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией));
КонецПроцедуры

Процедура Копировать(Предок,Выборка) //Рекурсивная процедура для обхода всего дерева
Если Не Предок.ЭтоГруппа Тогда //Если перетащили не на группу, то кидаем всё дерево в корень
Предок=Справочники.Номенклатура.ПустаяСсылка();
КонецЕсли;
Пока Выборка.Следующий() Цикл //Обходим все элементы и просто копируем всё подряд
//Поскольку выборка добывает нам ссылки для изменения с объекта его необходимо получить
ТекСпр = Выборка.Ссылка.ПолучитьОбъект();
элементСправочника = ТекСпр.Скопировать();
элементСправочника.Родитель=Предок;
//комментарий автора взятый из сети
//
// ** Если мы хотим запомнить откуда была скопирована номенклатура - нужно **
// ** предварительно добавить реквизит ОбразецНоменклатуры в справочник Номенклатура **
// ** типа "СправочникСсылка.Номенклатура" а затем раскомментировать следующую строку **
//элементСправочника.ОбразецНоменклатуры=ТекСпр.Ссылка;
// При желании здесь можно создавать подчинённые справочники вроде "единицы измерения"
// и сюда записывать все необходимые ссылки
Если Не элементСправочника.ЭтоГруппа Тогда
Если НЕ ЗначениеЗаполнено(элементСправочника.БазоваяЕдиницаИзмерения) Тогда
элементСправочника.БазоваяЕдиницаИзмерения = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнаяЕдиницаПоКлассификатору");
КонецЕсли;
КонецЕсли;
элементСправочника.Записать();
Если Не элементСправочника.ЭтоГруппа Тогда
ПроверитьЕдиницуХраненияОстатков(элементСправочника.Ссылка);
ЗаменитьВладельцаШКИсточникаНаПриемник(ТекСпр.Ссылка, элементСправочника.Ссылка)
КонецЕсли;
Сообщить("Успешно обработано объект "+ элементСправочника.Ссылка);
Если ТекСпр.ЭтоГруппа Тогда //Когда встречаем группу, то заходим внутрь и повторяем действия
Копировать(элементСправочника.Ссылка,Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией));
КонецЕсли;
КонецЦикла;
КонецПроцедуры

Процедура ЗаменитьВладельцаШКИсточникаНаПриемник(спрИсточник, спрПриемник)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Штрихкоды.Штрихкод,
| Штрихкоды.Владелец,
| Штрихкоды.ТипШтрихкода,
| Штрихкоды.ЕдиницаИзмерения,
| Штрихкоды.ХарактеристикаНоменклатуры,
| Штрихкоды.СерияНоменклатуры,
| Штрихкоды.Качество,
| Штрихкоды.ПредставлениеШтрихкода
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
|ГДЕ
| Штрихкоды.Владелец = &Владелец";
Запрос.УстановитьПараметр("Владелец", спрИсточник);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Попытка
НачатьТранзакцию();
//1. отвязываем ШК от Источника
нз = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
нз.Отбор.Штрихкод.Установить( ВыборкаДетальныеЗаписи.Штрихкод);
нз.Отбор.Владелец.Установить( ВыборкаДетальныеЗаписи.Владелец);
нз.Отбор.ТипШтрихкода.Установить( ВыборкаДетальныеЗаписи.ТипШтрихкода);
нз.Отбор.ЕдиницаИзмерения.Установить( ВыборкаДетальныеЗаписи.ЕдиницаИзмерения);
нз.Отбор.ХарактеристикаНоменклатуры.Установить( ВыборкаДетальныеЗаписи.ХарактеристикаНоменклатуры);
нз.Отбор.СерияНоменклатуры.Установить( ВыборкаДетальныеЗаписи.СерияНоменклатуры);
нз.Отбор.Качество.Установить( ВыборкаДетальныеЗаписи.Качество);
нз.Прочитать();
нз.Очистить();
нз.Записать();
//2. привязываем ШК Приемнику
мз = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
мз.Штрихкод = ВыборкаДетальныеЗаписи.Штрихкод;
мз.Владелец = спрПриемник;
мз.ТипШтрихкода = ВыборкаДетальныеЗаписи.ТипШтрихкода;
мз.ЕдиницаИзмерения = ВыборкаДетальныеЗаписи.ЕдиницаИзмерения;
мз.ХарактеристикаНоменклатуры = ВыборкаДетальныеЗаписи.ХарактеристикаНоменклатуры;
мз.СерияНоменклатуры = ВыборкаДетальныеЗаписи.СерияНоменклатуры;
мз.Качество = ВыборкаДетальныеЗаписи.Качество;
мз.ПредставлениеШтрихкода = ВыборкаДетальныеЗаписи.ПредставлениеШтрихкода;
мз.Записать();
ЗафиксироватьТранзакцию()
Исключение
ОтменитьТранзакцию();
Сообщить(ОписаниеОшибки())
КонецПопытки;
КонецЦикла;
КонецПроцедуры

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

Удалить последний символ с строке

 стр = Лев(стр, СтрДлина(стр)-1);

Отправить файл POST запросом с учетом ultipart/form-data

Пример запроса отправки прайс листа на сервис "Вачсно" с последующей обработкой ответа от сервиса

#Область ВЧАСНО
Функция ОтправитьФайлПрайсВчасно(ПолноеИмяФайла, МассивID)
//пример запроса:
//
//POST https://edi.vchasno.ua/api/documents/prices?buyer_edrpou=ИдентификаторКонтрагентаДляКоторогоВыгружаемПрайс
//
//authorization: <vchasno-edi_token>
//content-type: multipart/form-data; boundary=BOUNDARY
//
//--BOUNDARY
//Content-Disposition: form-data; name="file"; filename="pricat.xml"
//Content-Type: application/xml
//<?xml version='1.0' encoding='utf-8'?>
//<PRICAT>
//...
//</PRICAT>
//--BOUNDARY--
урлОтправитьДокумент = "/api/documents/prices?buyer_edrpou=" + "ИдентификаторКонтрагентаДляКоторогоВыгружаетсяПрайс";
СерверАПИ = "edi.vchasno.ua";
Токен = "ХХХХХХХХХХХХХХХХ";
BOUNDARY = Строка(Новый УникальныйИдентификатор); //просто произвольные символы
лПолноеИмяФайлаXML = ПолноеИмяФайла; //ХМЛ файл, с которого будем получать ХМЛ строку
тФайл = Новый Файл(лПолноеИмяФайлаXML);
Если НЕ тФайл.Существует() Тогда
Сообщить(НСтр("ru = 'Не найден файл '; uk = 'Не знайдено файл '")+лПолноеИмяФайлаXML+" для отправки на сервис ""Вчасно""", СтатусСообщения.Внимание);
Возврат МассивID;
ИначеЕсли НЕ тФайл.ЭтоФайл() Тогда
Сообщить(НСтр("ru = 'Не является файлом '; uk = 'Не є файлом '")+лПолноеИмяФайлаXML+" для отправки на сервис ""Вчасно""", СтатусСообщения.Внимание);
Возврат МассивID;
КонецЕсли;
Текст = Новый ТекстовыйДокумент;
тмпОтвет = ПолучитьИмяВременногоФайла("txt");
ИмяФайлаОтправки = ПолучитьИмяВременногоФайла("txt");
ФайлОтправки = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.ANSI, Символы.ПС, Ложь);
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
ФайлОтправки.ЗаписатьСтроку("Content-Disposition: form-data; name=""file""; filename=""pricat.xml""");
ФайлОтправки.ЗаписатьСтроку("Content-Type: application/xml");
ФайлОтправки.ЗаписатьСтроку("");
//вставка Прайса ХМЛ
ТекстXML = Новый ТекстовыйДокумент;
ТекстXML.Прочитать(лПолноеИмяФайлаXML, КодировкаТекста.ANSI, );
ФайлОтправки.ЗаписатьСтроку(СокрЛП(ТекстXML.ПолучитьТекст()));
ФайлОтправки.ЗаписатьСтроку("");
ФайлОтправки.ЗаписатьСтроку("--" + Boundary + "--");
ФайлОтправки.Закрыть();
ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);
ЗаголовокHTTP.Вставить("Authorization", Токен);
ХСоединение = Новый HTTPСоединение( СерверАПИ,,,,, 60, Новый ЗащищенноеСоединениеOpenSSL());
ХЗапрос = Новый HTTPЗапрос(урлОтправитьДокумент, ЗаголовокHTTP);
ХЗапрос.УстановитьИмяФайлаТела(ИмяФайлаОтправки);
ХОтвет = ХСоединение.ОтправитьДляОбработки(ХЗапрос, тмпОтвет);
КодОтвета = ХОтвет.КодСостояния;
Если КодОтвета = 200 Тогда
Попытка
УдалитьФайлы(лПолноеИмяФайлаXML);
Исключение
Сообщить(НСтр("ru = 'Неудачная попытка удаления файла '; uk = 'Невдала спроба видалення файла '")+лПолноеИмяФайлаXML, СтатусСообщения.Внимание);
Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;
Если ВРЕГ(ХОтвет.Заголовки.Получить("Content-Type")) = ВРЕГ("application/json") Тогда
тФайлОтвета = Новый Файл(тмпОтвет);
Текст.Прочитать(тмпОтвет, КодировкаТекста.UTF8);
ЧтениеДЖ = Новый ЧтениеJSON;
ЧтениеДЖ.УстановитьСтроку(Текст.ПолучитьТекст());
ОбъектДЖ = ПрочитатьJSON(ЧтениеДЖ, Истина); // читаем в соответвие
ИДВчасно = ОбъектДЖ.Получить("id");
Если ИДВчасно <> Неопределено Тогда
Сообщить("Отправленный прас получил ИД: " + ИДВчасно);
МассивID.Добавить(ИДВчасно);
Попытка
УдалитьФайлы(тмпОтвет);
Исключение
Сообщить(НСтр("ru = 'Неудачная попытка удаления файла '; uk = 'Невдала спроба видалення файла '")+тмпОтвет, СтатусСообщения.Внимание);
Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;
Возврат МассивID
КонецЕсли;
Иначе
Возврат МассивID
КонецЕсли;
Иначе
Сообщить(НСтр("ru = 'Получен ответ с кодом '; uk = 'Отримано відповідь з кодом '")+КодОтвета, СтатусСообщения.Внимание);
// разобрать ошибки
ОшибкаРазбора = Ложь;
тФайлОтвета = Новый Файл(тмпОтвет);
Если НЕ тФайлОтвета.Существует() Тогда
Сообщить(НСтр("ru = 'Не найден файл ответа сервиса: '; uk = 'Не знайдено файл відповіді сервісу: '")+тмпОтвет, СтатусСообщения.Внимание);
Иначе
Текст.Прочитать(тмпОтвет, КодировкаТекста.UTF8);
Если Текст.КоличествоСтрок() > 0 Тогда
ОтветСервера = Текст.ПолучитьТекст();
_ЧтениеXML = Новый ЧтениеXML;
Попытка
_ЧтениеXML.УстановитьСтроку(ОтветСервера);
Исключение
Сообщить(НСтр("ru = 'Неудачная попытка чтения ответа сервиса: '; uk = 'Невдала спроба читання відповіді сервісу: '")+ОписаниеОшибки(), СтатусСообщения.Внимание);
ОшибкаРазбора = Истина;
КонецПопытки;
КонецЕсли;
Если НЕ ОшибкаРазбора Тогда
Поз = Найти(Лев(ОтветСервера, 5), "xml");
Если Поз = 0 Тогда
Сообщить(НСтр("ru = 'Неудачная попытка разбора ответа сервиса (Код состояния = '; uk = 'Невдала спроба розбору відповіді сервісу (Код стану = '")+КодОтвета+"): ", СтатусСообщения.Внимание);
Сообщить(ОтветСервера, СтатусСообщения.Внимание);
Иначе
ОбработатьОписаниеОшибки(_ЧтениеXML, КодОтвета);
КонецЕсли;
КонецЕсли;
Возврат МассивID
КонецЕсли;
КонецЕсли;
Возврат МассивID
КонецФункции
Процедура ОбработатьОписаниеОшибки(_ЧтениеXML, КодСостояния)
Если КодСостояния = 504 Тогда // иная структура ответа
Сообщить(НСтр("ru = 'Ответ сервиса (Код состояния = '; uk = 'Відповідь сервісу (Код стану = '")+КодСостояния+")", СтатусСообщения.Внимание);
Возврат;
КонецЕсли;
СтруктураОшибки = Новый Структура("title, body");
ИмяУзла = "";
Читать = Ложь;
Пока _ЧтениеXML.Прочитать() Цикл
ТипУзла = _ЧтениеXML.ТипУзла;
Если ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ИмяУзла = "files" Тогда
СтруктураОшибки.Вставить("ИмяФайла", _ЧтениеXML.Имя);
Читать = Ложь;
Иначе
ИмяУзла = _ЧтениеXML.Имя;
Читать = СтруктураОшибки.Свойство(ИмяУзла);
КонецЕсли;
ИначеЕсли ТипУзла = ТипУзлаXML.Текст И Читать Тогда
СтруктураОшибки.Вставить(ИмяУзла, _ЧтениеXML.Значение);
Читать = Ложь;
Иначе
Читать = Ложь;
КонецЕсли;
КонецЦикла;
Сообщить(НСтр("ru = 'Ответ сервиса (Код состояния = '; uk = 'Відповідь сервісу (Код стану = '")+КодСостояния+"):", СтатусСообщения.Внимание);
Сообщить(" - заголовок: "+СтруктураОшибки["title"], СтатусСообщения.Внимание);
Сообщить(" - описание: "+СтруктураОшибки["body"] , СтатусСообщения.Внимание);
КонецПроцедуры

#КонецОбласти

7 февр. 2021 г.

Переносим логику выполнения кода в модуль внешней обработки

 Бывает затруднено динамическое обновление клиентской базы, поэтому часто програмный код, который "не устойчив" пишу на стороне модуля внешней обработки, который потом вызываю в нужном для себе месте. 

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

В результате выходт, как бы "онлайн" изменения логики без нужды обновление конфигурации.

Пример вызова процедуры из параметрами, которая находиться в модуле внешней обработки 

с именем "[ИС] Внешние процедуры и функции".

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

Общий модуль "исОбщегоНазначения" можно посмотреть в этой публикации

Открыть внешнюю обработку из обработки

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

Такая реализация нужно для быстрого внесения изменений в логику внешней обработки не обновляя конфигурацию.

Модуль формы

Процедура КнопкаВыполнитьНажатие(Кнопка)
    // Вставить содержимое обработчика.
КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    
    Попытка
        //запуск процедуры в обработке  
        исОбщегоНазначения.ОткрытьФормуВнешнейОбработки("[ИС] Обмен с АЗС");
        
        //удалим внешнюю временную обработку        
        УдалитьФайлы(ОбработкаОбъект.ИспользуемоеИмяФайла); 
    Исключение
    КонецПопытки;
    
    Отказ = Истина; //закроем текущую форму
    
КонецПроцедуры

Модуль общего модуля который называется исОбщегоНазначения

#Область РаботаСЗапускомВнешнихОтчетовИОбработок

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

КонецФункции

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

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

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

#КонецОбласти

Пример использования выше процедур при быстром обновлении логики програмы.
 

CopyPaste Copyright © 2017 - |- Шаблон создан O Pregador - |- Отредактирован myr4ik07