1С: ФИО строкой в структуру

Задача: преобразовать строку вида «Пупкин Василий Алибабаевич Оглы Муглы» в структуру Фамилия-Имя-Отчество.

Казалось бы простая часто используемая функция, но быстрым гугленьем ничего толкового найти не удалось. В том что попадалось, не учитывалось, что после отчества у человека может быть еще много всяких добавок-приставок. Потому нарисовал свой велосипед:

Функция ВыделитьФИО(ФИОСТР)
	ФИО=Новый Структура("Фамилия,Имя,Отчество","","","");
	ФИОСТР=СокрЛП(ФИОСТР);
	ФИОСТР=СтрЗаменить(ФИОСТР,"  "," ");
	ФИОСТР=СтрЗаменить(ФИОСТР,"  "," ");
	ФИОМ=СтрРазделить(ФИОСТР," ");
	ФИО.Фамилия=ФИОМ[0];
	если ФИОМ.Количество()>1 тогда
		ФИО.Имя=ФИОМ[1];
	конецесли;	
	если ФИОМ.Количество()>2 тогда
		ФИО.Отчество=ФИОМ[2];		
		если ФИОМ.Количество()>3 тогда
			Для Счетчик = 3 По ФИОМ.Количество-1 Цикл
				ФИО.Отчество=ФИО.Отчество+ФИОМ[Счетчик]; 
			КонецЦикла;
		конецесли;				
	конецесли;	
	
	возврат ФИО;
КонецФункции

&НаСервере
Процедура РазложитьНаСервере()
	ФИО=ВыделитьФИО("Пупкин Василий Алибабаевич Оглы Муглы");
КонецПроцедуры

На выходе будет структура:

  • Фамилия: Пупкин
  • Имя: Василий
  • Отчество: Алибабаевич Оглы Муглы

Что собственно полностью меня устраивает.

Чтиво за последнее время

Взрослое:

Маска Конструктора. Захар Зарипов. Краткий сюжет: выживание горстки людей закинутых для колонизации Марса. Оценка 3/5. Начало хорошее, а дальше скучно. Не дочитал.

Цикл Низший. Михайлов Р.А. Краткий сюжет и идея: после экологической катастрофы люди переселились в искусственно созданные убежища под управлением «Системы». Большая часть людей там находится в «замороженном» виде и со стертой памятью. Во время «естественной» убыли населения, «замороженные» размораживаются, и подселяются к текущему населению. Так было последние лет 300, пока не разморозили ОДИ. Оценка 5/5. P.S. Перечитываю этот цикл уже раз третий наверное..

Цикл Инфер. Михайлов Р.А. Продолжение цикла «Низший». ОДИ удалось сбежать. Теперь он «наверху». Оценка 3/5. Дочитал, но уже с трудом. Или приелось или автор таки поисписался на эту тему..

Голова на колесиках. Шенгельц Игорь Александрович. Сюжет: богатенький буратино после того как попал в аварию, в надежде на то что в будущем его смогут вылечить, замораживает себя. Однако после разморозки «всё пошло не так». Будущее..выглядит совсем по другому. Голову приделывают на платформу с колесиками, дают в манипуляторы швабру и веник и вперед — ты теперь уборщик помещений, выживай. Оценка 5/5

Цикл «Идеальный мир социопата». Очередное пришествие системы и зомби. Путешествие между мирами. В целом интересно. Оценка 4/5

Цикл «Звезды,пламя и сталь». Сюжет: в далеком будущем в мире осталось всё так-же: войны, и дети в детдомах. Один из воспитанников этого детдома смог заполучить себе нейросеть Джоре. В обем мир из «вселенной EVE». В целом читабельно 4/5

Детское:

Увы, детского читаю всё меньше и меньше. Старшему уже ничего не нужно на ночь читать давно. Младшая тоже уже без энтузизазма воспринимает чтение. Жаль, очень жаль..

  • Всё о медвежонке Паддингтоне: оценка 3/5, как по мне скучновато. Не дочитали
  • Заячьи Лапки. К. Паустовский. Оценка 3/5. Слог уже подустарел, ребенку не очень многое понятно. Приходится объяснять
  • Фома — белый медвежонок. Вера Чаплина. Оценка 3/5.

1С: проверка почты по протоколу IMAP

Задача: прочитать почту из почтового ящика и обработать её посредством 1С.

Решение: за основу можно взять код что-то вроде:

Профиль = Новый ИнтернетПочтовыйПрофиль;
		Профиль.АутентификацияPOP3 = Ложь;
		Профиль.АутентификацияSMTP = Ложь;		
		// IMAP         		
	 УстановитьПривилегированныйРежим(Истина);
	  уз=справочники.УчетныеЗаписиЭлектроннойПочты.НайтиПоНаименованию("Поверка приборов учета");
      Пароли = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(уз, "Пароль, ПарольSMTP");
	УстановитьПривилегированныйРежим(Ложь);	  			
		Профиль.ИспользоватьSSLIMAP = Истина;
		Профиль.АдресСервераIMAP = уз.СерверВходящейПочты;
		Профиль.ПортIMAP = уз.ПортСервераВходящейПочты; 	
		Профиль.ПользовательIMAP = уз.ПользовательSMTP;
		Профиль.ПарольIMAP = Пароли.ПарольSMTP;
		Профиль.ТолькоЗащищеннаяАутентификацияIMAP=Ложь;
		IПочта = Новый ИнтернетПочта;
		Сообщ = Новый СообщениеПользователю();
			IПочта.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP); //ПротоколИнтернетПочты.POP3		
			заголовки=IПочта.ПолучитьЗаголовки();
			если заголовки.Количество()>0 тогда		
				ПоследнийЗаголовок=Новый Массив();
				ПоследнийЗаголовок.Добавить(заголовки[заголовки.Количество()-1]);					
				МассивСообщений = Новый Массив;
				МассивСообщений = IПочта.Выбрать(Ложь,ПоследнийЗаголовок);					
				ТекстСообщения=МассивСообщений[0].тексты[0].Текст;			
					уд=Новый Массив();
					уд.Добавить(МассивСообщений[0]);
					IПочта.УдалитьСообщения(уд);	
					IПочта.ОчиститьУдаленныеСообщения();
			иначе	
				answer.result="писем нет";
			конецесли;		
		IПочта.Отключиться(); 	

Часть 4: Объединяй и властвуй (с)

Логическое продолжение Части 1, 2,3. Итак, научился принимать данные от zigbee устройств на стик Zigbee2Mqtt и на Алису. Да вот беда, одновременно и там и там данные от одного устройства штатными средствами не получить. А только на Алису завязывать все устройства бы не хотелось, так как:

  • сценарии ограничены только поддерживаемым Алисой оборудованием. Например мои WiFi реле Sonoff DIY 3 которые я использую на батареях Алисой естественно не поддерживаются .
  • Нет интернета — нет «умного» дома

Потому и возникла задача перебросить некоторые устройства которые есть на стике на Алису. Например датчик температуры. И в принципе штатное решение есть от самого Яндекса. Правда они выбрали весьма трудоёмкое для этого способа решение: необходимо создать виртуальное устройство, написать для него API и подключить в качестве стороннего навыка «Умный дом». Т.е. схема взаимодействия вырисовывается такая:

Т.е. что нужно сделать по шагам:

  1. Создать навык-приложение для «Умного дома»
  2. Сделать API «виртуального устройства» по документации Яндекса
  3. Подключить виртуальное устройство в навык
  4. Добавить навык в Яндекс Алису

Создание навыка

Для этого переходим по ссылке https://dialogs.yandex.ru/developer/smart-home и создаём новый навык.

Важно! Тип доступа сделать приватным, тогда модерация будет «мгновенной», ну и собственно навык не будет доступен никому кроме вас.

После заполнения основных данных, далее необходимо создать приложение https://oauth.yandex.ru/ с типом платформы WEB:

Так вы получите необходимые для дальнейшей настройки навыка ClientID и Client secret, которые необходимо будет прописать в навыке на странице «Связка аккаунтов»:

Кроме того необходимо прописать эндпоинты которые будут отвечать за авторизацию навыка на вашем сервере, обновление и получение токенов.

API виртуального устройства

Ну собственно на стороне сервера необходимо создать эндпоинты, которые сначала авторизуют навык, а затем отдадут данные «виртуального устройства». Например датчика температуры. Далее накидаю рабочие куски кода-шаблоны, которые пойдут как основа для «допила».

auth.php:

$redirect_uri = $_GET["redirect_uri"];
$state = $_GET["state"];
$client_id = $_GET["client_id"];
header("Location: ".$redirect_uri."?code=1234&state=$state&client_id=$client_id");

token.php:

$code=$_POST["code"];
$client_secret=$_POST["client_secret"];
$grant_type=$_POST["grant_type"];
$client_id=$_POST["client_id"];
$redirect_uri=$_POST["redirect_uri"];

$json='{
    "access_token": "ACCESS_TOKEN",
    "token_type": "bearer",
    "expires_in": 2592000,
    "refresh_token": "REFRESH_TOKEN",
    "scope": "read",
    "uid": 100101,
    "info": {
      "name": "donpadlo",
      "email": "info@mail.ru"
    }
  }';

 header('Content-Type: application/json');
 echo $json;

refresh.php:

$json='{
    "access_token": "ACCESS_TOKEN",
    "refresh_token": "'.$_GET['refresh_token'].'",
    "token_type": "bearer",
    "expires_in": 2592000 
  }';

