1С и проблема чтения xlsx файлов с датами

Проблема: при разборе файла формата xlsx часть дат в ячейках сдвигается ровнехонько на 4 года назад. Т.е. открываем файл экселем — видим 2026 год. Открываем файл при помощий табличного документа 1С — видим 2022.

Долго думал.. Хорошо рядом человек оказался, который с этой проблемой уже сталкивался. Оказывается некоторые файлы xlsx сохраняются в формате в котором «эпоха» начинается с 1900г, а часть с 1904. И определить средствами 1С, в каком формате сохранен именно этот файл, нет никакой возможности — только самому делать поправку даты:

ДатаВЯчейке=ДатаВЯчейке+1462 * 86400;

Более подробно можно почитать тут

Кто виноват и что делать (с)

По моему тут дело в том, что большинству людей очень трудно посмотреть в зеркало и признать, что он видит главного виновника всех своих неудач в жизни.
Кто-то валит всё на родителей, кто-то на начальство, на плохую жену, на власть, на законы…. А кто-то — на клятых москалей.
Так гораздо проще жить.

Не знаю кто (с)

1С: Оптимизация времени разбора большого XLSX файла

Для чтения и разбора файлов формата xlsx на 1С обычно используют следующую схему разбора файла:

ТабличныйДокументХар = Новый ТабличныйДокумент; 
ТабличныйДокументХар.Прочитать(парам.ВременныйФайл,СпособЧтенияЗначенийТабличногоДокумента.Текст);		
// читаем каждый лист по отдельности
Для Каждого ОбластьТД ИЗ ТабличныйДокументХар.Области Цикл
    ОбластьФайла = ТабличныйДокументХар.ПолучитьОбласть(ОбластьТД.Имя,);
    КолВоСтрокФайла = ОбластьФайла.ПолучитьРазмерОбластиДанныхПоВертикали();
    КолВоКолонокФайла = ОбластьФайла.ПолучитьРазмерОбластиДанныхПоГоризонтали();
	НачСтрока=3;КонСтрока=0;
    НачСтрока = ?(НачСтрока = 0, 2, НачСтрока);
    КонСтрока = ?(КонСтрока = 0, КолвоСтрокФайла, КонСтрока);						
    // перебираем все строки без шапки
    Для нСтрокаТФ = НачСтрока ПО КонСтрока Цикл      				
        ПКолонка=Формат(ном_кол, "ЧГ=0");
        Данные=ОбластьФайла.ПолучитьОбласть("R"+ПСтрока + "C1").ТекущаяОбласть.Текст;
    конеццикла
конеццикла    

Так-же встречается другой вариант, у которого есть особенность — не учитывается что файл может содержать листы:

ТабличныйДокументХар = Новый ТабличныйДокумент; 
ТабличныйДокументХар.Прочитать(парам.ВременныйФайл,СпособЧтенияЗначенийТабличногоДокумента.Текст);		
КолВоСтрокФайла = ТабличныйДокументХар.ПолучитьРазмерОбластиДанныхПоВертикали();
КолВоКолонокФайла = ТабличныйДокументХар.ПолучитьРазмерОбластиДанныхПоГоризонтали();  
СтрокиДиапазона =   50000;
НачСтрокаДиапазона = 3; 
КонСтрокаДиапазона = мин(КолВоСтрокФайла, СтрокиДиапазона);
КолВоСтрокФайла_часть = КолВоСтрокФайла;
Пока  КолВоСтрокФайла_часть>0 Цикл
	ОбластьФайла = ТабличныйДокументХар.ПолучитьОбласть(НачСтрокаДиапазона,1,КонСтрокаДиапазона,КолВоКолонокФайла);		
	Если КолвоСтрокФайла = 0 Тогда ТабличныйДокументХар = Неопределено;КонецЕсли;
	Для стр = 1  по КонСтрокаДиапазона-НачСтрокаДиапазона+1 Цикл  
              Данные=ОбластьФайла.Область(стр,2).Текст;
	КонецЦикла;  
	КолВоСтрокФайла_часть = КолВоСтрокФайла_часть-СтрокиДиапазона;
	НачСтрокаДиапазона = НачСтрокаДиапазона +СтрокиДиапазона;
	КонСтрокаДиапазона = КонСтрокаДиапазона +СтрокиДиапазона;
КонецЦикла;

Если сравнивать производительность каждого метода, то выходит следующая картина (для файла размером 254 тыс строк):

Метод 1Метод 2
Время работы кода1 784 сек714 сек

Граббер всех файлов телеграм канала

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

