Иногда полезно бывает устанавливать пакеты при помощи pip не «для всех», а конкретно для какого то скрипта. Ну и кроме того разные скрипты могут требовать разных версий пакетов. Именно для реализации таких возможносетй и была придумана технология «виртуального окружения». По сути это папка внутри которой собраны пакеты необходимые для запуска основного скрипта.
Создание виртуального окружения:
python3 -m venv .venv
Переход в виртуальное окружение:
source .venv/bin/activate
Запуск скрипта без перехода в виртуальное окружение:
Ранее уже была статья.. но 2020 года. Решил обновить чуток. На примере актуальной версии 1С Бухгалтерия (3.0.195.40), добавлю функционал по прикреплению файлов к документу СК_ИскВходящий
Копируем любой справочник с наименованием содержащим на конце словосочетание «ПрисоединенныеФайлы» и переименовываем его в СК_ИскВходящийПрисоединенныеФайлы
Меняем ТИП у реквизита «ВладелецФайла» справочника на «СК_ИскВходящий»
Включаем в состав определяемых типов «ПрисоединенныйФайл» и «ПрисоединенныйФайлОбъект» справочник «СК_ИскВходящийПрисоединенныеФайлы».
4. Расширим состав определяемого типа «ВладелецПрисоединенныхФайлов» нашим документом (ДокументСсылка) «СК_ИскВходящий».
5. Расширим состав типов свойства «Источник» у подписки «ПереопределитьПолучаемуюФормуПрисоединенногоФайла», включив в него справочник «СК_ИскВходящийПрисоединенныеФайлы».
6. Расширим состав типов свойства «Источник» подписки УстановитьПометкуУдаленияПрисоединенныхФайловДокументов, включив в него наш новый документ «ДокументОбъект.СК_ИскВходящий».
7. Расширим состав общей команды «ПрисоединенныеФайлы» и «ПрисоединенныеФайлыБП», включив в него наш новый документ (ДокументСсылка.СК_ИскВходящий).
8. Если необходимо добавить «Скрепку» на форму списка (в типовом варианте должна добавиться автоматически), чтобы картинка значения появлялась при наличии прикрепленных файлов у документа (строка в списке), то выполняем следующие действия:
В форме списка, у реквизита «Список» имеющего тип «ДинамическийСписок» выставляем галку «ПроизвольныйЗапрос», после чего открываем настройку списка (в там же в свойствах) и добавляем в блок «Выбрать»:
НаличиеФайлов.ЕстьФайлы КАК ЕстьФайлы
а в блок «ИЗ» :
{ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НаличиеФайлов КАК НаличиеФайлов ПО НашНовыйДокумент.Ссылка = НаличиеФайлов.ОбъектСФайлами}
После того, как поправили запрос, в реквизитах списка появится «ЕстьФайлы». Перетаскиваем реквизит в табличное поле и указываем в свойствах:
Вид: «Поле картинки»;
Положение заголовка: «Нет»;
Картинка значений: «Файл»;
Картинка шапки: «Файл».
Update: Иногда людям не нравится когда появляется сверху вот это меню:
Задача: вызываемая функция должна вернуть таблицу.
Решение:
DROP FUNCTION get_count_np_by_ls(date,bigint,bigint,boolean);
CREATE OR REPLACE FUNCTION public.get_count_np_by_ls(pr date, porog1 bigint, porog2 bigint, epd boolean)
RETURNS TABLE(name character varying, cnt numeric)
LANGUAGE plpgsql
AS $function$
BEGIN
if epd=true then
return QUERY
select
arname as brname,
sum(acnt) as gcnt
from (
select * from (
SELECT
areas.name as arname,
count(*) as acnt
FROM public.posting_addresses
inner join ls_addresses on ls_addresses.ls=posting_addresses.ls and ls_addresses.address_type=1 and ls_addresses.area between 1 and 26
inner join areas on areas.id=ls_addresses.area
inner join ls on ls.id=posting_addresses.ls
where
posting_addresses.period=pr and
ls.dt_cancel_epd_bill<=pr
group by areas.name,ls_addresses.city,ls_addresses.settler) as zx
where
zx.acnt between porog1 and porog2
) as res
group by brname;
else
return QUERY
select
arname as brname,
sum(acnt) as gcnt
from (
select * from (
SELECT
areas.name as arname,
count(*) as acnt
FROM public.posting_addresses
inner join ls_addresses on ls_addresses.ls=posting_addresses.ls and ls_addresses.address_type=1 and ls_addresses.area between 1 and 26
inner join areas on areas.id=ls_addresses.area
inner join ls on ls.id=posting_addresses.ls
where
posting_addresses.period=pr
group by areas.name,ls_addresses.city,ls_addresses.settler) as zx
where
zx.acnt between porog1 and porog2
) as res
group by brname;
end if;
END;
$function$
;
Вызывается так:
SELECT * from get_count_np_by_ls('2026-05-01',1,1,true)
Внимание! Частой ошибкой является вызов select get_count_np_by_ls(‘2026-05-01’,1,1,true). В этом случае столбцы «схлопываются» в один