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

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

Разработка - Практика программирования

Двоичные данные ЧтениеДанных ЗаписьДанных Поток Буфер Разбивка 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. fr13 714 04.10.19 12:05 Сейчас в теме
Я бы еще добавил, что Строка есть не что иное как массив символом (chars). Также Строка не мутабельна (то есть "а" + "б" -> всегда новая строка в памяти "аб"), отсюда требовательность к ресурсам.
2. A_Max 18 04.10.19 12:10 Сейчас в теме
тоже добавлю:

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


Тоже выполниться за секунду
chembulatov76; Perfolenta; wowik; +3 Ответить
3. cosmo2004 36 05.10.19 20:20 Сейчас в теме
(2) Для данного случая хорошо, но массив полностью находится в оперативке и можно получить нехватку памяти, поток универсальнее.
5. Yashazz 3202 06.10.19 09:01 Сейчас в теме
(3) Именно, поэтому я разные варианты и показываю. Опять же, между Поток.Записать(Буфер,0,Буфер.Размер) и Запись.Записать(Буфер) тоже есть разница.
6. Yashazz 3202 06.10.19 09:02 Сейчас в теме
(2) Потому как есть у меня подозрение, что оное действие в потрохах платформы чем-то вроде двоичных данных и реализовано)
4. Gossluzh 05.10.19 22:17 Сейчас в теме
7. Cyberhawk 118 30.10.19 14:47 Сейчас в теме
ведут себя как СтрЗаменить
СтрРазделить
Оставьте свое сообщение

См. также

3 онлайн-курса по 1С-программированию: обмен данными, расчетные задачи и бухгалтерские задачи с 12 мая по 8 июля 2020 г. Промо

Практика программирования v8 Бесплатно (free)

Пакет из 3-х курсов по 1С-программированию. Основная цель - сформировать у слушателей практические навыки, связанные с реализацией задач обмена для прикладных решений, работающих на платформе “1С:Предприятие”, а также с разработкой прикладных решений, предназначенных для автоматизации расчета заработной платы и задач бухгалтерского учета.

22.04.2020    3196    23    infostart    2    

Формирование строки большой длины

Практика программирования v8 Бесплатно (free)

Для опытных программистов в этой статье не будет ничего нового, но, возможно, кому-то статья сэкономит немного времени. Появилась у меня задача пройтись регулярными выражениями по наименованиям справочников. При подготовке строки в которой будут содержаться все наименования объектов справочника с соответствующими им ГУИДами, сразу обнаружил, что не все способы формирования строки одинаково быстро работают.

19.04.2020    1479    0    MADCAT    13    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    15040    0    ids79    26    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    15637    0    John_d    22    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    34177    0    unichkin    45    

Последовательности событий. Шпаргалка

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    10754    0    kuzyara    33    

30 задач. Странных и не очень

Практика программирования v8 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    12754    0    YPermitin    72    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    25389    0    Yashazz    45    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    26151    0    tormozit    100    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

Программное создание практически всех популярных элементов формы.

06.09.2019    34801    0    rpgshnik    59    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    36971    0    ids79    52    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    21628    0    YPermitin    24    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

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

20.09.2012    73674    0    tormozit    129    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    21845    0    YPermitin    80    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    25727    0    ids79    16    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    56097    0    ids79    37    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

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

11.07.2007    44765    0    tormozit    38    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

Как легко запускать выполнение в фоне, не прибегая к долгому описанию фоновых процедур.

02.08.2019    26424    0    avalakh    21    

Разбираемся с параметрами редактирования СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Связь по типу, Параметры выбора, Связи параметров выбора

31.07.2019    17195    0    json    12    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    42541    0    ids79    11    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    40522    0    tormozit    72    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    28548    0    ids79    27    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    21468    0    YPermitin    13    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования Разработка v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    16469    0    SeiOkami    50    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    14162    0    m-rv    2    

Работа с настройками системы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Варианты отчетов, работа с настройками вариантов: структура группировок, поля отчета, отборы, сортировка, условное оформление, другие настройки, настройки отображения диаграмм.

02.07.2019    33969    0    ids79    10    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    42299    0    ids79    19    

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Практика программирования Производительность и оптимизация (HighLoad) v8 v8::Запросы Бесплатно (free)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    21400    0    dmurk    144    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

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

16.04.2019    17772    0    m-rv    17    

Регистры накопления. Структура хранения в базе данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    35409    0    YPermitin    30    

Выполнение внешней обработки в фоновом задании

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    24241    0    Eret1k    23    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    29322    0    ellavs    126    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    27425    0    m-rv    21    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования Разработка v8 Бесплатно (free)

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    23048    0    ellavs    86    

Трюки с внешними источниками данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    26465    0    YPermitin    53    

Ошибки при работе с хранилищем конфигурации и способы их решения

Практика программирования v8 Бесплатно (free)

В статье собраны наиболее распространенные ошибки при работе с хранилищем конфигурации и способы их обхода и решения.

