HTML: Ограничение ввода числа, с дробной частью более двух знаков

Задача: позволять вносить в поле input числа со значимой частью не более 2-х знаков после запятой.

Решение: к сожалению стандарт HTML на текущий момент не предусматривает в штатном виде такое колдовство. Единственно что возможно — проставить в теге тип равным «число», и шаг равным .01, например вот так:

<input type="number" step=".01">

Но это будет действовать только если пользователь ввод числа осуществляет при помощи стрелочки. Если руками — то поле всё равно позволит ввести любое число. Значит придётся задействовать javascript. На обработчик onchange навесим задание приводить любое значение в поле к числу с разрядностью 2:

<input type="number" step=".01" onchange="this.value = parseFloat(this.value).toFixed(2);">
два знака после запятой в поле input

Флибсута всё..

К сожалению пришла новость, что создатель сайта филибусты из-за тяжелой болезни скоро покинет наш мир. А вместе с ним и его детище. Очень жаль. Еще одна эпоха ушла, читал книги скачанные оттуда последние 10+ лет

Чтение данных из файла docx средствами 1С

Задача: спарсить данные из таблицы, которая находится в файле формата docx средствами 1С

Решение: по сути своей файл формата docx является zip архивом, в котором находятся файлы формата xml и внешние ресурсы, типа картинок, стилей и т.п. Текстовое же содержимое находится непосредственно в файле document.xml. Его нужно лишь прочитать, найти в нём таблицу и распарсить данные.

Для начала загрузим файл на сервер, переименуем его в zip, и откроем его при помощи метода 1С «ЧтениеZipФайла», а найденный в архиве файл document.xml извлекем для дальнейшей обработки:

&НаКлиенте
Процедура ВыбратьФайлыИСделатьХорошо(Команда)
	Режим = РежимДиалогаВыбораФайла.Открытие;
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
    ДиалогОткрытияФайла.ПолноеИмяФайла = "";
    Фильтр = НСтр("ru = 'Текст'; en = 'Text'")+ "(*.docx)|*.docx";
    ДиалогОткрытияФайла.Фильтр = Фильтр;
    ДиалогОткрытияФайла.МножественныйВыбор = ложь;
    ДиалогОткрытияФайла.Заголовок = "Выберите файлы";
    Если ДиалогОткрытияФайла.Выбрать() Тогда
        МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы;
		ФайлСМС="";
		Для Каждого ИмяФайла Из МассивФайлов Цикл
			ФайлСМС=ИмяФайла;
		конеццикла;
		если ФайлСМС<>"" тогда 			
					АдресХранилищаФайла = "";			
					Состояние("Перемещаю файл на сервер");
		            ПоместитьФайл(АдресХранилищаФайла, ФайлСМС, , Ложь, ЭтаФорма.УникальныйИдентификатор);   					
					Состояние("Обрабатывается файл "+ФайлСМС);							
					таблицы=ПреобразоватьФайлDocXВМассивТаблиц(АдресХранилищаФайла);					
		иначе
			сообщить("Файл не выбран");
		конецесли;	
	конецесли;	        
КонецПроцедуры

&НаСервере
Функция ПреобразоватьФайлDocXВМассивТаблиц(АдресХранилищаФайла)	
	ТЗ=Новый ТаблицаЗначений();	
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилищаФайла);
	ИмяВременногоФайлаСпр = ПолучитьИмяВременногоФайла("zip");
	ДвоичныеДанные.Записать(ИмяВременногоФайлаСпр);     

	Архив = Новый ЧтениеZipФайла(ИмяВременногоФайлаСпр);
	ИмяВременногоФайлаXML = ПолучитьИмяВременногоФайла("xml");
	Для Каждого Элемент Из Архив.Элементы Цикл	
		если  Элемент.Имя="document.xml" тогда			
			Архив.Извлечь(Элемент, КаталогВременныхФайлов(), РежимВосстановленияПутейФайловZIP.НеВосстанавливать);			
		конецесли;
	Конеццикла;	
	Архив.Закрыть();
....

Далее файл documnet.xml необходимо загрузить как XML и распарсить в структуру при помощи построителя DOM. После чего останется только найти таблицу по имени узла w:tbl и поместить содержимое в таблицу значений:

ФайлXML = Новый ЧтениеXML;
    ФайлXML.ОткрытьФайл(КаталогВременныхФайлов()+"document.xml");
		ПостроительDOMXML=Новый ПостроительDOM;
		ДокументДом=ПостроительDOMXML.Прочитать(ФайлXML);
		ПрочитаноСтрок=0;		
		для каждого document из ДокументДом.ДочерниеУзлы цикл
			для каждого body из document.ДочерниеУзлы цикл
				для каждого el из body.ДочерниеУзлы цикл
					если el.ИмяУзла="w:tbl" тогда
							для каждого tab_el из el.ДочерниеУзлы цикл							
								если tab_el.ИмяУзла="w:tr" тогда
									если ПрочитаноСтрок=0 тогда
										ТЗ.Колонки.Добавить(УбратьНеОбрабатываемыеСимволы(tab_el.ДочерниеУзлы[1].ТекстовоеСодержимое));
										ТЗ.Колонки.Добавить(УбратьНеОбрабатываемыеСимволы(tab_el.ДочерниеУзлы[2].ТекстовоеСодержимое));
										ТЗ.Колонки.Добавить(УбратьНеОбрабатываемыеСимволы(tab_el.ДочерниеУзлы[3].ТекстовоеСодержимое));
										ТЗ.Колонки.Добавить(УбратьНеОбрабатываемыеСимволы(tab_el.ДочерниеУзлы[4].ТекстовоеСодержимое));
										ТЗ.Колонки.Добавить(УбратьНеОбрабатываемыеСимволы(tab_el.ДочерниеУзлы[5].ТекстовоеСодержимое));
										ТЗ.Колонки.Добавить(УбратьНеОбрабатываемыеСимволы(tab_el.ДочерниеУзлы[6].ТекстовоеСодержимое));
										ТЗ.Колонки.Добавить(УбратьНеОбрабатываемыеСимволы(tab_el.ДочерниеУзлы[7].ТекстовоеСодержимое));
										ТЗ.Колонки.Добавить(УбратьНеОбрабатываемыеСимволы(tab_el.ДочерниеУзлы[8].ТекстовоеСодержимое));
									иначе	                 
										если tab_el.ДочерниеУзлы[1].ТекстовоеСодержимое="Всего:" тогда 
											прервать;
										КонецЕсли;           
										если tab_el.ДочерниеУзлы[1].ТекстовоеСодержимое<>"1" тогда
											если tab_el.ДочерниеУзлы[6].ТекстовоеСодержимое<>"" тогда
												нс=ТЗ.Добавить();
												нс[0]=tab_el.ДочерниеУзлы[1].ТекстовоеСодержимое;
												нс[1]=tab_el.ДочерниеУзлы[2].ТекстовоеСодержимое;
												нс[2]=tab_el.ДочерниеУзлы[3].ТекстовоеСодержимое;
												нс[3]=tab_el.ДочерниеУзлы[4].ТекстовоеСодержимое;
												нс[4]=tab_el.ДочерниеУзлы[5].ТекстовоеСодержимое;
													нс[4]=СтрЗаменить(нс[4],",",".");
													нс[4]=СтрЗаменить(нс[4]," ","");
													если нс[4]="" тогда нс[4]="0";конецесли;
													нс[4]=Число(Формат(нс[4],"ЧГ=0"));												
												нс[5]=tab_el.ДочерниеУзлы[6].ТекстовоеСодержимое;
												нс[6]=tab_el.ДочерниеУзлы[7].ТекстовоеСодержимое;
												нс[7]=tab_el.ДочерниеУзлы[8].ТекстовоеСодержимое;
													нс[7]=СтрЗаменить(нс[7],",",".");
													нс[7]=СтрЗаменить(нс[7]," ","");
													если нс[7]="" тогда нс[7]="0";конецесли;
													нс[7]=Число(Формат(нс[7],"ЧГ=0"));												
												
											конецесли;
										конецесли;
									конецесли;	
									ПрочитаноСтрок=ПрочитаноСтрок+1;
								конецесли;
							конеццикла;
							если ПрочитаноСтрок>0 тогда прервать;конецесли;
						конецесли;
						если ПрочитаноСтрок>0 тогда прервать;конецесли;
					конеццикла;
					если ПрочитаноСтрок>0 тогда прервать;конецесли;
				конеццикла;
				если ПрочитаноСтрок>0 тогда прервать;конецесли;
		конеццикла;	
	ФайлXML.Закрыть();
	Возврат ТЗ;	

