1С: поиск слова обрамлённого символами

Задача: поместить в переменную содержимое строки обрамленной скобками. Т.е. например Есть строка вида:

начальная_строка="Это строка {пример} того что нужно сделать";

Нужно положить в переменную строчку содержащуюся внутри скобок. Решение:

&НаСервере
Функция ПолучитьПеременнуюИзСтроки(ПереданнаяСтрока,Откр,Закр) Экспорт
	Переменная = "";
	ПервыйСимвол = Найти(ПереданнаяСтрока,Откр);
	Если  ПервыйСимвол > 0 Тогда
		ВторойСимвол = Найти(ПереданнаяСтрока,Закр);
		Если  (ВторойСимвол > 0) И (ВторойСимвол > ПервыйСимвол) Тогда
			Переменная = (Сред(ПереданнаяСтрока,ПервыйСимвол+1,ВторойСимвол-ПервыйСимвол-1));
		КонецЕсли;	
		
	КонецЕсли;	
	Возврат Переменная;	
КонецФункции  

&НаСервере
Процедура ТрямНаСервере()
	сооб="Контролер процесса {Коновалова Е.П.} очень хочет получить премию!";
	контролер=ПолучитьПеременнуюИзСтроки(сооб,"{","}");
КонецПроцедуры

Cпособы отправки письма из 1С

Итак, рассмотрю способы отправки письма из 1С. На самом деле навелосипедить можно и больше, но мне хватит 😉

1) На «прямую», без использования БСП:

	Профиль = Новый ИнтернетПочтовыйПрофиль;
	Профиль.АдресСервераSMTP = "цукацукацука";
	Профиль.ПортSMTP = 465;
	
	Профиль.POP3ПередSMTP = ложь;
	Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
	
	Профиль.ИспользоватьSSLSMTP = ложь;
	
	Профиль.ТолькоЗащищеннаяАутентификацияSMTP = ложь;
	
	Профиль.Пользователь = "vуцкацука1-Noreply@укацукацука.ru";
	Профиль.Пароль = "Hцукацукаg";
	Профиль.ПользовательSMTP = "vцукауцкаly@цукацука.ru";
	Профиль.ПарольSMTP = "укацукацу";
	
	//Профиль.Таймаут = 60;
	
	Почта = Новый ИнтернетПочта;
	                                 
	Сообщить("Проверка cоединения..");
	Попытка
		Почта.Подключиться(Профиль, ПротоколИнтернетПочты.POP3);
		Сообщить("POP3: соединение ОК");
		Сообщить("SMTP: соединение ОК");
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
	
	
	Попытка
		Почта.Подключиться(Профиль);
		
		Письмо = Новый ИнтернетПочтовоеСообщение;
		Письмо.Тема = Заголовок;
	
		// формируем адрес получателя	
		Получатель = Письмо.Получатели.Добавить(Кому);
		Получатель.ОтображаемоеИмя = Кому;
	
		// добавляем к письму имя отправителя
		Письмо.ИмяОтправителя              = "Сцукауцкания";
		Письмо.Отправитель.ОтображаемоеИмя = "Сцукаувцукацукания";
		сообщить(константы.СК_Почта_Отправитель.Получить());
		Письмо.Отправитель.Адрес           = "noreply@цукаука.ru";
	
		// добавляем текст
		Текст = Письмо.Тексты.Добавить(Тело);
		Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
		
		Почта.Послать(Письмо, , ПротоколИнтернетПочты.SMTP);
		
		Сообщить("SMTP: посылка ОК");
		
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;

2) Используя БСП «Свежих» версий. Не могу сказать точно с какой версий, года примерно с двадцатого:

    УчетнаяЗаписьПочты = РаботаСПочтовымиСообщениями.СистемнаяУчетнаяЗапись(); 
 
	попытка                                                                                  
	ПараметрыСообщения = Новый Структура;
	ПараметрыСообщения.Вставить("Кому",     Кому);
	ПараметрыСообщения.Вставить("Тема",     Заголовок);
	ПараметрыСообщения.Вставить("Тело",     Тело);

		Письмо = РаботаСПочтовымиСообщениями.ПодготовитьПисьмо(УчетнаяЗаписьПочты, ПараметрыСообщения);
		РаботаСПочтовымиСообщениями.ОтправитьПисьмо(УчетнаяЗаписьПочты, Письмо);		
	исключение
		сообщить("ой!");
		Сообщить(ОписаниеОшибки());
	конецпопытки;

3) Используя БСП «старых версий»… Очень старых… Где-то года 2015 и ранее:

УчетнаяЗаписьПочты = РаботаСПочтовымиСообщениями.ПолучитьСистемнуюУчетнуюЗапись();
ПараметрыПисьма = Новый Структура("Кому, Тема, Тело,ТипТекста", email, "цуацукау", тело,"HTML");
		РаботаСПочтовымиСообщениями.ОтправитьСообщение(УчетнаяЗаписьПочты, ПараметрыПисьма);

Подготовка сервера RED OS 7.3 к установке Битрикс «Управление сайтом»

