ЧтениеДанных и ЗаписьДанных. Работа со строками

Публикация № 1130284 04.10.19

Разработка - Механизмы платформы 1С

Двоичные данные ЧтениеДанных ЗаписьДанных Поток Буфер Разбивка XML

Использование потоков и двоичных данных для работы со строками.

Начиная с релиза 8.3.9, в 1С есть инструментарий для работы с двоичными данными и потоками, широко уже освещённый и разобранный на примерах, в 8.3.10 добавлись ещё полезные глобальные функции. Но большинство примеров касаются именно т.н. BLOB, больших бинарных объектов, иная обработка которых, чем этими инструментами, невозможна.

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

Новые инструменты могут работать на клиентском ПК в тонком и веб-клиентах, что убыстряет работу с файлами, и лишь для веб-клиента накладывает ограничения на поддерживаемые кодировки (см. СП). В обзоре подразумевается кодировка UTF-8, она же в платформе по умолчанию. Большинство рассмотренных операций можно выполнить несколькими способами, их различие в степени нагрузки на оперативку и процессор, т.е. и в быстродействии, и в степени надёжности по мере роста объёмов. Соответственно, становятся важны не только мощности сервера приложения, но и клиентского ПК.


Инструментарий

ДвоичныеДанные (далее ДД) - по сути, указатель на некую кучу (heap) в ОЗУ. Никак не упорядочены, но именно оперируя ими, наиболее экономим ресурсы. Размер можно только узнать. Доступа к внутренностям нет.

Буфер - по сути, тоже множество данных в ОЗУ, но с возможностью точечно, адресно, указав позицию в байтах, обратиться к данным, прочесть, изменить, вставить их; никакой структуры внутри себя не имеет - просто набор байтов. Буфер позволяет обработать все байты (отзеркалить, инвертировать итд). Размер можно узнать, изменить, назначить заранее (зависит от доступной ОЗУ, на диск не дампится). Доступ к внутренностям - произвольный.

Поток - по сути, данные с указателем текущей позиции, который двигается при операциях вперёд и который можно позиционировать. Поток может быть файловый, т.е. связанный с указателем на файл, наиболее близкий аналог связи и ограничений доступа, которые налагает такой объект в рамках файловой системы ОС это объект "СсылкаНаФайл" из 8.3.12 (в смысле блокировки при чтении/записи). Неудобен непредсказуемостью кэширования, выполняемого ОС, и неравномерной нагрузкой на жёсткий диск. Поток может быть в оперативке, созданный "на лету" из других объектов, обрабатываемый ими. Поток обрабатывается постепенно и может "съесть" весьма большие данные. Размер может расти произвольно, платформа предпринимает меры по поддержанию потока при любой нехватке ОЗУ. Доступ к внутренностям - последовательный.

ЧтениеДанных и ЗаписьДанных - по сути, насадки на потоки, расширяющие их возможности в части чтения фрагментов, в т.ч. по маркерам и разделителям, и более гибкой записи. Даже если их создавали по двоичным данным или файлу, всегда у чтения есть "исходный поток", у записи "целевой поток", причём с одним потоком могут поработать несколько чтений, несколько записей, равно те и другие. Они просто инструменты удобной обработки потоков, в т.ч. если явно с потоком и не работают, он всё равно - основной объект. Доступ к внутренностям - произвольный и последовательный, но и при произвольном указатель позиции двигается к концу данных.

РезультатЧтенияДанных - по сути, данные выборки в оптимизированном хранилище (если на клиенте, то могут дампиться во временные файлы, если на сервере, то могут помещаться в сеансовые файлы). Существуют отдельно от объекта чтения, породившего их, и от его исходного потока (даже если тот закрыт). По нагрузке на svhost наиболее схожи с ДД.

Большинство этих объектов получается друг из друга соответствующими методами и глобальными функциями.

Для работы со строками, особенно больших объёмов, интерес представляют ДД, потоки, чтение и запись. Буфер бесполезен, т.к. строка может содержать любые символы, чей размер разнится (например, латиница 1 байт, кириллица 2 байта итд), однозначно позиционироваться и порционно читать такое нельзя. Но буфер можно использовать как единый и неделимый промежуточный носитель неких данных, если операция с его участием быстрее иных способов. Операции разделения и слияния для буфера кэшируются, этим он тоже полезен.

Объекты имеют и синхронные, и асинхронные методы; в примерах использованы синхронные. Кстати, на сервере, очевидно, применимы только синхронные методы.

 

Из глобальных функций для случая строк представляют интерес следующие:

ИтоговыеДД=ПолучитьДвоичныеДанныеИзСтроки(ИсходнаяСтрока,Кодировка,СимволBOM);
ИтоговаяСтрока=ПолучитьСтрокуИзДвоичныхДанных(ИсходныеДД);
ИтоговыеДД=СоединитьДвоичныеДанные(МассивИсходныхДД);

Буфер=ПолучитьБуферДвоичныхДанныхИзСтроки(ИсходнаяСтрока,Кодировка,СимволBOM);
Буфер=ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ИсходныеДД);
ИтоговыеДД=ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Буфер);
ИтоговаяСтрока=ПолучитьСтрокуИзБуфераДвоичныхДанных(Буфер,Кодировка);
ИтоговыйБуфер=СоединитьБуферыДвоичныхДанных(МассивИсходныхБуферов);

 

В части работы с файлами есть нюанс в режиме записи, системное перечисление "РежимОткрытияФайла". При использовании менеджера файловых потоков или одного файлового потока в конструкторе режим указывается явно; а если задействована ЗаписьДанных, то повлиять на режим нельзя, и работает она как "ОткрытьИлиСоздать". При этом, если файл уже был, и перезаписывается меньшим количеством данных, то старые данные будут "торчать" из-под новых, как некий недозатёртый "хвост" наподобие новой аудио/видео записи на кассетах, из-под которой в конце видна предыдущая запись на этом же месте. Рекомендуется для существующих файлов ставить режим "Обрезать", или удалять файлы средствами ОС, или очищать иначе.


Примеры

В качестве иллюстрации возможностей и разнообразия способов применения - общеизвестная задача разбивки строки на массив подстрок по разделителю. Любой из ниже перечисленных способов в разы и десятки раз медленнее, чем СтрРазделить и прочие варианты, но при больших объёмах все, кроме буферов, с гораздо большей вероятностью работоспособны.

// Все приведённые варианты ведут себя как СтрЗаменить(рСтрока,рРазделитель,Истина), т.е. включая пустые строки в результат
// Указаны времязатраты для 100'000 вызовов в цикле, СтрЗаменить показала время 1-2 сек.

// Только буферы данных, разовое разделение методом буфера; 22-26 сек.
Функция РазделитьСтрокуНаМассивПодстрок1(рСтрока,рРазделитель=" ")
	буфСтроки=ПолучитьБуферДвоичныхДанныхИзСтроки(рСтрока);
	буфРазделителя=ПолучитьБуферДвоичныхДанныхИзСтроки(рРазделитель);
	//
	мБуферов=буфСтроки.Разделить(буфРазделителя);
	//
	мРезультатов=Новый Массив;
	Для каждого рБуфер Из мБуферов Цикл
		мРезультатов.Добавить(ПолучитьСтрокуИзБуфераДвоичныхДанных(рБуфер));
	КонецЦикла;	
	Возврат мРезультатов;
КонецФункции

// ДвоичныеДанные и ЧтениеДанных, разовое разделение методом ЧтениеДанных; 28-32 сек.
Функция РазделитьСтрокуНаМассивПодстрок2(рСтрока,рРазделитель=" ")
	рЧтение=Новый ЧтениеДанных(ПолучитьДвоичныеДанныеИзСтроки(рСтрока));
	мРезЧтения=рЧтение.Разделить(рРазделитель);
	рЧтение.Закрыть();
	//
	мРезультатов=Новый Массив;
	Для каждого рРезультат Из мРезЧтения Цикл
		мРезультатов.Добавить(ПолучитьСтрокуИзДвоичныхДанных(рРезультат.ПолучитьДвоичныеДанные()));
	КонецЦикла;
	Возврат мРезультатов;
КонецФункции

// ДвоичныеДанные и ЧтениеДанных, последовательное чтение строк по разделителю; 27-31 сек.
Функция РазделитьСтрокуНаМассивПодстрок3(рСтрока,рРазделитель=" ")
	рЧтение=Новый ЧтениеДанных(ПолучитьДвоичныеДанныеИзСтроки(рСтрока));
	//
	мРезультатов=Новый Массив;
	Пока Истина Цикл
		#Если Клиент Тогда
			ОбработкаПрерыванияПользователя();
		#КонецЕсли
		мРезультатов.Добавить(рЧтение.ПрочитатьСтроку(,рРазделитель));
		// или так (но это дольше и более ресурсоёмко, 46-52 сек.), даже если без промежуточных переменных:
		//рез=рЧтение.ПрочитатьДо(рРазделитель);
		//рДД=рез.ПолучитьДвоичныеДанные();
		//мРезультатов.Добавить(ПолучитьСтрокуИзДвоичныхДанных(рДД));
		//
		Если рЧтение.ЧтениеЗавершено Тогда Прервать КонецЕсли;
	КонецЦикла;
	рЧтение.Закрыть();
	Возврат мРезультатов;
