Gists

ffmpeg remove audio
ffmpeg -i $input_file -c copy -an $output_file
base64
$ base64 -i myfont.ttf -o fontbase64.txt
macbook crazy usb
$ sudo killall -STOP -c usbd
postgres reduce db size
VACUUM tbl_name;
VACUUM FULL tbl_name;
postgres table sizes
select
  table_name,
  pg_size_pretty(pg_total_relation_size(quote_ident(table_name))),
  pg_total_relation_size(quote_ident(table_name))
from information_schema.tables
where table_schema = 'public'
order by 3 desc;
1c map value from one range to another
Функция map(x, in_min, in_max, out_min, out_max) Экспорт
	return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
КонецФункции
1c колонтитул
Макет.НижнийКолонтитул.ТекстСлева = "ООО " + СтруктПарамОрг.КомпанияНаименованиеООО + Символы.ПС;
1c /c ЗапуститьОбновлениеИнформационнойБазы
/c ЗапуститьОбновлениеИнформационнойБазы
sql truncate generator
SELECT concat('TRUNCATE TABLE ', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '_Doc%'
1c URI
Функция СтруктураURI(Знач СтрокаURI) Экспорт
    
    СтрокаURI = СокрЛП(СтрокаURI);
    
    // схема
    Схема = "";
    Позиция = Найти(СтрокаURI, "://");
    Если Позиция > 0 Тогда
        Схема = НРег(Лев(СтрокаURI, Позиция - 1));
        СтрокаURI = Сред(СтрокаURI, Позиция + 3);
    КонецЕсли;

    // строка соединения и путь на сервере
    СтрокаСоединения = СтрокаURI;
    ПутьНаСервере = "";
    Позиция = Найти(СтрокаСоединения, "/");
    Если Позиция > 0 Тогда
        ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1);
        СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1);
    КонецЕсли;
        
    // информация пользователя и имя сервера
    СтрокаАвторизации = "";
    ИмяСервера = СтрокаСоединения;
    Позиция = Найти(СтрокаСоединения, "*");
    Если Позиция > 0 Тогда
        СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1);
        ИмяСервера = Сред(СтрокаСоединения, Позиция + 1);
    КонецЕсли;
    
    // логин и пароль
    Логин = СтрокаАвторизации;
    Пароль = "";
    Позиция = Найти(СтрокаАвторизации, ":");
    Если Позиция > 0 Тогда
        Логин = Лев(СтрокаАвторизации, Позиция - 1);
        Пароль = Сред(СтрокаАвторизации, Позиция + 1);
    КонецЕсли;
    
    // хост и порт
    Хост = ИмяСервера;
    Порт =
	"";
    Позиция = Найти(ИмяСервера, ":");
    Если Позиция > 0 Тогда
        Хост = Лев(ИмяСервера, Позиция - 1);
        Порт = Сред(ИмяСервера, Позиция + 1);
    КонецЕсли;
    
    Результат = Новый Структура;
    Результат.Вставить("Схема", Схема);
    Результат.Вставить("Логин", Логин);
    Результат.Вставить("Пароль", Пароль);
    Результат.Вставить("ИмяСервера", ИмяСервера);
    Результат.Вставить("Хост", Хост);
    Результат.Вставить("Порт", ?(Порт <> "", Число(Порт), Неопределено));
    Результат.Вставить("ПутьНаСервере", ПутьНаСервере);
    
    Возврат Результат;
    
КонецФункции
holy crap
/Applications/Yandex.app/Contents/MacOS/Yandex --no-sandbox
cryptoshit
/Applications/Yandex.app/Contents/MacOS/Yandex --no-sandbox
1с без нулей
Функция ПолучитьНомерБезПрефиксаИНулей(Знач Номер) Экспорт
	ЧистыйНомер = "";
	Длина = СтрДлина(Номер);
	Индекс = 0;
	Для Сч = 1 По Длина Цикл
		С = Сред(Номер, Сч, 1);
		Если С = "1"
			ИЛИ С = "2"
			ИЛИ С = "3"
			ИЛИ С = "4"
			ИЛИ С = "5"
			ИЛИ С = "6"
			ИЛИ С = "7"
			ИЛИ С = "8"
			ИЛИ С = "9"
			Тогда
			Индекс = Сч;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	Возврат Прав(Номер, Длина - Индекс + 1);
КонецФункции
1с удалить повторяющиеся элементы массива
Функция УдалитьПовторяющиесяЭлементыМассива(Массив) Экспорт 
	ТекущийИндекс = 0; 
	ВсегоЭлементов = Массив.Количество(); 
	Пока ТекущийИндекс < ВсегоЭлементов Цикл 
		Индекс2 = ТекущийИндекс + 1; 
		Пока Индекс2 < ВсегоЭлементов Цикл 
			Если Массив[Индекс2] = Массив[ТекущийИндекс] Тогда 
				Массив.Удалить(Индекс2); 
				ВсегоЭлементов = ВсегоЭлементов - 1; 
			Иначе 
				Индекс2 = Индекс2 + 1; 
			КонецЕсли; 
		КонецЦикла; 
		ТекущийИндекс = ТекущийИндекс + 1; 
	КонецЦикла; 
	Возврат Массив;
КонецФункции
tmp
ШК = Формат(ТекущаяДата(), "ДФ=гг");
ДлинаНомера = СтрДлина(ПараметрыПаспорта.ОсновныеПараметры.Номер);
Для Сч = 1 по 10 - ДлинаНомера Цикл
	ШК = ШК + "0";	