HH и отзывы о работодателе

Предложило мне тут приложение HH оставить отзывы о работодателях, у которых пришлось в своё время поработать. Попытался оставить. Как итог: положительные отзывы публикуются моментально. Отрицательные — вот уже пару недель пытаюсь опубликовать, и все не проходят модерацию. Но я упорный. всё время меняю формулировки.. надеюсь кому то из модераторов надоест уже это и нажмут кнопку «пропустить».

P.S. Ну собственно это и ожидаемо, полистал несколько «работодателей» — плохих отзывов нет. Хотя точно знаю, что компания шлак.

1С: Хранение информации во внешних источниках данных

Как то упустил эту возможность платформы 1С и никогда ранее не использовал. А тут вдруг прилетела задача поработать файлами большого размера (xlsx, csv), на основании данных в которых нужно строить различного вида отчёты. Пришла мысль: а почему бы не загрузить данные этих файлов в БД, а затем уже спокойно стоить на основании этих данных отчёты. Какие-то регистры, справочники и т.п. создавать в конфигурации для этого посчитал излишним. Самое правильное, подумал я, хранить всё вообще в какой-то сторонней базе (в моём случае в PostgreSQL). А 1С использовать только для вывода и формирования отчётов. Вот тут то я и вспомнил, что когда то мельком читал про «внешние источники данных» в 1С. Значит пришло время попробовать хранение информации во внешних источниках данных.

Сначала создам БД, с таблицами ls и shemes со структурой вида::

хранение информации во внешних источниках данных.

, где id — автоинкримент типа integer. Забегая вперед, следует отметить, что 1С не умеет при добавлении данных во внешние источники данных, передавать инкрементальное значение, а потому создадим триггер, который будет выполнятся перед транзакцией запроса INSERT, и заменяет значение id, на следующее по порядку:

хранение информации во внешних источниках данных.

Подготовка закончена. Теперь подготовим платформу 1С. А именно необходимо установить драйвер ODBC. Под Linux ставим из репозитария, под Windows скачиваем и устанавливаем отсюда: https://www.postgresql.org/ftp/odbc/releases/REL-16_00_0005-mimalloc/

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

хранение информации во внешних источниках данных.

После чего, будут доступны для добавления в конфигуратор таблицы БД:

хранение информации во внешних источниках данных.

После того как нажмем «Готово», в конфигураторе будет что-то вроде:

Далее остаётся научится читать,писать и удалять эти данные:

// добвление
	новыелс=внешниеисточникиданных.ОтчетыДля1С.Таблицы.reports_1c_public_ls.СоздатьОбъект();	
	новыелс.name="4232344";
	новыелс.Записать();
// изменение 
	мХарактеристика = внешниеисточникиданных.ОтчетыДля1С.Таблицы.reports_1c_public_ls.НайтиПоПолю("id",3);
	мОбъект = мХарактеристика.ПолучитьОбъект();
	мОбъект.name = "Уря! Чебуршка родил слона!";
	мОбъект.Записать();

//удаление 
	мХарактеристика = внешниеисточникиданных.ОтчетыДля1С.Таблицы.reports_1c_public_ls.НайтиПоПолю("id",3);
	мОбъект = мХарактеристика.ПолучитьОбъект();
	мОбъект.Удалить();
// чтение
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	reports_1c_public_ls.id КАК id,
		|	reports_1c_public_ls.name КАК name,
		|	reports_1c_public_shemes.name КАК name1
		|ИЗ
		|	ВнешнийИсточникДанных.ОтчетыДля1С.Таблица.reports_1c_public_ls КАК reports_1c_public_ls
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.ОтчетыДля1С.Таблица.reports_1c_public_shemes КАК reports_1c_public_shemes
		|		ПО reports_1c_public_ls.sheme = reports_1c_public_shemes.id";
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		сообщить(ВыборкаДетальныеЗаписи.name);
		сообщить(ВыборкаДетальныеЗаписи.name1);
	КонецЦикла;

Update 16/09/2025: таки автоувеличение идентификатора умеет. Достаточно его указать как «только чтение» в 1С:

Но можно и с триггерами мудрить для желающих 😉

1 19 20 21 22 23 300