Выгрузить табличную часть в Excel

Задача: выгрузить табличную часть формы в файл формата XLSX. К сожалению на прямую это не сделать, но зато мы можем воспользоваться функционалом компонента ПостроительОтчета, который в свою очередь понимает на входе таблицу значений. В итоге нам остаётся лишь выгрузить табличную часть в таблицу значений, которую в свою оочередь скормить построителю отчетов. На выходе будет ТабличныйДокумент, который уже штатно может сохраняться в т.ч. и в формат xlsx. Код получается примерно такой::

&НаСервере
Функция ЭкспортВExcelНаСервере()
	ТабДок = Новый ТабличныйДокумент;
	
		Тз = Новый ТаблицаЗначений;
		тз.Колонки.Добавить("Отделение");
		тз.Колонки.Добавить("Подразделение");
		тз.Колонки.Добавить("ЛС");
		тз.Колонки.Добавить("КодСопоставления");
		тз.Колонки.Добавить("ДатаРождения");
		тз.Колонки.Добавить("МестоРождения");
		тз.Колонки.Добавить("СерияПаспорта");
		тз.Колонки.Добавить("НомерПаспорта");
		тз.Колонки.Добавить("СерияНомерПаспорта");
		тз.Колонки.Добавить("РезультатПроверки");
		
		для каждого стр из объект.РезультатСопоставления цикл
			нс=тз.Добавить();		
			нс.Отделение=стр.Отделение;
			нс.Подразделение=стр.Подразделение;
			нс.ЛС=стр.ЛС;
			нс.КодСопоставления=стр.КодСопоставления;
			нс.ДатаРождения=стр.ДатаРождения;
			нс.МестоРождения=стр.МестоРождения;
			нс.СерияПаспорта=стр.СерияПаспортаС;
			нс.НомерПаспорта=стр.НомерПаспортаС;
			нс.СерияНомерПаспорта=стр.СерияНомерПаспорта;
			нс.РезультатПроверки=стр.РезультатПроверки;
		конеццикла;
		
		Построитель = Новый ПостроительОтчета;
		Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(Тз);
		Построитель.Выполнить();
		Построитель.Вывести(ТабДок);
		
	ИмяВременногоФайлаХар = ПолучитьИмяВременногоФайла(".xlsx");		
	ТабДок.Записать(ИмяВременногоФайлаХар,ТипФайлаТабличногоДокумента.XLSX);
	сообщить(ИмяВременногоФайлаХар);
	
	Двоичное=Новый ДвоичныеДанные(ИмяВременногоФайлаХар);
	Адрес=ПоместитьВоВременноеХранилище(Двоичное,ЭтаФорма.УникальныйИдентификатор);	
	
	Возврат Адрес;
	
КонецФункции

&НаКлиенте
Процедура ЭкспортВExcel(Команда)
	Адрес=ЭкспортВExcelНаСервере();
	
	Описание=Новый ОписаниеПередаваемогоФайла(ПолучитьИмяВременногоФайла(".xlsx"),Адрес);
	МассивОписаний=Новый Массив;
	МассивОписаний.Добавить(Описание);
	ПолучитьФайлы(МассивОписаний,,,Ложь);	
	
	 Для Каждого фф Из МассивОписаний Цикл
	  ЗапуститьПриложение(фф.Имя);
	 КонецЦикла;	
	
КонецПроцедуры

Пользователь нажимает кнопку «Экспорт в эксель», на сервере формируется файл и передаётся на клиент. На клиенте он открывается приложением по умолчанию для данного формата файла. Код получился кросс платформенный, что в наше время очень актуально.

No module named ‘apt_pkg’

Всё началось неплохо (с)… А именно захотел я обновить apache на одном из серверов, Ubuntu на «наисвежайший». Сначала попытался собрать из исходных кодов, но как-то не срослось, а потому чуть погуглив, нашел что в репозитарии ondrej/apache2 всегда лежат уже собраные пакеты самой свежей версии. Казалось бы дело простое:

sudo add-apt-repository ppa:ondrej/apache2
sudo apt update
sudo apt upgrade apache2

Но не тут то было..Получил ошибку «No module named ‘apt_pkg'»:

Traceback (most recent call last):
  File "/usr/bin/add-apt-repository", line 5, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'

При попытке доустановить пакет через pip3… вышло сообщение, что пакета то такого и нет..

pip install apt_pkg
ERROR: Could not find a version that satisfies the requirement apt_pkg (from versions: none)
ERROR: No matching distribution found for apt_pkg

Долго гуглил почему так, выяснить так и не смог. Единственное что удалось выяснить, что если запускать pip3 для python3.10, то пакет ищется и устанавливается. Возможно дело в как-то криво установленном python3.11 В результате, пришлось перейти обратно на python3.10