header('Content-Type: application/json');
 echo $json;

Всё что выше — это авторизация навыка. После чего он полезет на Redirect URI  указанный в приложении, где будет ожидать ответа в формате json на два вида возможных запроса REQUEST_URI:

  • /v1.0/user/devices — получить список поддерживаемых устройств
  • /v1.0/user/devices/query — получить обновления данных

Данные для отдачи (температура, влажность) берем из очереди mqtt. В самом простом случае, шаблон устройства может выглядеть как-то так:

index.php

if ($_SERVER["REQUEST_URI"]=="/v1.0/user/devices"){
    $json='{
        "request_id": "'.$_SERVER["HTTP_X_REQUEST_ID"].'",
        "payload": {
          "user_id": "gribov_pi",
          "devices": [{
            "id": "abc-123",
            "name": "Розовая комната",
            "description": "Измеряет температуру и влажность",
            "room": "спальня",
            "type": "devices.types.sensor.climate",
            "custom_data": {
              "foo": 1,
              "bar": "two",
              "baz": false,
              "qux": [1, "two", false],
              "quux": {
                "quuz": {
                  "corge": []
                }
              }
            },
            "capabilities": [],      
            "properties": '.get_properties().',
            "device_info": {
              "manufacturer": "Грибовы.рф",
              "model": "Датчик температуры",
              "hw_version": "1.0",
              "sw_version": "1.0"
            }
          }]
        }}';
};
if ($_SERVER["REQUEST_URI"]=="/v1.0/user/devices/query"){
  $json='{
    "request_id": "'.$_SERVER["HTTP_X_REQUEST_ID"].'",
    "payload": {
      "devices": [{
        "id": "abc-123",
        "capabilities": [],
        "properties": '.get_properties().'
      }]
    }
  }';  
};
header('Content-Type: application/json');
echo $json;
die();


function get_properties(){
  return '[
    {
      "type": "devices.properties.float",
      "retrievable": true,
      "reportable": true,
      "parameters": {
        "instance": "temperature",
        "unit": "unit.temperature.celsius"
      },
      "state": {
        "instance": "temperature",
        "value": 30
      },
      "last_updated": "2025-12-29 12:12:12"
    },
    {
      "type": "devices.properties.float",
      "retrievable": true,
      "reportable": true,
      "parameters": {
        "instance": "humidity",
        "unit": "unit.percent"
      },
      "state": {
        "instance": "humidity",
        "value": 70
      },
      "last_updated": "2025-12-29 12:12:12"
    }
  ]';  
};

Подключение виртуального устройства к Алисе

Переходим в раздел «Тестирование» и подключаем вышесозданый навык:

Как видим виртуальное устройство отображается, данные в нём обновляются, и его можно штатно использовать для создания различных сценариев в Алисе:

Часть 3. Получение данных с Zigbee устройства.

В первой и второй части, был прошит и настроен стик, а так-же установлен брокер сообщений и ZigBee2mqtt, Теперь попробуем подключить устройство и получить с него данные по температуре. Устройство — самый раздешевый датчик температуры, купленный на AliExpress за 267 рублей:

Заходим в админ панель ZigBee2mqtt, по адресу: http://ip:8080 и нажимаем кнопку «Разрешить подключения». После чего на устройстве жмем кнопку reset скрепкой. Если всё удачно, то в течении нескольких секунд устройство будет обнаружено:

Далее собственно при получении данных с устройства, ZigBee2mqtt будет отсылать данные по нему в json формате в очередь вида zigbee2mqtt/0xa4c13812c854f0f7. Хвост у данной очереди — МАС адрес устройства. Нашей дальнейшей задачей является эти данные собственно принять и обработать. Для этого воспользуемся python библиотекой paho-mqtt:

pip install paho-mqtt --break-system-packages

Оформить подписку можно например так:

import context  
import paho.mqtt.subscribe as subscribe

def print_msg(client, userdata, message):
    print(message.topic)
    print(message.payload)

subscribe.callback(print_msg, "#", hostname="localhost",auth={'username':"уакукауы","password":"укепукепк"})

context.py:

# -*- coding: utf-8 -*-

# Ensure can import paho package
try:
    import paho

except ImportError:
    # This part is only required to run the examples from within the examples
    # directory when the module itself is not installed.
    import inspect
    import os
    import sys

    cmd_subfolder = os.path.realpath(
        os.path.abspath(
            os.path.join(
                os.path.split(
                    inspect.getfile(inspect.currentframe())
                )[0],
                "..",
                "src"
            )
        )
    )
    if cmd_subfolder not in sys.path:
        sys.path.insert(0, cmd_subfolder)

    import paho

Ну и далее на свой вкус и цвет дальше можно эти данные уже как угодно обрабатывать

1 2 3 300