КонецФункции

Эти примеры иллюстрируют разнообразие приёмов в рассматриваемом инструментарии по части чтения. Замечу, что "ПрочитатьСтроку" и вообще все методы, возвращающие символы и строки, ведут себя как буферы, а не как потоки, поэтому следует осмотрительно относиться к возможному объёму прочитанного, дабы не превысить выделенные объёмы ОЗУ.

 

С помощью этих инструментов можно решать вопрос конкатенации, особенно это эффективно для одинаковых строк (мы знаем, что  строковые операции весьма времяёмки), пример: 

// этот код выполняется примерно 30 сек.
а="Это";
б=" круто";
Для й=1 По 100000 Цикл
	а=а+б;
КонецЦикла;

// этот код выполняется 1 сек.
мДД=Новый Массив;
мДД.Добавить(ПолучитьДвоичныеДанныеИзСтроки("Это"));
рДДДобавка=ПолучитьДвоичныеДанныеИзСтроки(" круто"));
Для й=1 По 100000 Цикл
	мДД.Добавить(рДДДобавка);
КонецЦикла;
а=ПолучитьСтрокуИзДвоичныхДанных(СоединитьДвоичныеДанные(мДД));

 

Более сложный пример иллюстрирует чтение и запись с применением потоков. Задача: разделение xml-файла большого размера, с большим количеством однотипно повторяющихся узлов. Решение не вполне универсальное, но работоспособное:

	// разбивка хмл-файла на примере файла Import CML 2.X в нотации 1С-Битрикс
	
	// входные параметры
	имяф="C:\НекийПутьКФайлу\import___f3b35232-98a0-4b75-b7c5-6aa8c7199ff2.xml";
	квоБлоковВФайле=100; // последний файл может быть меньшего размера
	рТег="<Товар>";
	рСтаршийТег="<Товары>";
	рКодировка=КодировкаТекста.UTF8;
	
	// собственно действия
	рЗакрытиеСтаршегоТега=СтрЗаменить(рСтаршийТег,"<","</");
	
	рФайл=Новый Файл(имяф);	
	рПоток=Новый ФайловыйПоток(имяф,РежимОткрытияФайла.Открыть);
	
	рЧтение=Новый ЧтениеДанных(рПоток,рКодировка);	
	ддНачало=рЧтение.ПрочитатьДо(рТег).ПолучитьДвоичныеДанные();
	рЧтение.ПропуститьДо(рЗакрытиеСтаршегоТега);
	ддКонец=рЧтение.Прочитать().ПолучитьДвоичныеДанные();
	рЧтение.Закрыть();
	
	рПоток.Перейти(0,ПозицияВПотоке.Начало); // т.к. чтение упёрлось в конец потока
	
	рДДТега=ПолучитьДвоичныеДанныеИзСтроки(рТег);
	рДДЗакрытиеСтаршегоТега=ПолучитьДвоичныеДанныеИзСтроки(рЗакрытиеСтаршегоТега);
	
	// разные способы манипуляции кусками данных
	рПодвариант=3;
	Если рПодвариант=1 Тогда
		рЧтение=Новый ЧтениеДанных(рПоток,рКодировка);
		мДоИПослеСтаршего=рЧтение.Разделить(рЗакрытиеСтаршегоТега); // самое ресурсоёмкое
		резДоСтаршего=мДоИПослеСтаршего.Получить(0);
		подПоток=резДоСтаршего.ОткрытьПотокДляЧтения();
		рЧтениеБлоков=Новый ЧтениеДанных(подПоток);
		рЧтение.Закрыть();
		рЧтениеБлоков.ПропуститьДо(рСтаршийТег);
		//
	ИначеЕсли рПодвариант=2 Тогда
		рЧтение=Новый ЧтениеДанных(рПоток,рКодировка);
		рЧтение.ПропуститьДо(рСтаршийТег);
		рез1=рЧтение.ПрочитатьДо(рЗакрытиеСтаршегоТега); // самое ресурсоёмкое
		подПоток=рез1.ОткрытьПотокДляЧтения();
		рЧтениеБлоков=Новый ЧтениеДанных(подПоток);
		рЧтение.Закрыть();
		//
	ИначеЕсли рПодвариант=3 Тогда // наиболее быстрый способ, оперирует значительно меньшими объёмами
		рЧтениеБлоков=Новый ЧтениеДанных(рПоток,рКодировка);
		//
	КонецЕсли;	
	
	мБлоков=рЧтениеБлоков.Разделить(рТег); // саму рТег не включает в результат
	рЧтениеБлоков.Закрыть();
	квоБлоковВсего=мБлоков.Количество();
	
	рПоток.Закрыть();
	
	рНомерБлока=999999;
	рСчётчикФайлов=1;
	рИмяРезФайла="";
	рЗапись=Неопределено;
	
	Для й=0 По квоБлоковВсего-1 Цикл
		рБлок=мБлоков.Получить(й);
		ОбработкаПрерыванияПользователя();
		//
		Если рНомерБлока>квоБлоковВФайле Тогда
			// заканчиваем предыдущий
			Если рЗапись<>Неопределено Тогда	
				рЗапись.Записать(рДДЗакрытиеСтаршегоТега);
				рЗапись.Записать(ддКонец);
				рЗапись.Закрыть();
				Сообщить("Обработан файл "+рИмяРезФайла);
			КонецЕсли;
			// начинаем новый
			рИмяРезФайла=рФайл.Путь+рФайл.ИмяБезРасширения+"_part"+Формат(рСчётчикФайлов,"ЧГ=0")+рФайл.Расширение;
			рЗапись=Новый ЗаписьДанных(рИмяРезФайла,рКодировка);
			рЗапись.Записать(ддНачало);
			рНомерБлока=0;
			рСчётчикФайлов=рСчётчикФайлов+1;
		КонецЕсли;
		//
		// вписываем текущий блок
		рДДБлока=рБлок.ПолучитьДвоичныеДанные();
		Если рПодвариант<>3 и й<>0 Тогда
			рЗапись.Записать(рДДТега);
		ИначеЕсли рПодвариант=3 Тогда			
			Если й=0 Тогда // чтение взяло блок от начала до разделителя целиком, вырезаем заголовочную часть
				рЧтениеПервогоБлока=Новый ЧтениеДанных(рДДБлока);
				рЧтениеПервогоБлока.ПропуститьДо(рТег);
				рДДБлока=рЧтениеПервогоБлока.Прочитать().ПолучитьДвоичныеДанные();
				рЧтениеПервогоБлока.Закрыть();
			ИначеЕсли й=квоБлоковВсего-1 Тогда // чтение взяло блок от разделителя до конца, вырезаем хвостовую часть
				рЧтениеПоследнегоБлока=Новый ЧтениеДанных(рДДБлока);
				рДДБлока=рЧтениеПоследнегоБлока.ПрочитатьДо(рЗакрытиеСтаршегоТега).ПолучитьДвоичныеДанные();
				рЧтениеПоследнегоБлока.Закрыть();
				рЗапись.Записать(рДДТега);
			Иначе
				рЗапись.Записать(рДДТега);
			КонецЕсли;			
		КонецЕсли;		
		рЗапись.Записать(рДДБлока);
		рНомерБлока=рНомерБлока+1;
	КонецЦикла;
	
	// заканчиваем последний
	Если рЗапись<>Неопределено Тогда
		рЗапись.Записать(рДДЗакрытиеСтаршегоТега);
		рЗапись.Записать(ддКонец);
		рЗапись.Закрыть();
		Сообщить("Обработан файл "+рИмяРезФайла);
	КонецЕсли;
	
	Сообщить("Всё!");

 