01.03.2019    30880    0    Смешной 1С    27    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

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

05.12.2017    25721    0    itriot11    34    

Разработка и сценарное тестирование с Vanessa-ADD. Отчетность Allure. Автоматизация запуска сценариев

Практика программирования Vanessa Automation v8 Россия Бесплатно (free)

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

26.02.2019    18364    0    Vladimir Litvinenko    27    

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS)

Практика программирования БСП (Библиотека стандартных подсистем) Роли и права v8 v8::Права Бесплатно (free)

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    31439    0    ids79    9    

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    71052    0    Serginio    108    

EnterpriseData – часть 2. Процесс выгрузки данных

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Основные этапы выгрузки данных через ED, обработчики событий выгрузки, правила обработки данных, правила конвертации объектов, конвертация свойств первого и второго этапов, процедуры БСП, используемые при выгрузке данных, структура «КомпонентыОбмена».

26.12.2018    22848    0    ids79    31    

Новый подход к обмену данными EnterpriseData

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Хочу предложить Вашему вниманию цикл статей, посвященных обмену данными через универсальный формат (EnterpriseData или ED).

14.12.2018    35106    0    ids79    72    

EnterpriseData - пример доработки правил конвертации без использования КД 3.0 в расширении конфигурации

Практика программирования Обмен через XML v8 v8::УФ БП3.0 УТ11 Россия Бесплатно (free)

В статье подробно описан реальный пример доработки обмена данными через EnterpriseData (универсальный формат обмена) между конфигурациями УТ 11.4 и Бухгалтерия 3.0

16.11.2018    31774    0    ids79    32    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С Промо

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    30601    0    ids79    40    

Программное заполнение пользовательских параметров и отборов СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Публикация представляет из себя краткие примеры того, как можно заполнять параметры СКД программно так, чтобы все параметры и отборы были доступны в быстрых настройках и в обычных (типовых) настройках параметров и отборов СКД.

13.11.2018    37473    0    Unk92    21    

Произвольный код в фоновом режиме

Практика программирования v8 1cv8.cf Бесплатно (free)

Задача: реализовать выполнение произвольного кода в фоновом режиме без изменения конфигурации, т.е. во внешней обработке.

03.09.2018    23960    0    nikita0832    42    

Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C

Математика и алгоритмы Практика программирования v8 Россия Бесплатно (free)

У многих начинающих 1С программистов часто возникают вопросы про клиент-серверное взаимодействие в 1С и чтобы разобраться в непростых механизмах платформы, необходимо понять, что же такое контекст, для чего предназначены директивы компиляции, что представляют собой контекстные/внеконтекстные вызовы и как наиболее оптимально описывать прикладные задачи в модулях управляемых форм.

23.08.2018    34835    0    Rain88    46    

Тестер: частые вопросы Промо

Практика программирования v8 Бесплатно (free)

Ошибкам бой - тесты норма жизни!

25.07.2018    26242    0    grumagargler    26    

Работаем с дополнительными реквизитами на форме

Практика программирования v8 Бесплатно (free)

Пара полезных процедур для работы с дополнительными реквизитами на форме. Далее в статье: 1. Как называются дополнительные реквизиты на форме и в какой момент они появляются на форме? 2. Как проверить до записи корректность заполнения пользователем дополнительного реквизита? 3. Как заполнить значение дополнительного реквизита по другому событию и обновить данные на форме? 4. Как расположить дополнительный реквизит в указанном месте на форме?

15.07.2018    29390    0    papche    37    

Повышаем эффективность разработки правил обмена

Практика программирования Перенос данных из 1C8 в 1C8 v8 КД Бесплатно (free)

Как повысить скорость и качество разработки правил обмена? Как вести групповую разработку правил обмена? Как облегчить сопровождение правил обмена после передачи в эксплуатацию? Об этом и многом другом вы можете узнать из этой статьи.

25.06.2018    26134    0    olegtymko    47    

Введение в механизм представлений в ЗУП ред. 3

Практика программирования v8 v8::СПР ЗУП3.x Бесплатно (free)

В нашей организации на первом же телефонном собеседовании на должность разработчика по ЗУП ред. 3 вас обязательно спросят о том, что такое "Представления".

04.06.2018    34115    0    xrrg    82    

Строим графы средствами 1С (без GraphViz)

Практика программирования v8 Бесплатно (free)

Множество статей на Инфостарте описывают, как работать с компонентой GraphViz, чтобы построить ориентированный граф. Но практически нет материалов, как работать с такими графами средствами 1С. Сегодня я расскажу, как красиво строить графы с минимальным пересечением. Нам этот метод пригодился для отрисовки алгоритмов в БИТ.Финансе, т.к. типовой механизм не устраивал. Еще это может быть полезно для визуализации различных зависимостей: расчета себестоимости, графы аффилированности компаний и т.д. Надеюсь, эта статья поможет сделать мир 1С красивее и гармоничней:) Итак, поехали...

23.05.2018    22874    0    slozhenikin_com    20