Дальнейший ход установки предполагает, что у вас уже установлена RED OS в конфигурации программ «Сервер минимальный», без выбора ПО (т.е. php, apache и т.д. будем ставить позже и сами!)

Отключим SELinux:

echo 'SELINUX=disabled' > /etc/sysconfig/selinux
reboot

Настроим отправку почты из консоли:

yum install sendmail –y

Для проверки работы:

echo "Это тестовое письмо " | mail -s "Проверка отправки почты " -r no-reply@mail.ru vasya@mail.ru

Установим PHP 8.1

dnf install php81-release 
dnf clean all
dnf makecache 
dnf  install php php-cli php-common php-devel php-gd php-imap php-json php-ldap php-mbstring php-mysqlnd php-opcache php-pdo php-pear php-pear-DB php-pecl-apcu php-pecl-mcrypt php-pecl-memcache php-pecl-ssh2 php-process php-pspell php-xml php-zipstream php-json php-xml

Если вдруг необходима версия PHP 7.4, которая идёт по умолчанию, то соответственно первая строчка не нужна

Установим Apache и Ngnix

dnf install httpd nginx

Установим MariaDB

dnf install mariadb-server mariadb

Установим Redis

dnf install redis 

Настройка Ngnix

Создадим папку /var/www/html/bx-site, присвоим ей пользователя и группу:

mkdir /var/www/html/bx-site
chown nginx:apache /var/www/html/bx-site

Далее качаем этот архив, и содержимое папки /redos/nginx переписываем поверх в /etc/nginx. Кроме того нужно в /etc/hosts добавить строчку:

127.0.0.1 httpd push

В случае необходимости включить сразу ssl, добавим в файл /etc/ngnix/sites-available/default.conf секцию вида:

server {

    listen 443 ssl;
    server_name _;
    server_name_in_redirect off;

    #ssl on;
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/cert.key;


    proxy_set_header    X-Real-IP        $remote_addr;
    proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;
    proxy_set_header    Host $host;

    proxy_redirect ~^(http://[^:]+):\d+(/.+)$ $1$2;
    proxy_redirect ~^(https://[^:]+):\d+(/.+)$ $1$2;

    set $docroot                "/var/www/html/bx-site";

    index index.php;
    root "/var/www/html/bx-site";

    # BXTEMP - personal settings
    include conf.d/bx_temp.conf;

    # Include parameters common to all websites
    include conf.d/bitrix.conf;

}

Если необходима (а она скорее всего необходима) переадрессация с http на https, то в секцию c 80 портом, добавляем строчки:

server {
    listen 80 default_server;
...
  if ($request_uri !~* "/robots.txt") {
        rewrite ^(.*)$ https://$host$1 permanent;
    }
...

Запустим сервис:

systemctl --now enable nginx

Настройка PHP

В папке /etc/php.d необходимо отредактировать настройки модулей:

opcache

opcache.max_accelerated_files = 100000
opcache.revalidate_freq = 0

bitrix.ini

display_errors = Off
error_reporting = E_ALL
error_log = '/var/log/php/error.log'
; Set some more PHP parameters
enable_dl = Off
short_open_tag = On
allow_url_fopen = On
# Security headers
mail.add_x_header = Off
expose_php = Off

Настройка Apache

  • Добавить в /etc/httpd/conf.d файл default.conf из архива выше
  • в httpd.conf заменить Listen 80 на Listen 8090
  • заменить файл /etc/httpd/conf.modules/00-mpm.conf на файл из архива выше

Запустить httpd:

systemctl --now enable httpd

На этом моменте файл index.php размещенный в /var/www/html/bx-site уже должен отображаться адекватно

Настройка MariaDB

В файле /etc/my.cnf.d/mariadb-server.cnf внутри тега [mysqld] необходимо добавить/изменить строки:

[mysqld]
transaction-isolation = READ-COMMITTED
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
thread_cache_size = 4

Запуск сервиса:

systemctl --now enable mariadb

Заходим в консоль сервера mysql, создаём пользователя и даём ему права:

create user 'test'@'localhost' identified by 'password';
create database testdb;
grant all on testdb.* to 'test'@'localhost'

Настройка Redis

В папке /etc/redis необходимо заменить файл redis.conf из архива выше, и выполнить в консоли:

usermod -g apache redis
chown root:apache /etc/redis/ /var/log/redis/
[[ ! -d /etc/systemd/system/redis.service.d ]] && mkdir /etc/systemd/system/redis.service.d
echo -e '[Service]\nGroup=apache' > /etc/systemd/system/redis.service.d/custom.conf
systemctl daemon-reload
systemctl --now enable redis

На этом в принципе и всё. Сервер подготовлен для развертывания битрикса в папке /var/www/html/bx-site. По идее далее кидаем туда дистрибутив (ну или бекап, если сайт переносите как я) и начинаем установку из браузера

1C: вывод картинки в списке формы документа с изменением

Задача: необходимо сделать чтобы при двойном клике по ячейке статуса документа динамически изменялась картинка и соответственно его статус в форме списка документа.

Решение:

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

Далее форму списка сделаем динамической, и добавим в запрос настройки списка связку с регистром:

...
	ВЫБОР
		КОГДА СК_ГР_Статусы_ДПС.Статус = ЗНАЧЕНИЕ(Перечисление.СК_ГР_СтатусКартинкой.Флажок)
			ТОГДА 0
		КОГДА СК_ГР_Статусы_ДПС.Статус = ЗНАЧЕНИЕ(Перечисление.СК_ГР_СтатусКартинкой.Галочка)
			ТОГДА 1
		ИНАЧЕ 2
	КОНЕЦ КАК СтатусК
ИЗ
	Документ.СК_ЗаявкаНаКУКУ КАК ДокументСК_ЗаявкаНаСК_ЗаявкаНаКУКУ 
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СК_ГР_Статусы_ДПС КАК СК_ГР_Статусы_ДПС
		ПО (СК_ГР_Статусы_ДПС.ДокОснование = ДокументСК_ЗаявкаСК_ЗаявкаНаКУКУ .Ссылка)
...

Для следующего шага необходимо подготовить картинку высотой 32 пикселя, и шириной 32*количество_статусов, например что-то в этом духе:

Далее на форме списка, у колонки «СтатусК», выберем вид «Поле картинки» и в свойство «Картинка значений», загрузим картинку:

Ну и соответственно в событие таблицы «выбор» добавим изменение статуса по двойному клику по столбцу «СтатусК»:

&НаСервере
Функция ПолучитьТекущийСтатусДокумента(Регистратор) 
	ТекущийСтатус=Перечисления.СК_ГР_СтатусКартинкой.ПустаяСсылка();
	Запрос = Новый Запрос;	
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	СК_ГР_Статусы_ДПС.Статус КАК Статус
		|ИЗ
		|	РегистрСведений.СК_ГР_Статусы_ДПС КАК СК_ГР_Статусы_ДПС
		|ГДЕ
		|	СК_ГР_Статусы_ДПС.ДокОснование = &Регистратор";
	
	Запрос.УстановитьПараметр("Регистратор", Регистратор);
	РезультатЗапроса = Запрос.Выполнить();
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		ТекущийСтатус=ВыборкаДетальныеЗаписи.Статус;
	КонецЦикла;

	возврат ТекущийСтатус;
КонецФункции	

&НаСервере
Процедура ИзменитьСтатусКНаСервере(НомерДок)
	док=Документы.СК_ЗаявкаНаИсполнениеПлатныхУслуг.НайтиПоНомеру(НомерДок);
	ТекСтат=ПолучитьТекущийСтатусДокумента(док);
	если ТекСтат=Перечисления.СК_ГР_СтатусКартинкой.ПустаяСсылка() тогда
		ТекСтат=Перечисления.СК_ГР_СтатусКартинкой.Флажок;
	иначеесли ТекСтат=Перечисления.СК_ГР_СтатусКартинкой.Флажок тогда
		ТекСтат=Перечисления.СК_ГР_СтатусКартинкой.Галочка;
	иначеесли ТекСтат=Перечисления.СК_ГР_СтатусКартинкой.Галочка тогда
		ТекСтат=Перечисления.СК_ГР_СтатусКартинкой.ПустаяСсылка();
	конецесли;
	
	МенеджерЗаписи = РегистрыСведений.СК_ГР_Статусы_ДПС.СоздатьМенеджерЗаписи(); 
	МенеджерЗаписи.ДокОснование = док; 
	МенеджерЗаписи.Статус = ТекСтат; 
	МенеджерЗаписи.Записать();   	
	
КонецПроцедуры


&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	если Поле.Имя="СтатусК" тогда 
		ИзменитьСтатусКНаСервере(Элемент.ТекущиеДанные.Номер);
		Элементы.Список.Обновить(); 
		СтандартнаяОбработка=ложь;
	конецесли;	
КонецПроцедуры

1С: получаем список НКО с сервера minjust.gov.ru

Почему то у нас как всегда всё.. Государство требует проверять контрагента является ли он НКО, а инструментарий для этого не предлагает. Не, ну какой-никакой сервис у них был — можно было зайти на сайт, ввести в поле поиска название НКО и и получить результат — есть в списке это организация или нет. Но это согласитесь бред. «Автоматизировать процесс проверки?? А зачем? Куча бухгалтеров — бездельников, чего делать будет? ;)». Всего файла целиком скачать возможности не было. Поэтому приходилось парсить у них сайт, собирая по кусочками Excel файлы в одну кучу (была у них кнопка «экспорт текущей страницы»). Теперь сайт изменили..но лучше не стало. Возможности скачать весь файл целиком как не было так и не стало. Чуть поковыряв их страницу нашел как получить «сессионный ключ» и способ как передавать правильные POST параметры, чтобы получить кусочки JSON, кои потом можно склеить в единую базу. Результат вылился в обработку для 1С, которую можно скачать тут

1 9 10 11 12 13 50