Если работа с потоком идёт через объекты-"насадки", то есть основная, доступная для чтения позиция, и неявные системные позиции по мнению 1С, недоступные из языка. Поэтому перепозиционирование указателя на потоке-владельце Чтения или Записи в процессе работы с ними выполнять не следует - сначала их надо закрыть, потом изменить позицию и лишь потом сделать новые Чтение/Запись. Так, например, команда 

рЧтение.ИсходныйПоток().Перейти(0,ПозицияВПотоке.Начало);

вызывает ошибки вроде "В процессе работы с ЧтениеДанных произошло изменение позиции нижележащего потока извне. Это может привести к некорректной работе приложения.", после этого платформа закрывает ошибкоопасный контекст с очисткой кэша и удалением всех данных из сеанса и из памяти.
 

Итого

Сочетая избирательное чтение и запись вышеописанными способами с такими инструментами, как DOM, XDTO, XML+XPath+Xslt, RegExp и прочим, можно создать успешное решение для строковых big data промышленных масштабов - например, для обменов или библиографических систем.

Тестирование выполнялось на релизах 8.3.10.2561, 8.3.15.1534 и 8.3.15.1565.

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

 

p.s. Долго думал, как правильно во множественном числе - "буферы" или "буфера". Не взыщите)))

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. nbeliaev 812 04.10.19 12:05 Сейчас в теме
Я бы еще добавил, что Строка есть не что иное как массив символом (chars). Также Строка не мутабельна (то есть "а" + "б" -> всегда новая строка в памяти "аб"), отсюда требовательность к ресурсам.
2. A_Max 19 04.10.19 12:10 Сейчас в теме
тоже добавлю:

мДД=Новый Массив;
мДД.Добавить("Это");
Для й=1 По 100000 Цикл
	мДД.Добавить(" круто");
КонецЦикла;
а=СтрСоединить(мДД, "");


Тоже выполниться за секунду
user1367144; chembulatov76; Perfolenta; wowik; +4 Ответить
3. cosmo2004 38 05.10.19 20:20 Сейчас в теме
(2) Для данного случая хорошо, но массив полностью находится в оперативке и можно получить нехватку памяти, поток универсальнее.
5. Yashazz 4511 06.10.19 09:01 Сейчас в теме
(3) Именно, поэтому я разные варианты и показываю. Опять же, между Поток.Записать(Буфер,0,Буфер.Размер) и Запись.Записать(Буфер) тоже есть разница.
6. Yashazz 4511 06.10.19 09:02 Сейчас в теме
(2) Потому как есть у меня подозрение, что оное действие в потрохах платформы чем-то вроде двоичных данных и реализовано)
4. Gossluzh 05.10.19 22:17 Сейчас в теме
7. Cyberhawk 133 30.10.19 14:47 Сейчас в теме
ведут себя как СтрЗаменить
СтрРазделить
8. Altez 256 24.10.20 00:40 Сейчас в теме
С Чтением из COM1: порта прокатит?
9. Yashazz 4511 25.10.20 19:01 Сейчас в теме
(8) Можно конкретнее? Чтение из серийного порта, старт/стоп-биты и прочее?
10. Altez 256 25.10.20 23:07 Сейчас в теме
(9) Читал вес с весов CAS AD 2.5. (RS-232, 9600, N, 1) через MSCOMMLib
Ищу способы работать с COMпортом на чтение и запись средствами платформы 1с. (MSCOMM ограничивает 32битной платформой)

Тестировал ещё 3 варианта:
1) Через ActiveX CasAD_AP_DB_EM - плавающая проблема инициализации на платформе выше 8.3.13 (https://t.me/osminog1s/209910)
2) Через свою компоненту-обертку на C# над ActiveX CasAD_AP_DB_EM - не перенеслась на другой ПК
3) Через чтение/запись в порт из С# напрямую - нужно больше доступа к весам для отладки
11. Yashazz 4511 26.10.20 12:06 Сейчас в теме
(10) Скажем так: если будет некий объём данных, входящий в 1С и распознаваемый ею (хоть Base64, хоть двоичные данные, хоть поток), то обработается. Я из js двоичный поток ловил, он был объектом "ПотокВПамяти". Насчёт обёрток сказать трудно - внешние компоненты, отдающие такое, ни разу не встречал и не щупал.
12. kembrik 8 22.07.21 17:26 Сейчас в теме
Бьюсь сейчас над сохранением m3u8 потока неизвестной заранее длины с помощью 1С. если встречали где наработки направьте)
13. Yashazz 4511 22.07.21 19:11 Сейчас в теме
(12) Встречал, на каком-то профильном сайте, то ли Кодерлайн, то ли 1сПрограммист, был разбор именно на подобном примере. Ссылок не найду, это гуглить надо, но было.
14. kembrik 8 23.07.21 14:45 Сейчас в теме
15. kembrik 8 19.01.22 13:34 Сейчас в теме
(13) Ссылку так и не нашел, немного подсмотрел в имеющихся питоновских либах и сейчас думаю над наиболее быстрым и безопасным слиянием файлов. В результате на входе у меня следующее: за раз в одном манифесте читаются три *.ts файла, продолжительностью 2 секунды каждый, ну от битрейта зависит конечно но в масштабах имеющейся оперативки размер несущественен. Обычно маленькие ts сливаются в один любым аналогом copy /b *.ts joined_files.ts, поэтому сейчас реализовано "быстро но небезопасно", каждый файлик читается в поток и СоединитьДвоичныеДанные, (получили 6 секунд) и результирующий кидается в новый массив и уже после прекращение источника вещания или после наступления "время "Ч" добавление в массив прекращается и данные соединяются. Подход плох тем что на диске у нас никаких промежуточных результатов и любой краш приводит к тому что на диске у нас пусто, а хотелось бы чтобы пропали не все два часа вещания m3u8 а только несколько минут. Соответственно как человека который с потоками уже плотно поработал хочется спросить, какой вариант реализации вы бы выбрали эмпирически

