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"] , СтатусСообщения.Внимание);
КонецПроцедуры

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

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