Задача: на нескольких серверах ограничить доступ к сайту по протоколу http/https для всех, кроме избранных IP.
Решить можно несколькими способами:
поправить .htaccess, добавив в него deny from all и allow from IP
на уровне файревола
Мне предпочтительней было сделать это на уровне файревола, т.к. таким образом не нужно прописывать запрет на доступ на каждом сайте, а запрещаю на ВСЕХ сайтах размещенных на этом сервере одновременно.
Принцип прописывания правил для всех файреволов одинаков: запрещаем по умолчанию всё, кроме того что нужно. Так как у меня немного зоопарк по серверам, то два различных файревола.
Ubuntu и иже с ним:
ufw default deny outgoing
ufw default deny incoming
ufw allow out 53
ufw allow from 19.82.24.12 to any port 443
ufw allow from 19.82.34.12 to any port 80
service ufw restart
Задача: создать силами платформы 1c файл в формате DBF (выгрузка в формате dbf)
Решение: собственно в 1С всё есть. Будем использовать метод XBase. При работе с DBF важно помнить, что это очень старый формат хранения данных, но тем не менее до сих пор используется для различного вида обменов. Его ограничениями являются:
длина имени файлов не более 8 символов, поэтому при генерации имени временного файла, не получится использовать функцию ПолучитьИмяВременногоФайла()
файл не должен быть больше 2ггб
имя колонки не может быть длиннее 10 символов
файл создается НЕ в кодировке UTF-8 (он в такую не умеет)
файл нужно сначала создать, потом закрыть, потом открыть и записать в него данные
Несколько статей уже на моём сайте на эту тему есть вывод отчета из макета), но они слегка протухли за прошедшее время, и почему-то отображаются не вполне корректно. Потому повторю.
Сначала нужно создать макет:
Нарисуем структуру отчета, присвоим имена блокам, обозначим ячейки которые будут заполнятся параметрами.
Далее на клиенте на форму выведем кнопку, и на неё повесим на неё обработчик заполнения отчета и вывода его на экран:
&НаКлиенте
Процедура СформироватьОтчёт(Команда)
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент=ПечатнаяФормаНаСервере();
ТабличныйДокумент.Показать();
КонецПроцедуры
Формирование и вывод отчета из макета:
&НаСервере
Функция ПечатнаяФормаНаСервере()
ТабДок=Новый ТабличныйДокумент;
Макет=РеквизитФормыВЗначение("Объект").ПолучитьМакет("МакетУдовлетворённость");
ОбластьШапка=Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбластьТушка=Макет.ПолучитьОбласть("тушка");
ОбластьТушка.Параметры.ид=ВыборкаДетальныеЗаписи.ИдентификаторОпроса;
ТабДок.Вывести(ОбластьТушка);
КонецЦикла;
...
возврат ТабДок;
КонецФункции
Пару лет назад уже сталкивался с подобной задачей (Фоновая обработка больших данных в 1С). Чуть погуглил, что изменилось за это время. А фактически ничего. До сих пор для того чтобы показать обычный прогресс бар, приходится использовать велосипеды. Временные хранилища, для того чтобы передать в клиента результат работы фоновой функции/процедуры как нельзя было использовать, так и сейчас нельзя. Прогресс бар, как нельзя было использовать без костылей…так и сейчас нельзя. Ну я конечно не смотрел что в БСП, т.к. зачастую приходится делать дописки где БСП или нет, или она древняя
Общая «шаблонная» схема использования фонового выполнения функций в 1С можно организаовать следующим образом:
Запускаем фоновое задание
На клиенте запускаем периодическое задание которое отлавливает вывод «сообщить» на сервере
В фоновом задании при помощи «сообщить» выводим всякую служебную информацию. Если нужно в «клиент» передать данные — записываем временный файл в формате например json, и имя его, опять же при помощи «Сообщить» передаём на клиент.
По окончании фонового задания, закрываем выполнение периодического задания
Процедура или функция фонового задания обязательно должна находиться в общем модуле:
Функция СпарситьИсходныеДанныеНаСервер(параметры) экспорт;
...
Сообщить("Выполнено 10%");
....
Сообщить("Выполнено 100%");
ИмяФайла=ПолучитьИмяВременногоФайла("json");
Текст = Новый ЗаписьТекста(ГдеИскать+ИмяФайла, КодировкаТекста.UTF8);
Текст.Записать(json_str);
Сообщить("Результат:"+ИмяФайла);
...
Периодическая проверка и «отлов» серверного вывода «Сообщить»:
&НаКлиенте
Процедура ИндикаторВыполненияЗагрузки() Экспорт
пр=ОпроситьФоновые();
если пр<>неопределено тогда
объект.ИндВыполнения=пр;
Состояние("Выполнено "+пр);
конецесли;
КонецПроцедуры
&НаКлиенте
Процедура ИндикаторВыполненияЗагрузки() Экспорт
пр=ОпроситьФоновые();
если пр<>неопределено тогда
объект.ИндВыполнения=пр;
Состояние("Выполнено "+пр);
конецесли;
КонецПроцедуры
&НаСервере
Функция ПолучитьСообщенияФЗ(ФЗ, Состояние = Неопределено, УдалятьСообщения = Ложь) Экспорт
Если Состояние = Неопределено Тогда
Состояние = ФЗ.Состояние;
КонецЕсли;
МассивСообщений = Новый Массив;
Сообщения = ФЗ.ПолучитьСообщенияПользователю(УдалятьСообщения);
Если Сообщения <> Неопределено Тогда
Для Каждого Сообщение Из Сообщения Цикл
МассивСообщений.Добавить(Сообщение.Текст);
КонецЦикла;
КонецЕсли;
Возврат МассивСообщений;
КонецФункции
&НаСервере
Функция ОпроситьФоновые()
прог=неопределено;
ФЗ = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ЭтаФорма.ФоновоеИдентификатор);
если ФЗ=Неопределено тогда
ОтключитьОбработчикОжидания("ИндикаторВыполненияЗагрузки");
возврат ложь;
конецесли;
ФСообщения=ПолучитьСообщенияФЗ(ФЗ,,истина);
Если ФСообщения.Количество() > 0 Тогда
Для Каждого Сообщение Из ФСообщения Цикл
Сообщить(Сообщение);
если найти(Сообщение,"%")>0 тогда
прог=Число(СтрЗаменить(СтрЗаменить(Сообщение,"Выполнено ",""),"%",""));
конецесли;
если найти(Сообщение,"Результат:")>0 тогда
ИмяФайла=СтрЗаменить(Сообщение,"Результат:","");
Текст = Новый ЧтениеТекста(КаталогВременныхФайлов()+ИмяФайла, КодировкаТекста.UTF8);
СтрокаJson = JsonВСтруктуру(Текст.Прочитать());
ОтключитьОбработчикОжидания("ИндикаторВыполненияЗагрузки");
конецесли;
КонецЦикла;
КонецЕсли;
возврат прог;
КонецФункции
Ранее уже делал подобную схему, но вышло слишком дорого и сложно. Поэтому реле времени своими руками буду упрощать и удешевлять 😉 Во первых уберем индикатор, соответственно сдвиговый регистр будет не нужен. Из индикации добавим светодиод, который будет показывать включено или выключено реле. Так-же подумав, решил добавить кнопку ручного включения/выключения реле. Сердцем будет микросхема attiny85. Так-же в схему добавил и блок питания (HLK-PM01), чтоб вся конструкция была единой платой