1. Всегда сливаются вместе предыдущие два потока, начиная с третьего через СоединитьДвоичныеДанные, результат сбрасывается на диск. Приходит четвертый пакет - поток создается из файла на диске, двоичные данные из него забрасываются в массив, третий пакет в массив, СоединитьДвоичныеДанные и опять пишем на диск. вопрос который возникает - при увеличении размера файла запись может занимать длительное время - тогда мы можем упустить несколько ts файлов - значит надо организовывать очередь и тд,
2. Начало как в п.1, но поток создаем из файла на диске, вычисляем размер, переходим через перейти в ПозицияВПотоке.Конец и делаем Добавить из буфера, СоединитьДвоичныеДанные не используем
3. не ломаем голову, пишем каждый мелкий ts сразу на диск, корректно сортируем и делаем объединение либо средствами файловой системы, либо через добавление в массив и СоединитьДвоичныеДанные , самостоятельно разбивая на порции перед объединением (у нас 4000 файлов, бьем на порции по 200, потом бьем на порции по 10, и начинаем соединять, укрупняя пакеты
4. ваш вариант.

Понятно я постараюсь реализовать максимальное количество вариантов и попробовать, но вдруг вы какие то подводные камни укажете сразу
16. vandalsvq 1312 21.08.22 15:45 Сейчас в теме
Столкнулся с тем, что часть методов объекта ЧтениеДанных не работает в веб-клиенте. Обратите внимание, что РезультатЧтенияДанных например не может в веб-клиенте выдавать двоичные данные или буфер двоичных данных. Что значительно усложняет работу, а некоторые возможности попросту аннулируются.
Так же есть особенность, что чтение данных иногда в веб-клиенте показывает диалоговое окно с разрешением копирования файла. В общем рекомендую иметь в виду, если пишите код потенциально для веб клиента
Оставьте свое сообщение

См. также

Методы работы с универсальным отчетом в подсистеме "Варианты отчетов" на БСП

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данной статье рассмотрим типовую подсистему "Варианты отчетов" БСП на примере применения в универсальном отчете любой современной конфигурации.

30.05.2023    2150    quazare    4    

71

Расширение глобального поиска 1С, или Глобальный поиск "на максималках"

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Мало кто знает, что поле "Глобального поиска" в 1С можно доработать. Добавить свои варианты поиска, кнопочки в результатах и даже целые пользовательские меню.

27.03.2023    4270    SeiOkami    9    

121

Версионирование объектов VS История данных

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Давайте разберемся в механизме «История данных» и поэкспериментируем для наглядности. Сравним «Версионирование объектов» и «Историю данных».

06.03.2023    6003    dsdred    37    

126

Идентификатор объекта в запросе. Вы этого хотели?

Запросы Механизмы платформы 1С Платформа 1С v8.3 Запросы Бесплатно (free)

В платформе 8.3.22 появилась возможность получать идентификатор в запросе. Лично я ждал этого давно, но по итогу ждал большего. Что не так?

12.01.2023    13456    dsdred    17    

68

Практическая шпаргалка по новым возможностям языка запросов 1С

Механизмы платформы 1С Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

В предлагаемой статье решил привести примеры применения новых возможностей языка запросов 1С, начиная с версии платформы 8.3.20.

21.11.2022    16482    quazare    34    

113

1С и Unicode

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Разбираемся, как 1С работает с текстом и отдельными символами в контексте Unicode.

05.09.2022    4831    Irwin    30    

80

Шпаргалка по функциям АСИНХ

Механизмы платформы 1С Платформа 1С v8.3 Россия Бесплатно (free)

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

29.07.2022    17581    zeltyr    17    

149

Быстрое обновление базы 1С из XML-файлов конфигурации (EDT-GIT)

DevOps и автоматизация разработки EDT Обновление 1С Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Быстрое обновление конфигурации и базы данных 1С, вместо долгого обновления из EDT (1C:Enterprise Development Tools) при использовании хранилища GIT. Непосредственное обновлении базы на сервере баз данных (минуя сервер 1С) из XML-файлов конфигурации при помощи утилиты автономного сервера 1С - ibcmd.

1 стартмани

13.07.2022    9380    7    Bitnikov    19    

51

Экспертный кейс. История расследования одного небыстрого закрытия месяца в 1C:ERP. Пример неочевидных путей расследования в виде детективной истории

HighLoad оптимизация Механизмы платформы 1С Запросы Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

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

11.07.2022    5806    it-expertise    27    

57

Последовательность выполнения расширений

Механизмы платформы 1С Бесплатно (free)

Вынес в отдельную статью порядок применения нескольких расширений для одного метода

23.06.2022    4793    kuzyara    7    

58

Точка останова с условием. Приемы и хитрости использования

Механизмы платформы 1С Платформа 1С v8.3 Абонемент ($m)

“Точка останова с условием“ - применима в самых разнообразных ситуациях, и грамотное её применение экономит много времени разработчика 1С.

1 стартмани

10.06.2022    5269    Onwardv    8    

58

Динамическое обновление - это зло?

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Копнем глубже в тему "Что же такое динамическое обновление" и почему оно может привести к проблемам. И может ли?

09.05.2022    18476    Infostart    80    

229

Отборы динамического списка

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Динамический список предоставляет несколько объектов "Отбор". В статье разбирается, какой для чего нужен и как их использовать на форме. Рассматриваются только возможности платформы (без БСП).

28.03.2022    29556    Gladkov_Anton    7    

72

Фишки платформы 1С 8.3 для начинающего разработчика

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

В данной заметке рассмотрены вспомогательные инструменты платформы, которыми часто пренебрегают начинающие программисты 1С.

11.03.2022    11247    Dimbayyyy    98    

61

Использование флажков в динамических списках 2.0

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Пример реализации динамического списка с пометками в режиме множественного и единичного выбора.

1 стартмани

13.01.2022    12416    34    mr_sav    31    

53

Стек технологий для 1С

Инструментарий разработчика Рефакторинг и качество кода Групповая разработка (Git, хранилище) Механизмы платформы 1С Бесплатно (free)

Стек технологий, которые могут быть полезны разработчику на 1С и около 1С. По каждой технологии постарался объяснить, зачем она нужна и с чего начать изучение, если заинтересует.

29.11.2021    32463    mrXoxot    63    

429

Несколько простых приемов для удобной работы в конфигураторе

Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Простая и удобная среда разработки 1С:Предприятия позволяет практически любому человеку начать работать под капотом 1С - в конфигураторе. Время идет, новички становятся программистами, специалистами, а об удобных приемах работы узнают годами, по ходу своего карьерного пути. А здорово было бы, если бы все знали удобные приемы в начале своего пути? Эти несколько приемов будут полезны новичкам, так как они затрагивают ту область работы, с которой приходится сталкиваться в начале карьеры.

12.11.2021    13650    acces969    95    

142

Как спроектировать структуру регистра сведений

Механизмы платформы 1С Платформа 1С v8.3 Запросы Бесплатно (free)

«Что может быть проще?» — это первое, что приходит в голову. Но что, если это не так? В этой статье мы попробуем затронуть некоторые вопросы, которые могут возникнуть при проектировании больших регистров.

08.11.2021    9234    Neti    60    

108

Обработчик ожидания. Нюансы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

ПодключитьОбработчикОжидания: некоторые подробности и особенности работы

24.08.2021    27420    Yashazz    26    

65

Семеро одного не ждут? Асинхронное исследование асинхронности

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Все уже, наверное, знают о появлении в новых версиях платформы асинхронных функций и конструкций Асинх/Ждать. Многие, возможно, уже их используют. Но что будет, если создать свои асинхронные функции, запустить и не дожидаться окончания их выполнения? Неужели можно запустить несколько процессов параллельно?

1 стартмани

08.06.2021    9995    Alxby    55    

59

Новичок новичку: как добавить программно кнопку на форму путем расширения

Механизмы платформы 1С Платформа 1С v8.3 Россия Бесплатно (free)

Рассказываю очень простым языком, как добавить программно кнопку в типовую конфигурацию. Сам новичок в этом деле и рассказываю на "новичковом" языке.

13.05.2021    45327    user1312100    29    

73

Программное создание расширения

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Создание нового расширения "на лету", только штатными средствами 1С.

06.04.2021    7472    Yashazz    16    

77

Советы из Желтой тетради 📒 #1

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В этой публикации я собрал в одном месте часть советов и лайфхаков, которые открыл для себя в последнее время. Регулярно я публикую их в своём телеграм-блоге "Жёлтая тетрадь 📒 Блог программиста 1С", здесь же - дайджест этих публикаций.

15.03.2021    6637    builin    122    

53

Вызов демонов в 1С

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Вызываем демонов прямо из 1С!

28.01.2021    16231    322    ixijixi    41    

96

Расширенный автоподбор при вводе по строке в поле ввода в управляемых формах

Механизмы платформы 1С Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Бесплатно (free)

Началось все с того, что штатный автоподбор при вводе по строке в поле ввода для некоторых больших справочников устраивать перестал. Вообще, для способа поиска строки "Любая часть" он работает на первый взгляд очень хорошо: работает как полнотекстовый (т.е. по нескольким словам) даже без активации полнотекстового поиска, красиво подсвечивает слова поиска в результатах. Казалось бы, все отлично. Но есть неприятное ограничение - всего лишь 10 значений в результирующем списке (у вас может быть несколько больше, так как платформа неявно добавляет результаты поиска по истории ввода). Для небольших справочников или справочников с разнородным ассортиментом все хорошо. Но не в моей ситуации. А простых путей увеличить количество выдаваемых строк на момент написания статьи мне обнаружить не удалось. Пришлось полностью переопределять автоподбор. Ниже речь пойдет именно об этом. И, к слову, в типовых конфигурациях для некоторых справочников используются похожие приемы для увеличения количества строк результата автоподбора.

21.01.2021    11446    herfis    9    

54

О формах 1С замолвите слово... Необычное использование знакомого всем объекта

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Неочевидно, но форму 1С можно использовать как универсальный объект, который доступен на клиенте и имеет уникальный набор свойств, методов, событий и конструктор, принимающий параметры. При этом у формы может не быть интерфейса, и ее можно даже не открывать. О реальных примерах применения такого подхода пойдет рассказ.

13.01.2021    10884    CyberCerber    46    

101

Наследование свойств элементов, или Как пользователь может сломать вашу форму

Механизмы платформы 1С Платформа 1С v8.3 Платформа 1C v8.2 Конфигурации 1cv8 Бесплатно (free)

В 1С можно установить свойства ТолькоПросмотр, Доступность и Видимость не только на элементы формы, но и на группы элементов. Но стоит ли так делать? Оказывается, пользователь может обойти запреты, которые установлены на папку. Об этом подробнее в видео.

12.01.2021    6841    SeiOkami    27    

112

Установка отбора для поля ввода управляемой формы через ПараметрыВыбора (без переопределения событий "НачалоВыбора", "Автоподбор")

Механизмы платформы 1С Платформа 1С v8.3 Управляемые формы Бесплатно (free)

Зачастую возникает необходимость ограничить вывод элементов какого-нибудь справочника или перечисления при редактировании поля ввода (отфильтровать доступные для выбора элементы) эта публикация показывает простой и эффективный способ реализации этого.

15.11.2020    18636    Eugen-S    11    

71

Лайфхаки для разработчиков 1С. Часть 1

Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Россия Бесплатно (free)

Собрали 20 лайфхаков, которые используют наши программисты при работе с 1С. Формы, контрагенты, СКД, процедуры, глюки платформы и многое другое. В этой статье публикуем первую часть.

30.09.2020    9693    Neti    47    

69

Новое отображение ошибок в 1С

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим развитие механизма отображения ошибок в 1С (начиная с 8.3.17)

10.08.2020    40454    SeiOkami    45    

147

Использование флажков в динамических списках

Механизмы платформы 1С Управляемые формы Бесплатно (free)

В статье расскажу как в динамических списках можно использовать поле флажка для отметки строк. Используемый прием можно использовать не только для галочек, но и для любого поля ввода. Несмотря на то, что редактирование динамических списков напрямую невозможно, есть способ обойти платформу. Подробности в публикации.

04.08.2020    25559    nekit_rdx    38    

131

Загрузка, скачивание, удаление файлов с помощью НачатьПомещениеФайлаНаСервер() и НачатьПолучениеФайлаССервера()

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

В платформе 8.3.15 появились новые методы НачатьПомещениеФайлаНаСервер() и НачатьПолучениеФайлаССервера(). В данной статье рассмотрено готовое решение проверенное и прекрасно работающее на тонком и веб-клиенте.

1 стартмани

25.07.2020    26429    Flashill    18    

55

Вы запускаете приложения, но делаете это без уважения

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

О запуске сторонних приложений и скриптов из кода встроенного языка платформы 1С.

21.07.2020    16193    Infostart    32    

137

Использование Стека вызовов в качестве условия оператора Если [...] Тогда

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Делюсь интересным приёмом, позволяющим использовать данные стека исполнения кода 1С в качестве условия, накладываемого на выполнение кода.

12.07.2020    13736    sapervodichka    65    

93

Серверные вызовы, которые нельзя вызывать

Механизмы платформы 1С Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Бесплатно (free)

Не баян, а классика. Рассмотрим особенность платформы настолько же древнюю, как сами УФ.

12.05.2020    14582    SeiOkami    34    

148

Как ограничить поля отбора в динамическом списке и ничего не сломать

Механизмы платформы 1С Управляемые формы Конфигурации 1cv8 Бесплатно (free)

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

06.05.2020    13948    SeiOkami    4    

71

Совместимость работы со строками. Жизнь до 8.3.6 и после

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Немного о совместимости со старыми версиям платформы 1С в работе со строками.

21.02.2020    7341    Infostart    25    

65