1С: Формирование отчёта в обработке из макета

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

Сначала нужно создать макет:

вывод отчета из макета

Нарисуем структуру отчета, присвоим имена блокам, обозначим ячейки которые будут заполнятся параметрами.

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

&НаКлиенте
Процедура СформироватьОтчёт(Команда)
	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент=ПечатнаяФормаНаСервере();
	ТабличныйДокумент.Показать();
КонецПроцедуры

Формирование и вывод отчета из макета:

&НаСервере
Функция ПечатнаяФормаНаСервере()	                                            
 ТабДок=Новый ТабличныйДокумент;	
 Макет=РеквизитФормыВЗначение("Объект").ПолучитьМакет("МакетУдовлетворённость");
 ОбластьШапка=Макет.ПолучитьОбласть("Шапка");
 ТабДок.Вывести(ОбластьШапка);
   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
     ОбластьТушка=Макет.ПолучитьОбласть("тушка");
     ОбластьТушка.Параметры.ид=ВыборкаДетальныеЗаписи.ИдентификаторОпроса;
     ТабДок.Вывести(ОбластьТушка);
   КонецЦикла;	
...
возврат ТабДок;
КонецФункции

Фоновая обработка больших данных в 1С с прогресс баром

Пару лет назад уже сталкивался с подобной задачей (Фоновая обработка больших данных в 1С). Чуть погуглил, что изменилось за это время. А фактически ничего. До сих пор для того чтобы показать обычный прогресс бар, приходится использовать велосипеды. Временные хранилища, для того чтобы передать в клиента результат работы фоновой функции/процедуры как нельзя было использовать, так и сейчас нельзя. Прогресс бар, как нельзя было использовать без костылей…так и сейчас нельзя. Ну я конечно не смотрел что в БСП, т.к. зачастую приходится делать дописки где БСП или нет, или она древняя

Общая «шаблонная» схема использования фонового выполнения функций в 1С можно организаовать следующим образом:

  1. Запускаем фоновое задание
  2. На клиенте запускаем периодическое задание которое отлавливает вывод «сообщить» на сервере
  3. В фоновом задании при помощи «сообщить» выводим всякую служебную информацию. Если нужно в «клиент» передать данные — записываем временный файл в формате например json, и имя его, опять же при помощи «Сообщить» передаём на клиент.
  4. По окончании фонового задания, закрываем выполнение периодического задания

Запуск фонового задания:

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

Процедура или функция фонового задания обязательно должна находиться в общем модуле:

Функция СпарситьИсходныеДанныеНаСервер(параметры) экспорт;
...
Сообщить("Выполнено 10%");	
....
Сообщить("Выполнено 100%");
ИмяФайла=ПолучитьИмяВременногоФайла("json");
Текст = Новый ЗаписьТекста(ГдеИскать+ИмяФайла, КодировкаТекста.UTF8);
Текст.Записать(json_str);	
Сообщить("Результат:"+ИмяФайла);
...

Периодическая проверка и «отлов» серверного вывода «Сообщить»:

&НаКлиенте
Процедура ИндикаторВыполненияЗагрузки() Экспорт
	пр=ОпроситьФоновые();
	если пр<>неопределено тогда  
		объект.ИндВыполнения=пр;
		Состояние("Выполнено "+пр);
	конецесли;
КонецПроцедуры

&НаКлиенте
Процедура ИндикаторВыполненияЗагрузки() Экспорт
	пр=ОпроситьФоновые();
	если пр<>неопределено тогда  
		объект.ИндВыполнения=пр;
		Состояние("Выполнено "+пр);
	конецесли;
КонецПроцедуры

&НаСервере
Функция ПолучитьСообщенияФЗ(ФЗ, Состояние = Неопределено, УдалятьСообщения = Ложь) Экспорт
	Если Состояние = Неопределено Тогда
		Состояние = ФЗ.Состояние;
	КонецЕсли;
	МассивСообщений = Новый Массив;
	Сообщения = ФЗ.ПолучитьСообщенияПользователю(УдалятьСообщения);
	Если Сообщения <> Неопределено Тогда
		Для Каждого Сообщение Из Сообщения Цикл
			МассивСообщений.Добавить(Сообщение.Текст);
		КонецЦикла;
	КонецЕсли;
	Возврат МассивСообщений;