КонецЦикла;
ШК = ШК + ПараметрыПаспорта.ОсновныеПараметры.Номер;
ИмяФайлаШтрихкода = ПолучитьИмяВременногоФайла("jpg");
Соединение = Новый HTTPСоединение("***", , , , , , Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/barcode?barcode=" + ШК);
Ответ = Соединение.Получить(Запрос, ИмяФайлаШтрихкода);
macos remove quaratine
xattr -d -r com.apple.quarantine [PATHTOFILE]
ЗУП запрос отработано удержано
ВЫБРАТЬ
	&Сотрудник КАК Сотрудник,
	&ФизическоеЛицо КАК ФизическоеЛицо,
	&ГрафикРаботы КАК ГрафикРаботы
ПОМЕСТИТЬ ВТСотрудник
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Удержания.ФизическоеЛицо КАК ФизическоеЛицо,
	Удержания.Результат КАК Результат,
	Удержания.ИдентификаторСтроки КАК ИдентификаторСтроки,
	Удержания.Регистратор КАК Регистратор,
	ЗначенияПоказателейУдержаний.Значение КАК Значение,
	ЗначенияПоказателейУдержаний.Показатель КАК Показатель,
	ДанныеПоГрафику.Дни КАК ДнейПоГрафику,
	ДанныеПоГрафику.Часы КАК ЧасовПоГрафику,
	Отработано.Дней КАК ОтработаноДней,
	Отработано.Часов КАК ОтработаноЧасов
ИЗ
	ВТСотрудник КАК ВТСотрудник
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.Удержания КАК Удержания
		ПО (Удержания.ФизическоеЛицо = ВТСотрудник.ФизическоеЛицо)
			И (Удержания.ПериодРегистрации = &ПериодРегистрации)
			И (Удержания.ВидРасчета = &ВидРасчета)
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияПоказателейУдержаний КАК ЗначенияПоказателейУдержаний
		ПО (Удержания.Регистратор = ЗначенияПоказателейУдержаний.Регистратор)
			И (ЗначенияПоказателейУдержаний.Показатель = ЗНАЧЕНИЕ(Справочник.ПоказателиРасчетаЗарплаты.РасчетнаяБаза))
			И (ЗначенияПоказателейУдержаний.ИдентификаторСтроки = Удержания.ИдентификаторСтроки)
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			ГрафикиРаботыПоВидамВремени.ГрафикРаботы КАК ГрафикРаботы,
			СУММА(ГрафикиРаботыПоВидамВремени.ОсновноеЗначение) КАК Дни,
			СУММА(ГрафикиРаботыПоВидамВремени.ДополнительноеЗначение) КАК Часы
		ИЗ
			РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботыПоВидамВремени
		ГДЕ
			ГрафикиРаботыПоВидамВремени.ГрафикРаботы = &ГрафикРаботы
			И ГрафикиРаботыПоВидамВремени.Дата МЕЖДУ &Дата1 И &Дата2
			И ГрафикиРаботыПоВидамВремени.ВидУчетаВремени = &ВидУчетаВремени
		
		СГРУППИРОВАТЬ ПО
			ГрафикиРаботыПоВидамВремени.ГрафикРаботы) КАК ДанныеПоГрафику
		ПО ВТСотрудник.ГрафикРаботы = ДанныеПоГрафику.ГрафикРаботы
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			ОтработанноеВремяПоСотрудникамОбороты.ФизическоеЛицо КАК ФизическоеЛицо,
			ОтработанноеВремяПоСотрудникамОбороты.ОтработаноДнейОборот КАК Дней,
			ОтработанноеВремяПоСотрудникамОбороты.ОтработаноЧасовОборот КАК Часов,
			ОтработанноеВремяПоСотрудникамОбороты.ОплаченоДнейОборот КАК ОплаченоДнейОборот,
			ОтработанноеВремяПоСотрудникамОбороты.ОплаченоЧасовОборот КАК ОплаченоЧасовОборот
		ИЗ
			РегистрНакопления.ОтработанноеВремяПоСотрудникам.Обороты(&Дата1, &Дата2, День, Сотрудник = &Сотрудник) КАК ОтработанноеВремяПоСотрудникамОбороты) КАК Отработано
		ПО ВТСотрудник.ФизическоеЛицо = Отработано.ФизическоеЛицо
ЗУП ЗАПРОС дни/часы по графику работы
ВЫБРАТЬ
	ГрафикиРаботыПоВидамВремени.ГрафикРаботы КАК ГрафикРаботы,
	СУММА(ГрафикиРаботыПоВидамВремени.ОсновноеЗначение) КАК Дни,
	СУММА(ГрафикиРаботыПоВидамВремени.ДополнительноеЗначение) КАК Часы
ИЗ
	РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботыПоВидамВремени
ГДЕ
	ГрафикиРаботыПоВидамВремени.ГрафикРаботы = &ГрафикРаботы
	И ГрафикиРаботыПоВидамВремени.Дата МЕЖДУ &Дата1 И &Дата2
	И ГрафикиРаботыПоВидамВремени.ВидУчетаВремени = &ВидУчетаВремени

СГРУППИРОВАТЬ ПО
	ГрафикиРаботыПоВидамВремени.ГрафикРаботы
ios endless trust
sudo killall -STOP -c usbd
*nix rsync
rsync -av @: ./
*nix find and move
find  -type f -print0 | xargs -0 -I {} mv {} 
*nix port check
sudo netstat -naptu | grep 

sudo ss -atnp | grep 
1c last incoming
ВЫБРАТЬ
	Н.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТТовары
ИЗ
	Справочник.Номенклатура КАК Н
ГДЕ
	Н.Ссылка В(&МассивНоменклатур)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Т.Ссылка КАК Номенклатура,
	МАКСИМУМ(Товары.Ссылка.Дата) КАК ДатаПоследнегоПоступления
ПОМЕСТИТЬ ВТДатаПоследнегоПоступления
ИЗ
	ВТТовары КАК Т
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПриобретениеТоваровУслуг.Товары КАК Товары
		ПО Т.Ссылка = Товары.Номенклатура
ГДЕ
	Товары.Ссылка.Проведен

СГРУППИРОВАТЬ ПО
	Т.Ссылка

ИНДЕКСИРОВАТЬ ПО
	Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ПоследниеПоступления.Номенклатура КАК Номенклатура,
	ПоследниеПоступления.ДатаПоследнегоПоступления КАК ДатаПоследнегоПоступления,
	ПоследниеЦены.Цена КАК ПоследняяЗакупочнаяЦена
ИЗ
	ВТДатаПоследнегоПоступления КАК ПоследниеПоступления
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриобретениеТоваровУслуг.Товары КАК ПоследниеЦены
		ПО ПоследниеПоступления.Номенклатура = ПоследниеЦены.Номенклатура
			И ПоследниеПоступления.ДатаПоследнегоПоступления = ПоследниеЦены.Ссылка.Дата
			И (ПоследниеЦены.Ссылка.Проведен)
