Некоторые картинки не загружаются из РФ и РК, используйте VPN.

пятница, 29 марта 2024 г.

1С:Заготовка Поиск по GTIN номенклатуры при загрузке из ТабДокумента

Менеджер получил новые GTIN для продукции, которая уже заведена в 1С УТ и имеет собственный GTIN, при этом наименование товара также заменили в соответствии с новыми правилами ЧЗ. Плюс к списку прилагались 2000 марок к остаткам. Все было выполнено в специальной конфигурации Хамелеон. Бухгалтер попросила помочь с загрузкой марок в 1С УТ, так как  в УТ остаток есть, а приход размазан на год.

Самый простой вариант для разового варианта - ЗагрузкаДанныхИзТабличногоДокумента_УФ_v2.epf, но он не умеет находить по GTIN из коробки. А мне нужно:

  • Добавить GTIN к существующей карточке номенклатуры
  • Заменить наименования в карточке
  • Загрузить марки в базу
Поэтому я воспользовался возможностью Вычислить


Вот такой код:

М = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
М.Отбор.Штрихкод.Установить(?(СтрДлина(ТекстЯчейки)=13,ТекстЯчейки,строка("0"+ТекстЯчейки)));
М.Прочитать();
Результат=М[0].Номенклатура;
Сообщить(М[0].Номенклатура);

Да, код не оптимален, но для разовой загрузки подойдет, ибо на загрузку в таком варианте ушло не больше 20 минут (вспомнить как писать на 1С тоже занимает время X-D), а на разработку полноценного решения ушло бы часа 2 О_О

Один момент, для исправления наименования GTIN помещаем в поле Код, для поля код ставим галку поле поиска, а алгоритм вычисления кода правим вот так:

М = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
М.Отбор.Штрихкод.Установить(?(СтрДлина(ТекстЯчейки)=13,ТекстЯчейки,строка("0"+ТекстЯчейки)));
М.Прочитать();
Результат=М[0].Номенклатура.Код;
Сообщить(М[0].Номенклатура);

вторник, 26 марта 2024 г.

RPi 3B+ NUT UPS Monitoring


Имеем два ИБП Powercom KING PRO KIN-2200AP RM и Powercom KING PRO KIN-3000AP RM и RaspberryPi на собственном ИБП на базе 18650



Хочу мониторить и управлять ИБП с малины. К малине подключены при помощи USB кабеля (2 метра)

Дальше идет описание моих изысканий со всеми ошибками.

Ищем наши ИБП

user@rpi02:~ $ lsusb
Bus 001 Device 004: ID 0d9f:00a7 Powercom Co., Ltd   UPS  KIN-2200AP       FW3.A7
Bus 001 Device 005: ID 0d9f:0002 Powercom Co., Ltd Black Knight PRO / WOW Uninterruptible Power Supply (Cypress HID->COM RS232)

В /etc/nut/nut.conf указываем режим работы сервер

MODE=server

В /etc/nut/ups.conf я их записал так (согласно документации данная модель

[KIN_2200AP]
driver = usbhid-ups
desc = "KIN-2200AP"
port = auto
vendorid = 0d9f
productid = 00a7

[KIN_3000AP]
driver = usbhid-ups
desc = "KIN-3000AP"
port = auto
vendorid = 0d9f
productid = 0002

Попытка запуска завершилась ошибкой

could not detach kernel driver from interface 0: Operation not permitted

среда, 13 марта 2024 г.

PoSh Script Проверка web сервиса и перезапуск docker desktop

Сервис развернут контейнере (Docker desktop). Пожаловались, что иногда он вываливается и единственное решение - полный перезапуск wsl и "docker desktop". Пользователь в будуюшем будет переносить докеры в linux среду, а на текущий момент нужен костыль. Сразу оговорюсь, попытка создать службу docker провалилась, поэтому здесь решение совсем грязное. Но в самом скрипте есть пара интересных, для меня, моментов, поэтому кладу его здесь.

Скрипт проверяет ответ от web-сервиса (внешний адрес и порт), если его нету, то ждет N время, иначе выходит. По истечении N времени идет повторная проверка, если ответа нет, то идет проверка локальная, иначе выход. Если локальная проверка не прошла, то перезапускаем нужные службы и программы, иначе выходим.

Запускать я решил батником в task scheduller, чтобы не править каждый раз задачу. При этом задача должна выполнятся от имени администратора и БЕЗ привязки к пользователю, иначе Desktop manager не запустит контейнеры.


Два триггера


Для автозапуска Docker desktop при загрузке ПК настраиваем автовход пользователя  (control userpasswords2)  и автозапуск Docker desktop при входе в настройках программы. На данный момент это единственное рабочее решение из найденных :-(

Команда запуска в планировщике (окно скрипта скрыто)

%windir%\system32\cmd.exe
/c start /min C:\usr\WSLCheckStart.bat ^& exit

Будьте осторожны с таким методом скрытия окна. Этот метод открывает скрипт за пределами планировщика. Планировщик не может контролировать выполнение задачи, а значит возможно наложение нескольких задач. Для таких случаев рекомендуется проводить проверку в самом скрипте.

Батник:

@echo off
cd %~dp0
set "pathscript=%~dp0\WSLCheck.ps1"
set "pathlog=%~dp0\log"
mkdir %~dp0\log
IF EXIST %pathscript% (
  powershell.exe -NoProfile -ExecutionPolicy Bypass -File %pathscript% -Address "dev.site.com" -Port "443" -LocalPort "8080" -TimeOut 20 -TimeOutHTTP 10 -LogFile %pathlog%
) ELSE (
  echo "ERROR! %pathscript% not exist"
  echo "ERROR! %pathscript% not exist" >> WSLLogStart.log
)

Сам скрипт Powershell

Posh script Простенькая функция логирования

 


# Имя файла лога отличается от имени скрипта только расширением
$ScriptPath=(Get-Item $PSCommandPath).Directory
$ScriptBaseName=(Get-Item $PSCommandPath).BaseName

$LogFile="$ScriptPath\$ScriptBaseName.log"

$whatif=$false

# простенькая функция логирования, если файл есть, то пишет в него
# можно было использовать tee-object, но этот командлет выдает ошибку при отсутствии папки для лога
# CheckRepeat проверяет последнюю строку лога с будущей, чтобы не засорять файл
# level - число - 
function Logging($Message,$Level=0,$CheckRepeat=$false){
	if ("$Message" -eq ""){
		return
	}
	$mLevel=switch($level){
		0 {New-Object psobject -Property @{label="[INF]";color="White"}}
		1 {New-Object psobject -Property @{label="[WAR]";color="Yellow"}}
		2 {New-Object psobject -Property @{label="[ERR]";color="Red"}}
	}
    $CurrentTimeStamp=Get-Date -Format "dd.MM.yyyy`tHH:mm:ss"
    Write-Host "$Message" -ForegroundColor  $mLevel.color
	
	if ($whatif){return}
    if (-not (Test-Path $LogFile)) {New-Item -Path $LogFile -ItemType File -ErrorAction SilentlyContinue}  
	if (Test-Path $LogFile) {
		$lastLine=""
		if ($CheckRepeat){
			$lastLine=$(Get-Content -Path $LogFile)[-1].Split("`t")[-1]
		}
		if ("$Message" -ne "$lastLine"){
			Write-Output("$CurrentTimeStamp`t$($mLevel.label)`t$Message") | Out-File $LogFile -Append
		}
	}
}