КонецФункции

&НаСервере
Функция ОпроситьФоновые()
	прог=неопределено;
	ФЗ = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ЭтаФорма.ФоновоеИдентификатор);
	если ФЗ=Неопределено тогда
		ОтключитьОбработчикОжидания("ИндикаторВыполненияЗагрузки");
		возврат ложь;
	конецесли;	
	ФСообщения=ПолучитьСообщенияФЗ(ФЗ,,истина);
	Если ФСообщения.Количество() > 0 Тогда
		Для Каждого Сообщение Из ФСообщения Цикл
			Сообщить(Сообщение);
			если найти(Сообщение,"%")>0 тогда
				прог=Число(СтрЗаменить(СтрЗаменить(Сообщение,"Выполнено ",""),"%",""));			
			конецесли;
			если найти(Сообщение,"Результат:")>0 тогда
				ИмяФайла=СтрЗаменить(Сообщение,"Результат:","");
				Текст = Новый ЧтениеТекста(КаталогВременныхФайлов()+ИмяФайла, КодировкаТекста.UTF8);
				СтрокаJson = JsonВСтруктуру(Текст.Прочитать());	
ОтключитьОбработчикОжидания("ИндикаторВыполненияЗагрузки");
			конецесли;				
		КонецЦикла;
	КонецЕсли;
	возврат прог;
КонецФункции

В результате будет что-то вроде:

Фоновая обработка больших данных в 1С

Реле времени своими руками 2

Ранее уже делал подобную схему, но вышло слишком дорого и сложно. Поэтому реле времени своими руками буду упрощать и удешевлять 😉 Во первых уберем индикатор, соответственно сдвиговый регистр будет не нужен. Из индикации добавим светодиод, который будет показывать включено или выключено реле. Так-же подумав, решил добавить кнопку ручного включения/выключения реле. Сердцем будет микросхема attiny85. Так-же в схему добавил и блок питания (HLK-PM01), чтоб вся конструкция была единой платой

Принципиальная схема (потыкать в эмуляторе можно тут):

Реле времени своими руками

Схема на текстолите:

Реле времени своими руками
Реле времени своими руками

Ну и скетч:

bool myClock[]={1,0,1,0,0,0,0,0,0,0,0,0,0,0};
int myClock_len=sizeof(myClock);
int delayTime=6000;
bool button_active=false;
int inc=0;
uint32_t myTimer1;
int relay_pin = 4;

void setup() {
  pinMode(0, OUTPUT); 
  pinMode(2, INPUT_PULLUP);
  digitalWrite(0, HIGH); // Включение светодиода
  pinMode(relay_pin,OUTPUT);
}

void loop() {
  
    if (millis()-myTimer1>=delayTime||millis()-myTimer1<0){
        myTimer1=millis();
        if (button_active==false){
            if (myClock[inc]==0){
              digitalWrite(0, LOW);  // Выключение светодиода              
              digitalWrite(relay_pin,LOW);
            } else {
              digitalWrite(0, HIGH); // Включение светодиода
              digitalWrite(relay_pin,HIGH);
            };
            inc++;
            if (inc>myClock_len){
              inc=0;
            };
        };

    };

    if (digitalRead(2)==0){
      if (button_active==false){
        digitalWrite(0, HIGH); // Включение светодиода
        digitalWrite(relay_pin,HIGH);
        button_active=true;        
      } else {
          button_active=false;
          digitalWrite(0, LOW); // Выключение светодиода
          digitalWrite(relay_pin,LOW);
      };
      delay(1000);
    };


  
}

