23 авг. 2023 г.

З днем Державного прапора УКРАЇНИ


Державний Прапор України є символом волі, сили та мужності українського народу. Сьогодні його кольори можна побачити по всьому світі у знак підтримки українців.  

У День Державного Прапора мусульмани України бажають, щоб в українських містах майоріли синьо-жовті стяги! 🇺🇦

22 мар. 2022 г.

Please enable the Virtual Machine Platform Windows feature and ensure virtualization is enabled in the BIOS

 Хост система - Windows 11, установлен Hyper-V. 

Гостевая система - Windows 11. 

Задача установить WSL либо Docker в гостевую Windows 11.

При попытку заупстить\установить в гостевой Windows 11 WSL либо Docker получаю

Please enable the Virtual Machine Platform Windows feature and ensure virtualization is enabled in the BIOS

Смысл таков, для гостевой Windows 11 отключена виртуализация.

Для включения виртуализации завершаем гостевую Windows 11.

На хост системе с правами администратора в Powershell выполняю команду

Set-VMProcessor -VMName “w11” -ExposeVirtualizationExtensions $true

где "w11" это название гостевой Windows 11.


Без перезагрузки хост системы запускаю гостевую Windows 11, жду некоторое время для выполнения "конвертации" гостевой системы (при запуске будет долгий старт, в Hyper-V Manager можно увидеть процентое выполнение "конвертации").

Теперь Docker успешно запустился.

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