pyinstaller
pyinstaller --onefile --noconsole run.py
ffmpeg mov -> mp4
ffmpeg -i my-video.mov -vcodec h264 -acodec mp2 my-video.mp4
cron linux find and delete files older than 10 days (but not dirs)
0 4 * * * find /<path>/* -mtime +10 -delete
SQL check *.mdf version
dbcc checkprimaryfile ('F:\DBASE\SQL\1C\ut.mdf', 2)
.vimrc
syntax on
set number
set tabstop=4
set expandtab
set nowrap
django get postgres version
from django.db import connection

print(connection.cursor().connection.server_version)
1с длительные операции
Выполняемая процедура должна быть в модуле менеджера.
Запуск на клиенте.
1c datamobile ws config
<point name="DataMobileExch"
				alias="wsDMExch.1cws"
				enable="true"
				reuseSessions="dontuse"
				sessionMaxAge="20"
				poolSize="10"
				poolTimeout="5"/>
1c clients managers
ВЫБРАТЬ
	ПоследниеДокументыКонтрагентов.Контрагент.Наименование КАК Наименование,
	ПоследниеДокументыКонтрагентов.Контрагент.Код КАК КодКонтрагента,
	ПоследниеДокументыКонтрагентов.Контрагент.ИНН КАК ИНН,
	ПоследниеДокументыКонтрагентов.Контрагент.НаименованиеПолное КАК НаименованиеПолное,
	НАЧАЛОПЕРИОДА(ПоследниеДокументыКонтрагентов.Дата, ДЕНЬ) КАК ПоследнийЗаказ,
	ПоследниеДокументыКонтрагентов.Ответственный,
	ПоследниеДокументыКонтрагентов.Ссылка
ИЗ
	Документ.ЗаказПокупателя КАК ПоследниеДокументыКонтрагентов
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			Доки.Контрагент КАК Контрагент,
			МАКСИМУМ(Доки.Дата) КАК ДатаПоследнегоДокумента
		ИЗ
			Документ.ЗаказПокупателя КАК Доки
		ГДЕ НЕ Доки.ПометкаУдаления И Доки.Проведен
		СГРУППИРОВАТЬ ПО
			Доки.Контрагент) КАК ДатыПоследнихДокументовКонтрагентов
		ПО ПоследниеДокументыКонтрагентов.Контрагент = ДатыПоследнихДокументовКонтрагентов.Контрагент
			И ПоследниеДокументыКонтрагентов.Дата = ДатыПоследнихДокументовКонтрагентов.ДатаПоследнегоДокумента

ГДЕ НЕ ПоследниеДокументыКонтрагентов.Контрагент = &ПустаяСсылка
И НЕ ПоследниеДокументыКонтрагентов.ПометкаУдаления И ПоследниеДокументыКонтрагентов.Проведен
УПОРЯДОЧИТЬ ПО
	ПоследниеДокументыКонтрагентов.Контрагент.Наименование,
	ПоследнийЗаказ УБЫВ
python postgres dumper
#!/usr/bin/env python3

'''
Simplest PostgreSQL db dumper and backup rotator.

Put it on cron.

Removes backups with BACKUP_PREFIX
in BACKUP_PATH older than BACKUP_DAYS.

Easy as pie.
'''


from datetime import datetime
import os
from pathlib import Path
from subprocess import Popen, PIPE
import sys
import time


now = time.time()
now_formatted = datetime.now().strftime('%d-%m-%Y_%H-%M')

DB_USER = ''
DB_PASSWORD = ''
DB_NAME = ''
DB_PORT = ''
DB_HOST = ''
DB_PASSWORD = ''
BACKUP_PREFIX = ''
BACKUP_PATH = Path('')
BACKUP_DAYS = 4

dump_name = '{}/{}{}.pg'.format(BACKUP_PATH, BACKUP_PREFIX, now_formatted)
dump_cmd = f'pg_dump -h {DB_HOST} -p {DB_PORT} -U {DB_USER} -Fc {DB_NAME} > {dump_name}'
os.environ['PGPASSWORD'] = DB_PASSWORD

popen = Popen(dump_cmd, shell=True)
popen.wait()

for f in os.listdir(BACKUP_PATH):
    if not f.startswith(BACKUP_PREFIX):
        continue
    f = os.path.join(BACKUP_PATH, f)
    if os.stat(f).st_mtime < now - BACKUP_DAYS * 86400:
        if os.path.isfile(f):
            os.remove(os.path.join(BACKUP_PATH, f))
mounting exfat external drive stalls on macos
taken from: https://developer.apple.com/forums/thread/680500

"Anyways, if your disk happens to be ExFAT, and you remember improperly removing the disk the last time you used it, chances are, fsck is holding it hostage (metaphorically, of course). fsck is trying to repair the disk, but it will stall forever, so you want to launch Disk Utility, and the Terminal. Try to mount the disk, and switch to Terminal and write sudo pkill -f fsck. The disk will mount in read-only mode, and from there, you can repair it with First Aid in Disk Utility. This won't work for non-ExFat drives, as macOS manages them differently."
ОС Вариатор
ВЫБРАТЬ
	ИзменениеПараметровНачисленияАмортизацииОСОС.Ссылка КАК Ссылка,
	ИзменениеПараметровНачисленияАмортизацииОСОС.ОсновноеСредство КАК ОС,
	ИзменениеПараметровНачисленияАмортизацииОСОС.СрокПолезногоИспользованияБУ КАК СрокПолезногоИспользованияБУ
ПОМЕСТИТЬ ВТИзменениеПараметров
ИЗ
	Документ.ИзменениеПараметровНачисленияАмортизацииОС.ОС КАК ИзменениеПараметровНачисленияАмортизацииОСОС
ГДЕ
	ИзменениеПараметровНачисленияАмортизацииОСОС.Ссылка.Дата МЕЖДУ &ДатаИзмененийОС1 И &ДатаИзмененийОС2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Данные.ОС КАК ОС,
	СУММА(Данные.Остаток01 - Данные.Остаток02) КАК Остаток
ПОМЕСТИТЬ ВТОстаткиАмортизации
ИЗ
	(ВЫБРАТЬ
		ХозрасчетныйОстатки01.Субконто1 КАК ОС,
		ХозрасчетныйОстатки01.СуммаОстатокДт КАК Остаток01,
		0 КАК Остаток02
	ИЗ
		РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаРасчета, , , ) КАК ХозрасчетныйОстатки01
	ГДЕ
		ХозрасчетныйОстатки01.Счет = &Счет0101
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		ХозрасчетныйОстатки02.Субконто1,
		0,
		ХозрасчетныйОстатки02.СуммаОстатокКт
	ИЗ
		РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаРасчета, , , ) КАК ХозрасчетныйОстатки02
	ГДЕ
		ХозрасчетныйОстатки02.Счет = &Счет0201) КАК Данные

СГРУППИРОВАТЬ ПО
	Данные.ОС
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	СостоянияОСОрганизацийСрезПоследних.ОсновноеСредство КАК ОС,
	СостоянияОСОрганизацийСрезПоследних.ОсновноеСредство.Код КАК ИнвНомер,
	СостоянияОСОрганизацийСрезПоследних.ДатаСостояния КАК ДатаПринятияКУчету,
	СостоянияОСОрганизацийСрезПоследних.ОсновноеСредство.ГруппаОС КАК ОсновноеСредствоГруппаОС,
	ПервоначальныеСведенияОСБухгалтерскийУчетСрезПоследних.ПервоначальнаяСтоимость КАК ПервоначальнаяСтоимостьБУ,
	ПараметрыАмортизацииОСБухгалтерскийУчетСрезПоследних.СрокПолезногоИспользования КАК СрокПолезногоИспользованияБУ,
	ВЫРАЗИТЬ(ПараметрыАмортизацииОСБухгалтерскийУчетСрезПоследних.СрокПолезногоИспользования / 12 КАК ЧИСЛО(3, 0)) КАК СрокПолезногоИспользованияБУЛет,
	ДОБАВИТЬКДАТЕ(СостоянияОСОрганизацийСрезПоследних.ДатаСостояния, ГОД, ВЫРАЗИТЬ(ПараметрыАмортизацииОСБухгалтерскийУчетСрезПоследних.СрокПолезногоИспользования / 12 КАК ЧИСЛО(3, 0))) КАК ПризнакАктуальности,
	ЕСТЬNULL(ИзменениеПараметров.Ссылка, &ПустаяСсылка) КАК СсылкаНаИзменениеПараметров,
	ВЫБОР
		КОГДА ЕСТЬNULL(ПараметрыАмортизацииОСБухгалтерскийУчетСрезПоследних.СрокПолезногоИспользования, 0) = 0
			ТОГДА 0
		ИНАЧЕ ВЫРАЗИТЬ(ПервоначальныеСведенияОСБухгалтерскийУчетСрезПоследних.ПервоначальнаяСтоимость / ПараметрыАмортизацииОСБухгалтерскийУчетСрезПоследних.СрокПолезногоИспользования КАК ЧИСЛО(15, 2))
	КОНЕЦ КАК ЕжемесячнаяАмортизация,
	ОстаткиАмортизации.Остаток КАК ОстатокАмортизации
ПОМЕСТИТЬ ВТОС
ИЗ
	РегистрСведений.СостоянияОСОрганизаций.СрезПоследних(&ДатаРасчета, ) КАК СостоянияОСОрганизацийСрезПоследних
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПервоначальныеСведенияОСБухгалтерскийУчет.СрезПоследних(&ДатаРасчета, ) КАК ПервоначальныеСведенияОСБухгалтерскийУчетСрезПоследних
		ПО СостоянияОСОрганизацийСрезПоследних.ОсновноеСредство = ПервоначальныеСведенияОСБухгалтерскийУчетСрезПоследних.ОсновноеСредство
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПараметрыАмортизацииОСБухгалтерскийУчет.СрезПоследних(&ДатаРасчета, ) КАК ПараметрыАмортизацииОСБухгалтерскийУчетСрезПоследних
		ПО СостоянияОСОрганизацийСрезПоследних.ОсновноеСредство = ПараметрыАмортизацииОСБухгалтерскийУчетСрезПоследних.ОсновноеСредство
		ЛЕВОЕ СОЕДИНЕНИЕ ВТОстаткиАмортизации КАК ОстаткиАмортизации
		ПО СостоянияОСОрганизацийСрезПоследних.ОсновноеСредство = ОстаткиАмортизации.ОС
		ЛЕВОЕ СОЕДИНЕНИЕ ВТИзменениеПараметров КАК ИзменениеПараметров
		ПО СостоянияОСОрганизацийСрезПоследних.ОсновноеСредство = ИзменениеПараметров.ОС
ГДЕ
	СостоянияОСОрганизацийСрезПоследних.Состояние <> &СостояниеСнятоСУчета
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 39
	ВТОС.ОС КАК ОС,
	ВТОС.ОС.ГруппаОС КАК ГруппаОС,
	ВТОС.ИнвНомер КАК ИнвНомер,
	ВТОС.СсылкаНаИзменениеПараметров КАК СсылкаНаИзменениеПараметров,
	ВТОС.ОсновноеСредствоГруппаОС КАК ОсновноеСредствоГруппаОС,
	ВТОС.ПервоначальнаяСтоимостьБУ КАК ПервоначальнаяСтоимостьБУ,
	ВТОС.ДатаПринятияКУчету КАК ДатаПринятияКУчету,
	ВТОС.СрокПолезногоИспользованияБУ КАК СрокПолезногоИспользованияБУ,
	ВТОС.СрокПолезногоИспользованияБУЛет КАК СрокПолезногоИспользованияБУЛет,
	ВТОС.ОстатокАмортизации КАК ОстатокАмортизации,
	
	ВТОС.ЕжемесячнаяАмортизация КАК ЕжемесячнаяАмортизация,
	
	// Что если мы увеличим срок полезного использования на 30%?
	ВТОС.СрокПолезногоИспользованияБУ * 1.3 КАК НовыйСрок,
	ВЫРАЗИТЬ(ВТОС.СрокПолезногоИспользованияБУ * 1.3 / 12 КАК ЧИСЛО(3, 0)) КАК НовыйСрокЛет,
	ВТОС.ПервоначальнаяСтоимостьБУ / (ВТОС.СрокПолезногоИспользованияБУ * 1.3) КАК НоваяЕжемесячнаяАмортизация,
	
	// Что если мы установим срок полезного использования = 50 лет?
	50 * 12 КАК НовыйСрок50,
	50 КАК НовыйСрок50Лет,
	ВТОС.ПервоначальнаяСтоимостьБУ / (50*12) КАК НоваяЕжемесячнаяАмортизация50Лет
	
ПОМЕСТИТЬ ВТДанные
ИЗ
	ВТОС КАК ВТОС
ГДЕ
	ВТОС.ОстатокАмортизации > 0
	И ВТОС.ОС.ГруппаОС = &ГруппаОССооружения
	И ВТОС.СрокПолезногоИспользованияБУЛет > 5
	И ВТОС.ЕжемесячнаяАмортизация > 500000
	И ВТОС.СсылкаНаИзменениеПараметров = &ПустаяСсылка
	И ВТОС.ПризнакАктуальности > &ДатаНачало2022

УПОРЯДОЧИТЬ ПО
	ВТОС.ДатаПринятияКУчету
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	СУММА(Д.Было) КАК Было,
	СУММА(Д.Стало) КАК Стало,
	СУММА(Д.Стало) - СУММА(Д.Было) КАК Изменение,
	СУММА(Д.Стало50) - СУММА(Д.Было) КАК Изменение50Лет
ПОМЕСТИТЬ ВТДельты
ИЗ
	(ВЫБРАТЬ
		СУММА(Д1.ЕжемесячнаяАмортизация) КАК Было,
		0 КАК Стало,
		0 КАК Стало50
	ИЗ
		ВТДанные КАК Д1
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		0,
		СУММА(Д2.НоваяЕжемесячнаяАмортизация),
		0
	ИЗ
		ВТДанные КАК Д2
		ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		0,
		0,
		Д3.НоваяЕжемесячнаяАмортизация50Лет
	ИЗ
		ВТДанные КАК Д3) КАК Д;
		
ВЫБРАТЬ * ИЗ ВТДельты
python tk threaded output to textwidget
#https://github.com/beenje/tkinter-logging-text-widget

import datetime
import queue
import logging
import signal
import time
import threading
import tkinter as tk
from tkinter.scrolledtext import ScrolledText
from tkinter import ttk, VERTICAL, HORIZONTAL, N, S, E, W


logger = logging.getLogger(__name__)


class Clock(threading.Thread):
    """Class to display the time every seconds

    Every 5 seconds, the time is displayed using the logging.ERROR level
    to show that different colors are associated to the log levels
    """

    def __init__(self):
        super().__init__()
        self._stop_event = threading.Event()

    def run(self):
        logger.debug('Clock started')
        previous = -1
        while not self._stop_event.is_set():
            now = datetime.datetime.now()
            if previous != now.second:
                previous = now.second
                if now.second % 5 == 0:
                    level = logging.ERROR
                else:
                    level = logging.INFO
                logger.log(level, now)
            time.sleep(0.2)

    def stop(self):
        self._stop_event.set()


class QueueHandler(logging.Handler):
    """Class to send logging records to a queue

    It can be used from different threads
    The ConsoleUi class polls this queue to display records in a ScrolledText widget
    """
    # Example from Moshe Kaplan: https://gist.github.com/moshekaplan/c425f861de7bbf28ef06
    # (https://stackoverflow.com/questions/13318742/python-logging-to-tkinter-text-widget) is not thread safe!
    # See https://stackoverflow.com/questions/43909849/tkinter-python-crashes-on-new-thread-trying-to-log-on-main-thread

    def __init__(self, log_queue):
        super().__init__()
        self.log_queue = log_queue

    def emit(self, record):
        self.log_queue.put(record)


class ConsoleUi:
    """Poll messages from a logging queue and display them in a scrolled text widget"""

    def __init__(self, frame):
        self.frame = frame
        # Create a ScrolledText wdiget
        self.scrolled_text = ScrolledText(frame, state='disabled', height=12)
        self.scrolled_text.grid(row=0, column=0, sticky=(N, S, W, E))
        self.scrolled_text.configure(font='TkFixedFont')
        self.scrolled_text.tag_config('INFO', foreground='black')
        self.scrolled_text.tag_config('DEBUG', foreground='gray')
        self.scrolled_text.tag_config('WARNING', foreground='orange')
        self.scrolled_text.tag_config('ERROR', foreground='red')
        self.scrolled_text.tag_config('CRITICAL', foreground='red', underline=1)
        # Create a logging handler using a queue
        self.log_queue = queue.Queue()
        self.queue_handler = QueueHandler(self.log_queue)
        formatter = logging.Formatter('%(asctime)s: %(message)s')
        self.queue_handler.setFormatter(formatter)
        logger.addHandler(self.queue_handler)
        # Start polling messages from the queue
        self.frame.after(100, self.poll_log_queue)

    def display(self, record):
        msg = self.queue_handler.format(record)
        self.scrolled_text.configure(state='normal')
        self.scrolled_text.insert(tk.END, msg + '\n', record.levelname)
        self.scrolled_text.configure(state='disabled')
        # Autoscroll to the bottom
        self.scrolled_text.yview(tk.END)

    def poll_log_queue(self):
        # Check every 100ms if there is a new message in the queue to display
        while True:
            try:
                record = self.log_queue.get(block=False)
            except queue.Empty:
                break
            else:
                self.display(record)
        self.frame.after(100, self.poll_log_queue)


class FormUi:

    def __init__(self, frame):
        self.frame = frame
        # Create a combobbox to select the logging level
        values = ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']
        self.level = tk.StringVar()
        ttk.Label(self.frame, text='Level:').grid(column=0, row=0, sticky=W)
        self.combobox = ttk.Combobox(
            self.frame,
            textvariable=self.level,
            width=25,
            state='readonly',
            values=values
        )
        self.combobox.current(0)
        self.combobox.grid(column=1, row=0, sticky=(W, E))
        # Create a text field to enter a message
        self.message = tk.StringVar()
        ttk.Label(self.frame, text='Message:').grid(column=0, row=1, sticky=W)
        ttk.Entry(self.frame, textvariable=self.message, width=25).grid(column=1, row=1, sticky=(W, E))
        # Add a button to log the message
        self.button = ttk.Button(self.frame, text='Submit', command=self.submit_message)
        self.button.grid(column=1, row=2, sticky=W)

    def submit_message(self):
        # Get the logging level numeric value
        lvl = getattr(logging, self.level.get())
        logger.log(lvl, self.message.get())


class ThirdUi:

    def __init__(self, frame):
        self.frame = frame
        ttk.Label(self.frame, text='This is just an example of a third frame').grid(column=0, row=1, sticky=W)
        ttk.Label(self.frame, text='With another line here!').grid(column=0, row=4, sticky=W)


class App:

    def __init__(self, root):
        self.root = root
        root.title('Logging Handler')
        root.columnconfigure(0, weight=1)
        root.rowconfigure(0, weight=1)
        # Create the panes and frames
        vertical_pane = ttk.PanedWindow(self.root, orient=VERTICAL)
        vertical_pane.grid(row=0, column=0, sticky="nsew")
        horizontal_pane = ttk.PanedWindow(vertical_pane, orient=HORIZONTAL)
        vertical_pane.add(horizontal_pane)
        form_frame = ttk.Labelframe(horizontal_pane, text="MyForm")
        form_frame.columnconfigure(1, weight=1)
        horizontal_pane.add(form_frame, weight=1)
        console_frame = ttk.Labelframe(horizontal_pane, text="Console")
        console_frame.columnconfigure(0, weight=1)
        console_frame.rowconfigure(0, weight=1)
        horizontal_pane.add(console_frame, weight=1)
        third_frame = ttk.Labelframe(vertical_pane, text="Third Frame")
        vertical_pane.add(third_frame, weight=1)
        # Initialize all frames
        self.form = FormUi(form_frame)
        self.console = ConsoleUi(console_frame)
        self.third = ThirdUi(third_frame)
        self.clock = Clock()
        self.clock.start()
        self.root.protocol('WM_DELETE_WINDOW', self.quit)
        self.root.bind('', self.quit)
        signal.signal(signal.SIGINT, self.quit)

    def quit(self, *args):
        self.clock.stop()
        self.root.destroy()


def main():
    logging.basicConfig(level=logging.DEBUG)
    root = tk.Tk()
    app = App(root)
    app.root.mainloop()


if __name__ == '__main__':
    main()
1c user message
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Товары не заполнены";
Сообщение.Поле = "Товары";
Сообщение.Сообщить();
Отказ = Истина;
1с ням
#Область Например_ОбъявлениеТипов
Если Ложь Тогда Док = Документы.РеализацияТоваровУслуг.СоздатьДокумент() КонецЕсли;
#КонецОбласти
Django InformationRegisterManager
class InformationRegisterManager(models.Manager):
    def get_latest(slice_date=None):
        if not slice_date:
            slice_date = timezone_now()
        q = '''
        SELECT
            cpp.product_id,
            p.article,
            cpp.competitor_id,
            cpp.price,
            cpp.created_at
        FROM
            marketing_competitorproductprice AS cpp
            INNER JOIN (
                SELECT
                    MAX(cpp_inner.created_at) AS maxdate,
                    cpp_inner.product_id,
                    cpp_inner.competitor_id
                FROM
                    marketing_competitorproductprice AS cpp_inner
                GROUP BY
                    cpp_inner.product_id,
                    cpp_inner.competitor_id
            ) AS filter
            ON
                cpp.product_id = filter.product_id
                AND cpp.competitor_id = filter.competitor_id
                AND cpp.created_at = filter.maxdate
            JOIN catalog_product as p
            ON cpp.product_id = p.id
        '''
        rows = runsql(q, [])
        return rows
1c read *.xls[x] on client
&НаКлиенте
Процедура ОткрытьФайл(Команда)

    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

    ДиалогВыбораФайла.Заголовок = "Прочитать табличный документ из файла";
    ДиалогВыбораФайла.Фильтр = "Лист Excel 2007+ (*.xlsx)|*.xlsx| Лист Excel 2003 (*.xls)|*.xls|";

    Если ДиалогВыбораФайла.Выбрать() Тогда
        Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ДиалогВыбораФайла.ПолноеИмяФайла));
        ЗагрузитьТабличныйДокументИзФайла(Адрес, ДиалогВыбораФайла.ПолноеИмяФайла);
    КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ЗагрузитьТабличныйДокументИзФайла(Адрес, ИмяФайла)

    //Необходимо чтение файлов XLS или XLSX
    Расширение = Прав(ИмяФайла, 4);
    Расширение = СтрЗаменить(Расширение, ".", "");

    ФайлПриемник = ПолучитьИмяВременногоФайла(Расширение);
    ДанныеХранилища = ПолучитьИзВременногоХранилища(Адрес);
    ДанныеХранилища.Записать(ФайлПриемник);

    ТабличныйДокумент.Очистить();
    ТабличныйДокумент.Прочитать(ФайлПриемник);

КонецПроцедуры
Get your local Git repository on Bitbucket
Step 1: Switch to your repository's directory
$ cd /path/to/your/repo

Step 2: Connect your existing repository to Bitbucket
$ git remote add origin git@bitbucket.org:qaua/vrbb.git
$ git push -u origin master
1c save/restore report builder settings
// НастройкиПостроителя - реквизит обработки (Строка, неогр)

// событие формы
Процедура ПередСохранениемЗначений(Отказ)
	НастройкиПостроителя = ЗначениеВСтрокуВнутр(ПостроительОтчета.ПолучитьНастройки());
КонецПроцедуры

Процедура ВосстановитьНастройкиПостроителя()
	Если СокрЛП(НастройкиПостроителя) <> "" Тогда
        Попытка
            ПостроительОтчета.УстановитьНастройки(ЗначениеИзСтрокиВнутр(НастройкиПостроителя));
        Исключение
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры

// событие формы
Процедура ПриОткрытии()
	ВосстановитьНастройкиПостроителя();
КонецПроцедуры

// событие формы
Процедура ПослеВосстановленияЗначений()
	ВосстановитьНастройкиПостроителя();
КонецПроцедуры
1c ADO Excel
&НаСервере
Функция ОбработатьФайлНаСервере(ПутьКФайлу)
    first_row = 1;
    last_row = 0;

    conn_string = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + СокрЛП(ПутьКФайлу) + ";Extended Properties=""Excel 12.0;HDR=NO;IMEX=1;""";
    ADODBConnection = New COMObject("ADODB.Connection");
    ADODBConnection.ConnectionString = conn_string;

    Try
        ADODBConnection.Open();
    Except
        Try
            conn_string = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= "  + СокрЛП(ПутьКФайлу) + ";Extended Properties=""Excel 8.0;HDR=NO;IMEX=1;""";
            ADODBConnection.ConnectionString = conn_string;
            ADODBConnection.Open();
        Except
            msg = "COM object is not available. Tried Microsoft.ACE.OLEDB.12.0, Microsoft.Jet.OLEDB.4.0";
            print(msg);
            return 1;
        Endtry
    Endtry;

    schema = ADODBConnection.OpenSchema(20); // 20 - enum for adSchemaTables
    While Schema.EOF() = 0 Do
        sheet_name = schema.Fields("table_name").Value;
        query = "SELECT * FROM [" + sheet_name + "]";

        ADODBRecordset = New COMObject("ADODB.Recordset");
        ADODBRecordset.Open(query, ADODBConnection);

        If (ADODBRecordset.EOF ИЛИ ADODBRecordset.BOF) Then
            line_count = 0;
            Сообщить(НСтр("ru = '" + sheet_name + ": не содержит данных.'"), СтатусСообщения.Внимание);

            // Завершение работы.
            // Закрытие Объектов.
            ADODBRecordset.Close();
            ADODBConnection.Close();
            ADODBRecordset   = Неопределено;
            ADODBConnection = Неопределено;
        Endif;

        // Импирически определенные параметры для правильного определения количества строк листа.
        //ADODBRecordset.AbsolutePage     = 1;
        //ADODBRecordset.AbsolutePosition = 1;

        // Параметр, возвращаемый в вызывающую процедуру.
        КолвоСтрокExcel = ADODBRecordset.RecordCount + 1;    // (+1) - учет Строки-Заголовока, которая "съедается".
        КолвоКолонокExcel = ADODBRecordset.Fields.Count;

        ТаблицаРезультат = Новый ТаблицаЗначений;

        // Формирование колонок результирующей таблицы.
        // "НомерСтроки" - для наглядности и удобства.
        // В зависимости от разрабатываемой обработки.
        // "Сопоставлено" - может быть другим.
        // Здесь же могут быть добавлены другие колонки, не формируемые из содержимого файла EXCEL.
        ТаблицаРезультат.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"), "№", 4);
        ТаблицаРезультат.Колонки.Добавить("Сопоставлено", Новый ОписаниеТипов("Булево"), "Сопоставлено", 1);
        Для ит = 1 ПО КолвоКолонокExcel Цикл
            Поле = ADODBRecordset.Fields.Item(ит - 1);
            ИмяКолонки = "К_" + ит;
            Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки, , СокрЛП(СтрЗаменить(Поле.Name, "#", ".")));
            // Замена "#" на ".", т.к. при считывании ADODB "." в имени колонки заменяется на "#".
	    КонецЦикла;

        // ТаблицаРезультат: 1-я строка - Строка-Заголовок.

        // Добавление этой строки обусловлено исключительно из соображений идентичности содержимого файла EXCEL и ТаблицыЗначений,
        // выводимой на форме Обработки, и дальнейшей обработки строки заголовка
        // с целью сопоставления колонок EXCEL и реквизитов 1С: для Справочников, ПВХ, Регистров, Документов.

        // Если в Вашей обработке в результирующей таблице в качестве 1-ой строки не нужна Строка-Заголовок, то
        // следует закомментировать следующий цикл:
        НоваяСтрока = ТаблицаРезультат.Добавить();
        НоваяСтрока.НомерСтроки = 1;
        Для ит = 1 ПО КолвоКолонокExcel Цикл
            ИмяКолонки = "К_" + ит;
            Колонка = ТаблицаРезультат.Колонки.Найти(ИмяКолонки);
            НоваяСтрока[ИмяКолонки] = Колонка.Заголовок;
        КонецЦикла;

        // ТаблицаРезультат: Формирование строк по указанному диапазону: НачСтрока - КонСтрока.
        НомерСтроки = 1;
        Пока ADODBRecordset.EOF() = 0 Цикл
            НомерСтроки = НомерСтроки + 1;

            Если НомерСтроки < first_row Тогда    // Номер строки вне диапазона считываемых строк.
                ADODBRecordset.MoveNext();             // Следующая строка.
                Продолжить;
            КонецЕсли;

            Если last_row > 0 И НомерСтроки > last_row Тогда    // Номер строки вне диапазона считываемых строк.
                Прервать;
            КонецЕсли;

            НоваяСтрока = ТаблицаРезультат.Добавить();
            НоваяСтрока.НомерСтроки = НомерСтроки;

            Для ит = 1 ПО КолвоКолонокExcel Цикл
                Поле = ADODBRecordset.Fields.Item(ит - 1);

                Если Поле.ActualSize = 0 Тогда        // Пустое поле EXCEL.
                    Продолжить;
                КонецЕсли;

                ЗначениеЯчейки = Поле.Value;        // Учитывая параметр HDR=YES в строке соединения, данные считываются в соответствии с их типом.

                ИмяКолонки = "К_" + ит;
                НоваяСтрока[ИмяКолонки] = СтрЗаменить(ЗначениеЯчейки, Символы.НПП, "");

                // Используется при формировании таблицы на форме обработки.
                ШиринаКолонки = ТаблицаРезультат.Колонки[ИмяКолонки].Ширина;
                ДлинаСтроки      = СтрДлина(СокрЛП(ЗначениеЯчейки));
                ТаблицаРезультат.Колонки[ИмяКолонки].Ширина = ?(ШиринаКолонки < ДлинаСтроки, ДлинаСтроки, ШиринаКолонки);

            КонецЦикла;

            ADODBRecordset.MoveNext();   // Следующая строка.

        КонецЦикла;

        Schema.MoveNext();
    КонецЦикла;

    ADODBRecordset.Close();
    ADODBConnection.Close();
    ADODBRecordset   = Неопределено;
    ADODBConnection = Неопределено;
    Сообщить(ТаблицаРезультат.Количество());

    Возврат ТаблицаРезультат;
КонецФункции
1c WSLink
/////////////////////////
// Инициализация по объекту конфигурации
ns = "namespace"; // нэймспейс
username = "XXX"; // логин, может не быть
password = "XXX"; // пароль, может не быть

WS = WSСсылки.ИмяWSСсылки.СоздатьWSПрокси(ns, "ИмяWSОперации", "ИмяWSОперации_SOAP12");

WS.Пользователь = username;
WS.Пароль = password;

// XDTO может не быть (пользуйтесь строками :-))
//pack = WS.ФабрикаXDTO.Пакеты.Получить(ns);

Ответ = WS.ОперацияВебСервиса(ВходнойПараметр1, ВходнойПараметр2, ..., ВходнойПараметрN);


/////////////////////////
// Инициализация по wsdl-ссылке

ns = "namespace"; // нэймспэйс
url = "http://YOUR_WSDL_LINK?wsdl";
username = "XXXXXX"; // логин, может не быть
password = "XXXXXX"; // пароль, может не быть

Определение = Новый WSОпределения(url, username, password);
WS = Новый WSПрокси(Определение, ns, "WebServiceName", "WebServiceNameSoap");

Ответ = WS.ОперацияВебСервиса(ВходнойПараметр1, ВходнойПараметр2, ..., ВходнойПараметрN);
1c fast write to xls
Процедура СформироватьЭксельФайл(ТЗ)

    Excel = Новый COMОбъект("Excel.Application");
    Document = Excel.Workbooks.Add(); // Тут главное добавить новую книгу в эксель-документ

    ВсегоСтрок = ТЗ.Количество();
    ВсегоКолонок = ТЗ.Колонки.Количество();

    ComSafeArr = Новый COMSafeArray("VT_VARIANT", ВсегоКолонок, ВсегоСтрок);

    Для СчСтрок = 0 По ВсегоСтрок - 1 Цикл

        Строка = ТЗ[СчСтрок];

        Для СчКолонок = 0 По ВсегоКолонок - 1 Цикл

            ComSafeArr.SetValue(СчКолонок, СчСтрок, Лев(Строка[СчКолонок], 900)); // к сожалению строки надо обрезать

        КонецЦикла;

    КонецЦикла;

    Excel.Range(Excel.Cells(1, 1), Excel.Cells(ВсегоСтрок, ВсегоКолонок)).Value = ComSafeArr;

    Excel.Visible = 1; // Покажем получившееся

КонецПроцедуры
1c read XML
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM  = ПостроительDOM.Прочитать(ЧтениеXML);
Элементы = ДокументDOM.ПолучитьЭлементыПоИмени("");
Для Каждого Элемент из Элементы Цикл
    Сообщить(Элемент.ТекстовоеСодержимое);
КонецЦикла;
1c file dialog
ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбора.Фильтр = "*.*";
Если ДиалогВыбора.Выбрать() Тогда
	ПутьКФайлу = ДиалогВыбора.ПолноеИмяФайла;
КонецЕсли;
1c read Excel
Excel = Новый COMОбъект("Excel.Application");

Workbook = Excel.Workbooks.Open(ПутьКФайлу);

Данные = Новый ТаблицаЗначений;

СтрокаКолонок = 1; // строка с названиями колонок
ПерваяСтрока = 2; // первая строка с данными
ПерваяКолонка = 1; // и так понятно

CurPage = Workbook.Sheets(1);  // обрабатываем только первый лист

КоличествоСтрок = CurPage.Cells.SpecialCells(11).Row;
КоличествоКолонок = CurPage.Cells.SpecialCells(11).Column;

ДанныеФайла = CurPage.Range(CurPage.Cells(ПерваяСтрока, ПерваяКолонка), CurPage.Cells(КоличествоСтрок, КоличествоКолонок)).Value.Выгрузить();
Для Счетчик = 1 По КоличествоКолонок Цикл
	Попытка
		Данные.Колонки.Добавить(ОчиститьСтроку(CurPage.Cells(СтрокаКолонок, Счетчик).Text), Новый ОписаниеТипов("Строка"), CurPage.Cells(СтрокаКолонок, Счетчик).Text);
	Исключение
		Данные.Колонки.Добавить("Колонка"+Строка(Счетчик), Новый ОписаниеТипов("Строка"), "Колонка"+Строка(Счетчик));
		Сообщить("Какая-то ошибка в колонке: " + "Колонка" + Строка(Счетчик));
	КонецПопытки;
КонецЦикла;
Для Счетчик = 1 По КоличествоСтрок Цикл
	НоваяСтрока = Данные.Добавить();
КонецЦикла;
Для Счетчик = 0 По КоличествоКолонок - 1 Цикл
	Данные.ЗагрузитьКолонку(ДанныеФайла[Счетчик], Счетчик);
КонецЦикла;
Сообщить("Чтение файла завершено.");
Excel.Application.Quit();
1c standard period
&НаКлиенте
Процедура ВыбратьПериод(Команда)
    Диалог = Новый ДиалогРедактированияСтандартногоПериода();
    Диалог.Период = Новый СтандартныйПериод(ДатаНачала, ДатаОкончания);
    ОписаниеОповещенияОЗакрытии = Новый ОписаниеОповещения("ВыполнитьПослеВыбораПериода",ЭтотОбъект);
    Диалог.Показать(ОписаниеОповещенияОЗакрытии);
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьПослеВыбораПериода(Результат, Параметры) Экспорт
    Если Результат <> Неопределено Тогда
        ДатаНачала = Результат.ДатаНачала;
        ДатаОкончания = Результат.ДатаОкончания;
    КонецЕсли;
КонецПроцедуры
1c join
function join(Знач list, delimeter=",") export
	r = "";
	for each item in list do
		r = r + trimall(string(item)) + delimeter;
	enddo;
	if strlen(r) > 0 then
		r = left(r, strlen(r) - strlen(delimeter));
	endif;
	return r;
endfunction
макет бойлерплэйт
Об = РеквизитФормыВЗначение("Объект");
Макет = Об.ПолучитьМакет("Макет");
Данные = СтрРазделить(Макет.ПолучитьТекст(), Символы.ПС);
Для Каждого _ из Данные Цикл
	ДанныеСтроки = СтрРазделить(_, Символы.Таб);
	//
КонецЦикла;
1c clean xml
Функция УдалитьНедопустимыеСимволыXML(СтрокаХМЛ)
  
	Позиция = НайтиНедопустимыеСимволыXML(СтрокаХМЛ);
	Пока Позиция <> 0 Цикл
		НедопустимыйСимвол = Сред(СтрокаХМЛ, Позиция,1)
		СтрокаХМЛ = СтрЗаменить(СтрокаХМЛ, НедопустимыйСимвол, "");
		Позиция = НайтиНедопустимыеСимволыXML(СтрокаХМЛ);
	КонецЦикла; 

	Возврат СтрокаХМЛ;

КонецФункции
Excel hyperlinks macro
# Alt+F11 to open VB editor
# Insert module, insert code to module, close editor
# Alt+F8 -> run macro

Sub HyperAdd()
'Converts each text hyperlink selected into a working hyperlink

Dim xCell As Range
    
    For Each xCell In Selection
        ActiveSheet.Hyperlinks.Add Anchor:=xCell, Address:=xCell.Formula
    Next xCell 
End Sub
Microsoft.ACE.OLEDB.12.0
D:\>AccessDatabaseEngine.exe /passive

OR

D:\>AccessDatabaseEngine_X64.exe /passive
COM-подключение
СтрокаПодключения = "File="""";Usr="""";Pwd=""""";
СтрокаПодключения = "Srvr="""";Ref="""";Usr="""";Pwd=""""";
V83COMConnector= Новый COMОбъект("V83.COMConnector");
Попытка
	Возврат V83COMConnector.Connect(СтрокаПодключения);
Исключение
	Сообщить(ОписаниеОшибки());
	Сообщить("Ошибка подключения!");
	Возврат Неопределено;
КонецПопытки;
Пользователь не идентифицирован
SELECT Status FROM SchemaStorage WHERE SchemaID = 0;

UPDATE SchemaStorage SET Status = 100;
SQL restore
USE master;
GO

ALTER DATABASE TEST_DB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO

RESTORE DATABASE TEST_DB FROM DISK = N'C:\backups\PROD_BACKUP.bak' WITH FILE = 1, MOVE '' TO N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLDEV\MSSQL\DATA\TEST_DB.mdf', MOVE 'PROD_DB_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLDEV\MSSQL\DATA\TEST_DB_log.ldf', NOUNLOAD, REPLACE, STATS = 10
GO

ALTER DATABASE TEST_DB SET MULTI_USER;
GO
order reporting
from datetime import datetime
from catalog.models import Category, Product
from sales.models import Order, OrderItem


threshold = datetime(2018, 1, 1, 0, 0)
c = Category.objects.get(id=20)

pqs = Product.objects.filter(category__in=c.get_descendants(include_self=True))
pids = pqs.values_list('id', flat=True)
print(pqs.count())

orders = []
oiqs = OrderItem.objects.filter(product_id__in=pids).select_related('order', 'order__customer', 'product').order_by('order__created_at')
for oi in oiqs:
    if oi.order.created_at < threshold:
        continue
    orders.append((
        oi.order.customer.get_full_name(), 
        oi.order.customer.phone,
        oi.order.customer.email,
        oi.order.number,
        str(oi.order.created_at),
        oi.product.name,
        str(oi.quantity),
        str(oi.price)
    ))

for o in orders:
    print('\t'.join(o))
find
$ find . -group y -user y -exec ls {} +
Save image to ImageField
for r in data:
    p = Product.objects.filter(article=r[0]).first()
    if not p:
        print('article:', r[0], 'not found')
        continue
    
    pi_qs = ProductImage.objects.filter(product=p).delete()
    pi = ProductImage(product=p, sorting_order=1)
    pi.save()
    pi.image.save(r[1], File(open(os.path.join(settings.BASE_DIR, 'tmp', 'Spares', r[1]), 'rb')), save=True)