Вот так готовлю почву чем заниматься долгими зимними вечерами.. Итоговая стоимость предварительно, вышла примерно такая:

  • блок питания — 160р
  • attiny85 — 80р
  • текстолит — 150р
  • светодиод — 7р
  • реле — 150р

Итого — примерно 600р. Ну собственно это цена реле времени своими руками уже готового если покупать на валдберис. Но тут то своими руками 😉

RedOS: обновление httpd из исходников

Как оказалось (по советам данным на linux.org.ru), наиболее правильным вариантом обновления существующей инсталляции httpd, является «опакечивание» исходных кодов в rpm, а затем штатная его установка. В этом случаем мы избавляемся от проблем с выбором правильных ключей и путей, которые пришлось бы устанавливать руками при компиляции/сборке httpd из исходников. Итак поехали:

Сначала как обычно подготовим среду сборки:

dnf install rpmdevtools rpmlint
dnf install apr-devel apr-util-devel libuuid-devel lua-devel openldap-devel
dnf install apr-util-ldap
dnf install perl libxml2-devel

Затем создадим структуру каталогов для сборки:

rpmdev-setuptree

Далее скачиваем исходные коды httpd:

wget https://dlcdn.apache.org/httpd/httpd-2.4.62.tar.bz2

И теперь «опакечиваем» их в rpm:

rpmbuild -tb httpd-2.4.62.tar.bz2

Если сборка вываливается с ошибками, то необходимо смотреть файл config.log и до устанавливать необходимые зависимости (смотря на что ругается)

Если сборка прошла успешно, то в папке ~/rpmbuild/RPMS/x86_64 будут пакеты готовые к установке. Устанавливать их можно штатно:

rmp -U *.rpm --force

ключ —force в данном случае нужен для того, чтобы установщик не ругался на уже существующие файлы настройки httpd (вот тут осторожно! лучше сначала попробовать без этого ключа и посмотреть ошибки)

Убедимся что версия обновилась:

httpd -V
обновление httpd из исходников

Вот и всё, остается перезапустить сервис httpd

Установка PHP 7.4 на RedOS 8.0

Ситуация: после обновления с RedOS 7.3 до RedOS 8.0, обновился и интерпретатор PHP с 7.4. до 8.1, что к сожалению сломало работу сайта на Bitrix. Нужна установка PHP 7.4 на RedOS 8.0

Задача: сделать даунгрейд PHP 8.1 на PHP 7.4

Решение: Штатным образом в RedOS 8.0 отсутствует возможность установки PHP 7.4, Но! так как RedOS по сути своей совместим с RedHat/CentOS, значит возможно использовать сторонние репозитарии http://rpms.remirepo.net.

Создадим в папке /etc/yum.repos.d файл remi.repo с содержимым:

# Repository: http://rpms.remirepo.net/
# Blog:       http://blog.remirepo.net/
# Forum:      http://forum.remirepo.net/

[remi]
name=Remi's RPM repository for Enterprise Linux 7 - $basearch
mirrorlist=http://cdn.remirepo.net/enterprise/7/remi/mirror
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

И файл remi-php74.repo:

# This repository only provides PHP 7.4 and its extensions
# NOTICE: common dependencies are in "remi-safe"

[remi-php74]
name=Remi's PHP 7.4 RPM repository for Enterprise Linux 7 - $basearch
baseurl=http://rpms.remirepo.net/enterprise/7/php74/$basearch/
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

После чего останется удалить php8:

dnf remove php php-common

И установить взамен php 7.4:

dnf install -y php74-php php74-php-gd php74-php-fpm php74-php-pdo php74-php-json php74-php-imap php74-php-intl php74-php-json php74-php-soap php74-php-bcmath php74-php-xmlrpc php74-php-mysqlnd php74-php-mbstring php74-php-zip
dnf install php74-php-fpm
systemctl enable php74-php-fpm
systemctl start php74-php-fpm
systemctl restart httpd

После чего можно увидеть результат:

установка PHP 7.4 на RedOS 8.0
установка PHP 7.4 на RedOS 8.0
1 20 21 22 23 24 299