#!/usr/bin/env python3
# encoding: utf-8
import sys
import os,fcntl
import funcs
from telethon import TelegramClient
import requests
import configparser

## Защита от дубля запуска скрипта
fp = open(os.path.realpath(__file__), 'r')
try:
    fcntl.flock(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
    sys.exit(0)

config = configparser.ConfigParser()
config.read("settings.ini")

print(config["Telegram"]["telegram_api_id"])

async def SaveFile(dir_name,message):
     if os.path.isdir(os.path.dirname(os.path.abspath(__file__))+f"/files/{dir_name}")==False:
       os.mkdir(os.path.dirname(os.path.abspath(__file__))+f"/files/{dir_name}")
     with open(os.path.dirname(os.path.abspath(__file__))+f"/files/{dir_name}/message.txt", 'w') as file:
        file.write(message.message)
     print(f"Вложения: {message.media}")
     if hasattr(message.media,"document"):
       if message.media.document != False:
         file_name=message.media.document.attributes[0].file_name
         print(f"-вложенный файл {file_name}")
         print("--сохраняю..")
         if os.path.isfile(os.path.dirname(os.path.abspath(__file__))+f"/files/{dir_name}/{file_name}")==False:
           await client.download_media(message.media, file=os.path.dirname(os.path.abspath(__file__))+f"/files/{dir_name}/{file_name}")
           print("--ок..")
         else:
           print("--уже скачивали!")
     if hasattr(message.media,"video"):
       if message.media.video!=False:
          print(f"-вложенное видео")

async def tele_news_parse():
    dp = await client.get_entity(config["Telegram"]["stl_chanel"])
    poz=int(config["Telegram"]["current_message_id"])
    print(f"-start at {poz}")
    async for message in client.iter_messages(dp,limit=10,offset_id=poz):
        print("---------------------------------------------------------")
        if hasattr(message, "message"):
            if message.message!=None:
                print(f"Сообщение: {message}")
                if message.grouped_id:
                   print("-its album!")
                   target_group_id = message.grouped_id
                   search_ids = range(message.id - 20, message.id + 21)
                   posts = await client.get_messages(config["Telegram"]["stl_chanel"], ids=list(search_ids))
                   media_group = []
                   for post in posts:
                     if post is not None and post.grouped_id == target_group_id and post.media is not None:
                      media_group.append(post)
                   for message in media_group:
                      print(f"--из альбома: {message}")
                      await SaveFile(target_group_id,message)
                else:
                  print("-its one file!")
                  await SaveFile(message.id,message)


    with open('settings.ini', 'w') as configfile:
        poz+=10
        print(f"-new poz at {poz}")
        config["Telegram"]["current_message_id"]=str(poz)
        config.write(configfile)

if __name__ == '__main__':
    client = TelegramClient("parser_data", config["Telegram"]["telegram_api_id"], config["Telegram"]["telegram_api_hash"])
    client.start()
    client.loop.run_until_complete(tele_news_parse())

Датчик давления BMP-280 на raspberry pi

Может работать как по I2C так и по протоколу SPI. В моём случае, я подключил по I2C.

Схема подключения:

BMP280 PinRaspberry Pi Pin
VCC3.3V (Pin 1)
GNDGround (Pin 6)
SDASDA (Pin 3, GPIO2)
SCLSCL (Pin 5, GPIO3)

Далее необходимо зайти в raspi-config и включить интерфейс i2c. После чего понадобится малинку перазагрузить. После перезагрузки можно посмотреть, определяется ли она:

i2cdetect -y 1

Должно появиться что-то вроде:

Иногда садится на 77 порт, но чаще на 76. Далее необходимо установить библиотеки:

sudo apt install -y python3-smbus python3-spidev python3-pip
pip3 install adafruit-circuitpython-bmp280

Минимальный код для проверки работоспособности:

#!/usr/bin/env python3
import board
import busio
import adafruit_bmp280
import time
import datetime
import requests
import json
import threading

# Create sensor object using the I2C port
i2c = busio.I2C(board.SCL,board.SDA)
sensor = adafruit_bmp280.Adafruit_BMP280_I2C(i2c, address = 0x76)


while True:
    print("\nTemperature: %0.1f C" % sensor.temperature)
    print("Pressure: %0.1f hPa" % sensor.pressure)
    mmHg = sensor.pressure * 0.75006
    print("Pressure: %0.1f mmHg" % mmHg)
    print("Altitude: %0.2f meters" % sensor.altitude)
    print("Sea Level Pressure: %0.1f hPa " % sensor.sea_level_pressure)
    print(datetime.datetime.now())
    time.sleep(10)

У меня выводит что-то подобное:

1 2 3 312