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

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

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

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

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

Начиная с релиза 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. Долго думал, как правильно во множественном числе - "буферы" или "буфера". Не взыщите)))

50

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

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

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


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

См. также

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

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

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

05.09.2019    9345    ids79    42       

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

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

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

03.09.2019    7520    YPermitin    67       

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

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

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

17.08.2019    7820    ids79    14       

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

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

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

08.08.2019    9698    ids79    22       

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

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

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

02.08.2019    9535    avalakh    21       

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

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

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

26.07.2019    8769    ids79    6       

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

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

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

17.07.2019    8278    ids79    24       

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

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

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

04.07.2019    6087    SeiOkami    48       

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

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

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

25.06.2019    16881    ids79    16       

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

Статья Программист Нет файла v8 v8::Запросы Бесплатно (free) Практика программирования Разработка

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

11.06.2019    11260    dmurk    134       

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

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

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

16.05.2019    16866    YPermitin    27       

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

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

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

11.05.2019    9516    Eret1k    22       

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

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

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

25.04.2019    4654    m-rv    2       

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

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

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

16.04.2019    7164    m-rv    16       

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

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

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

07.04.2019    16043    ellavs    122       

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

Статья Программист Стажер Нет файла v8 Windows Бесплатно (free) Практика программирования Разработка

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

28.03.2019    12486    ellavs    83       

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

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

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

14.03.2019    12582    YPermitin    52       

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

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

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

03.02.2019    15078    ids79    9       

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

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

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

26.12.2018    12469    ids79    27       

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

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

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

14.12.2018    20981    ids79    72       

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

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

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

16.11.2018    18488    ids79    20       

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

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

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

13.11.2018    19124    Unk92    18       

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

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

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

10.11.2018    20570    ids79    40       

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

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

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

15.10.2018    20218    tormozit    100       

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

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

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

03.09.2018    14392    nikita0832    41       

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

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

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

23.08.2018    20885    Rain88    42       

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

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

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

25.06.2018    19120    olegtymko    43       

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

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

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

04.06.2018    24092    xrrg    82       

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

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

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

01.06.2018    21024    m-rv    21       

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

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

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

23.05.2018    16801    slozhenikin_com    19       

Распределение расходов пропорционально продажам 9

Статья Программист Пользователь Нет файла v8 v8::ОУ УТ10 УУ Финансовый учет и бюджетирование (FRP) Учет доходов и расходов Бесплатно (free) Практика программирования

Финансовая модель. Распределение административных расходов по подразделениям пропорционально продажам за месяц. Дополнительные реквизиты против бизнес-процессов!

13.05.2018    11203    Rustig    9       

Просмотр временных таблиц запроса в отладчике без изменения кода 126

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

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

24.04.2018    23951    avfed@rambler.ru    19       

Минимализмы 3 350

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Универсальные функции

Очередная серия "минимализмов" [http://infostart.ru/public/306536/, https://infostart.ru/public/460935/]. Также, как и в предыдущих статьях, здесь приведена подборка коротких оригинальных авторских решений некоторых задач. Ранее эти решения были разбросаны по моим комментариям к чужим публикациям.

19.02.2018    35261    ildarovich    44       

Этюды по программированию. Взаимодействие с Microsoft Word 108

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

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

11.12.2017    25678    milkers    23       

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

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

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

05.12.2017    21160    itriot11    34       

1С: Конвертация данных 3. Инструкции и примеры. EnterpriseData (универсальный формат обмена) 717

Статья Программист Нет файла v8 КД Бесплатно (free) Перенос данных из 1C8 в 1C8 Практика программирования Обмен через XML

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

19.11.2017    136413    MaxS    251       

Заполнение данных по ИНН контрагента с помощью альтернативного сервиса огрн.онлайн 131

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

Код для заполнения данных по ИНН контрагента из ЕГРЮЛ с сайта огрн.онлайн.

01.11.2017    22480    slava_1c    49       

Программные перечисления, ч.2: приемы кэширования при разработке 65

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

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

30.10.2017    20907    unichkin    17       

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

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

Краткая шпаргалка по программной работе с настройками СКД

29.10.2017    23854    json    9       

Работа с Excel 287

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Загрузка и выгрузка в Excel

Собрал различные полезности для работы с Excel из 1С. Иногда приходится форматировать документ Excel программно из 1С. Так вот, чтобы не искать постоянно на просторах интернета как сделать левое выравнивание в ячейке Excel из 1С и т.п. решил опубликовать это...

23.10.2017    24268    arakelyan    39       

Добавление команд печати в конфигурациях на БСП 2.4.3 (в частности, в самописных документах в Бухгалтерии 3.0 после релиза 3.0.52.35) 143

Статья Программист Нет файла v8 v8::БУ БП3.0 Россия Бесплатно (free) Печатные формы документов Практика программирования БСП (Библиотека стандартных подсистем)

В статье https://infostart.ru/public/237013/ пользователя nick max рассматривался список действий для подключения команд печати в Бухгалтерии 3.0, работающей на БСП 2.3.6. В новом релизе Бухгалтерии 3.0.52.35 от 15.09.2017г. стала использоваться БСП 2.4.3, из-за чего произошли изменения в процедурах общих модулей, связанных с механизмом печати, и в процедурах их вызова в формах документов и в формах списков. Рассмотрим их.

18.09.2017    46324    bugtester    43       

Отказ от работы с временными файлами при работе с двоичными данными или Потоки как простая замена ADODB.Stream и временным файлам 126

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

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

12.09.2017    18052    vardeg    31