update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1
update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 2
update-alternatives --list python3

После чего всё штатно обновилось и установилось.

No module named 'apt_pkg'

Работа с архивами zip на PHP

Для начала прочитаем содержимое архива (чтение архива zip на php). Во встречающихся на просторах интернета примерах, зачастую игнорируется тот факт, что имена файлов могут быть в кириллице.В результате пользователи видят «крякозябры». А zip хранит имена файлов, указывая их не в кодировке UTF-8, а в кодировке cp866 (видимо из соображения совместимости). По крайне мере на Windows. Поэтому имена файлов перед употреблением, нужно переформатировать в UTF-8.

$za = new ZipArchive();
$za->open(WUO_ROOT."/tmp.zip");
$result_stats = array();
for ($i = 0; $i < $za->numFiles; $i++){
    $name = $za->getNameIndex($i, \ZipArchive::FL_ENC_RAW);
    $encoded_filename = iconv("cp866","UTF-8//IGNORE",$name);
    var_dump($encoded_filename);
}

Далее попробуем распаковать понравившийся файл:

file_put_contents(WUO_ROOT."/peni.xls", $za->getFromIndex($index_file_peni));

Как видно, всё достаточно просто.

чтение архива zip на php

1С: чтение почты по протоколу IMAP

Прилетела задача прочитать сообщение из почтового ящика по протоколу IMAP. Последнее из пришедших. В принципе в 1С есть штатный функционал для чтения почты, поэтому пример всё сам расскажет за себя:

Процедура ЧитнутьНаСервереImap()
	Профиль = Новый ИнтернетПочтовыйПрофиль;
	Профиль.АутентификацияPOP3 = Ложь;
	Профиль.АутентификацияSMTP = Ложь;
	
	// IMAP
	Профиль.ИспользоватьSSLIMAP = Истина;
	Профиль.АдресСервераIMAP = "цукацу-укацука.уцкацук.ru";
	Профиль.ПортIMAP = "993"; 	
	Профиль.ПользовательIMAP = "укацу@укацукау.ru";
	Профиль.ПарольIMAP = "цукацукацук";
	Профиль.ТолькоЗащищеннаяАутентификацияIMAP=Ложь;

	Почта = Новый ИнтернетПочта;
	Сообщ = Новый СообщениеПользователю();

		Почта.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP); //ПротоколИнтернетПочты.POP3		
		заголовки=Почта.ПолучитьЗаголовки();
		если заголовки.Количество()>0 тогда		
			ПоследнийЗаголовок=Новый Массив();
			ПоследнийЗаголовок.Добавить(заголовки[заголовки.Количество()-1]);					
			МассивСообщений = Новый Массив;
			МассивСообщений = Почта.Выбрать(Ложь,ПоследнийЗаголовок);		
			
			ТекстСообщения=МассивСообщений[0].тексты[0].Текст;
			сообщить(ТекстСообщения);
		конецесли;
	
	Почта.Отключиться(); 

	

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

Из особенностей логики — сначала вычитываю заголовки, т.к. если почты много, то чтение писем будет ОЧЕНЬ долгим. Далее получаю последний по счету заголовок, и вычитываю текст конкретно уже этого письма.

прочитать сообщение из почтового ящика по протоколу IMAP

Другие статьи по тегу 1С можете почитать тут

RedOS 7.3: установка apache (httpd) из исходников

Задача: установить наисвежайшую версию веб сервера apache (установка apache из исходников). В репозитарии, версия довольно старая. Поэтому единственное решение — ставить apache из исходных кодов.

Сначала подготовлю ОС, для возможности компиляции (инструментарий):

dnf install libtool svn expat-devel pcre pcre-devel openssl-devel -y

Далее необходимо зайти на сайт https://httpd.apache.org/download.cgi и скачать необходимую версию с исходниками httpd и APR (https://apr.apache.org/download.cgi) и APR-UTIL

Распакуем их:

tar xfvj *.bz2

Далее необходимо переместить исходники APR в папку используемых библиотек httpd:

mv apr-1.7.4 httpd-2.4.59/srclib/apr
mv apr-util-1.6.3 httpd-2.4.59/srclib/apr-util

Теперь зайдём в получившуюся папку (например httpd-2.4.59), и попробуем собрать конфигурацию для компиляции:

./buildconf

И далее сконфигурируем установку:

./configure --enable-ssl --enable-so --with-mpm=event --with-included-apr --prefix=/usr/local/apache2

И наконец собираем бинарник и установим его по указанным выше путям:

make
make install
установка apache из исходников
1 23 24 25 26 27 300