Алгоритм по переносу вложенных запросов в пакеты

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

Разработка - Инструментарий разработчика

Запросы 1С вложенные запросы 1С пакетные запросы в 1С оптимизация запросов 1С

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

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

Пример использования:

ТекстЗапросаНовый = ВынестиВложенныеТаблицы(ТекстЗапроса);

Пример того, что было:

ВЫБРАТЬ
	ВложенныйЗапрос.Ссылка
ИЗ
	(ВЫБРАТЬ
		Банки.Ссылка КАК Ссылка
	ИЗ
		Справочник.Банки КАК Банки) КАК ВложенныйЗапрос

Стало:

ВЫБРАТЬ
	Банки.Ссылка КАК Ссылка
ПОМЕСТИТЬ Банки
ИЗ
	Справочник.Банки КАК Банки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВложенныйЗапрос.Ссылка
ИЗ
	Банки КАК ВложенныйЗапрос

Для примера использования встроил функции в типовую обработку КонсольОтчетов из 1С УПП 1.3, см. приложенный файл:

Также набор функций приложил в отдельном файле txt.

Или можно скачать здесь:

// --
// Функции редактирования запроса

// Функция выноса вложенных таблиц
Функция ВынестиВложенныеТаблицы(Знач ГлобальныйТекстЗапроса)
		
	МассивПакетовЗапросов = Новый Массив;	
	
	// Получаем все подзапросы, разделенные ";"
	МассивИсключенийСимоволов = Новый Массив;
	МассивИсключенийСимоволов.Добавить("""");
	ПакетыЗапросов = ПолучитьМассивСловРазделенныхСимволом(ГлобальныйТекстЗапроса, ";", , , МассивИсключенийСимоволов);	
	
	// --
	// Из ПакетыЗапросов сформируем МассивПакетовЗапросов
	
	// При формировании пакетов имена должны быть уникальны. Вложенные запросы могут иметь неуникальные наименования. 
	// Для этого ведём массив созданных пакетов, в случае неуникального наименования добавляем порядковый номер	
	МассивИменПакетов = Новый Массив;
	
	// Заполним массив пакетов имена существующих пакетов
	ГлобальныйТекстЗапросаПоискПакетов = ГлобальныйТекстЗапроса;
	МассивСпециальныхСимволов = ПолучитьМассивСпециальныхСимволов();
	Пока Истина Цикл
		ПозицияПоместить = Найти(ГлобальныйТекстЗапросаПоискПакетов, "ПОМЕСТИТЬ ");
		Если ПозицияПоместить = 0 Тогда
			Прервать;
		КонецЕсли;
		НачальнаяПозиция = ПозицияПоместить + 10;
		ИмяПакета = ПолучитьСлово(ГлобальныйТекстЗапросаПоискПакетов, НачальнаяПозиция, Ложь, Истина, МассивСпециальныхСимволов);
		МассивИменПакетов.Добавить(ИмяПакета);
		ГлобальныйТекстЗапросаПоискПакетов = Сред(ГлобальныйТекстЗапросаПоискПакетов, НачальнаяПозиция, СтрДлина(ГлобальныйТекстЗапросаПоискПакетов));
	КонецЦикла;	
	
	ПозицияНачала = 1;
	ПозицияОкончания = 0;
	Для Каждого ПакетЗапроса Из ПакетыЗапросов Цикл
		ПозицияОкончания = ПозицияНачала + СтрДлина(ПакетЗапроса);		
		СтруктураПодзапросовПакета = ПолучитьСтруктуруПодзапросов(ПакетЗапроса, ПозицияНачала, ГлобальныйТекстЗапроса, МассивИменПакетов);	
		МассивПакетовЗапросов.Добавить(Новый Структура("ТекстЗапроса, Подзапросы, ПозицияНачала, ПозицияОкончания", ПакетЗапроса, СтруктураПодзапросовПакета, ПозицияНачала, ПозицияОкончания));
		
		ПозицияНачала = ПозицияОкончания + 1;		
	КонецЦикла;
	// Из ПакетыЗапросов сформируем МассивПакетовЗапросов
	// --
	
	// Сформируем запрос из МассивПакетовЗапросов
	ГлобальныйТекстЗапросаНовый = "";
	Для Каждого ПакетЗапроса Из МассивПакетовЗапросов Цикл		
		
		МассивВырезок = Новый Массив;
		ТекстПодзапросов = ПолучитьТекстПодзапросов(ГлобальныйТекстЗапроса, ПакетЗапроса.Подзапросы, МассивВырезок);
		ГлобальныйТекстЗапросаНовый = ГлобальныйТекстЗапросаНовый + ?(ГлобальныйТекстЗапросаНовый = "" Или ТекстПодзапросов = "", "", ";") + ТекстПодзапросов;
		
		ТекстПакета = ПолучитьВырезкуТекста(ГлобальныйТекстЗапроса, ПакетЗапроса.ПозицияНачала, ПакетЗапроса.ПозицияОкончания, МассивВырезок);
		
		ГлобальныйТекстЗапросаНовый = ГлобальныйТекстЗапросаНовый + ?(ГлобальныйТекстЗапросаНовый = "" Или ТекстПакета = "", "", ";") + ТекстПакета;	
	КонецЦикла;
	
	Возврат ГлобальныйТекстЗапросаНовый;

КонецФункции

// ПозицияВГлобальномТексте - позиция переданного текста в тексте глобального запроса
Функция ПолучитьСтруктуруПодзапросов(Знач ТекстПакетаЗапроса, Знач ПозицияВГлобальномТексте = 0, Знач ГлобальныйТекстЗапроса, МассивИменПакетов)
	
	ТекстДлина = СтрДлина(ТекстПакетаЗапроса);
	
	Структура = Новый Структура;
	
	МассивСпециальныхСимволов = ПолучитьМассивСпециальныхСимволов();
	МассивСпециальныхСимволовКромеСкобок = ПолучитьМассивСпециальныхСимволов("()");
	
	// --
	// Перебираем текст по символьно
	Для НомерБуквы = 1 По ТекстДлина Цикл
		
		// --
		// Определяем, что это начало нового запроса
		
		// В целях оптимизации не используем ПолучитьСлово, но могут быть ошибки, поэтому перепроверим через ПолучитьСлово ещё раз внизу
		Если Сред(ТекстПакетаЗапроса, НомерБуквы, 8) = "(ВЫБРАТЬ" Тогда
			
			ПрошлоеСлово = ПолучитьСлово(ТекстПакетаЗапроса, НомерБуквы, Истина, Ложь, МассивСпециальныхСимволов);
			Если 
				ПолучитьСлово(ТекстПакетаЗапроса, НомерБуквы, Ложь, Истина, МассивСпециальныхСимволовКромеСкобок) = "(ВЫБРАТЬ"
				И
				ПрошлоеСлово <> "ВСЕ" И ПрошлоеСлово <> "ОБЪЕДИНИТЬ" И ПрошлоеСлово <> "В" И ПрошлоеСлово <> "ИЕРАРХИИ" Тогда			
				
				ПозицияИз = Неопределено;
				
				Для НомерПодбуквы = НомерБуквы + 1 По ТекстДлина Цикл
					
					ТекстПодзапроса = Сред(ТекстПакетаЗапроса, НомерБуквы, НомерПодбуквы - НомерБуквы);
					
					// Определяем позицию ИЗ в запросе
					Если ПозицияИз = Неопределено Тогда
						Если Сред(ТекстПакетаЗапроса, НомерПодбуквы, 2) = "ИЗ" И СтрЧислоВхождений(ТекстПодзапроса, "(") - СтрЧислоВхождений(ТекстПодзапроса, ")") = 1 Тогда
							ПозицияИз = ПозицияВГлобальномТексте + НомерПодбуквы - 1;	
						ИначеЕсли Сред(ТекстПакетаЗапроса, НомерПодбуквы + 1, 10) = "ОБЪЕДИНИТЬ" Тогда
							ПозицияИз = ПозицияВГлобальномТексте + НомерПодбуквы - 1;
						КонецЕсли;
					КонецЕсли;
					
					// --				
					// Проверим, что скобки закрылись, значит подзапрос закрывается
					Если СтрЧислоВхождений(ТекстПодзапроса, "(") = СтрЧислоВхождений(ТекстПодзапроса, ")") Тогда
						
						// Если ПозицияИз не определена, значит ставим её в конце
						Если ПозицияИз = Неопределено Тогда
							ПозицияИз = НомерПодбуквы;
						КонецЕсли;
						
						// Урезаем скобки по краяем
						ТекстПодзапросаБезСкобок = Сред(ТекстПодзапроса, 2, СтрДлина(ТекстПодзапроса) - 2);
						
						Ключ = "Запрос" + Строка(Структура.Количество());
						
						// Получаем имя пакета как слово после КАК во вложенном запросе
						НачальнаяПозиция = ПозицияВГлобальномТексте + НомерПодбуквы;
						СловоКАК = ПолучитьСлово(ГлобальныйТекстЗапроса, НачальнаяПозиция, , Истина, МассивСпециальныхСимволов, НачальнаяПозиция);
						Если СловоКАК = "КАК" Тогда
							ИмяПакета = ПолучитьСлово(ГлобальныйТекстЗапроса, НачальнаяПозиция + 4, , Истина, МассивСпециальныхСимволов);		
							Если ИмяПакета = "" Тогда
								ВызватьИсключение("СП. Не смогли определить имя пакета!");	
							КонецЕсли;
						Иначе
							ВызватьИсключение("СП. Не смогли определить имя пакета!");
						КонецЕсли;						
						
						// Проверка на уникальность будущего пакета
						Если МассивИменПакетов.Найти(ИмяПакета) = Неопределено Тогда
							МассивИменПакетов.Добавить(ИмяПакета);	
						Иначе
							Индекс = 0;
							Пока Истина Цикл
								Индекс = Индекс + 1;
								ИмяНовое = ИмяПакета + "_ИзВложенногоЗапроса" + Строка(Индекс);
								Если МассивИменПакетов.Найти(ИмяНовое) = Неопределено Тогда
									ИмяПакета = ИмяНовое;
		                        	МассивИменПакетов.Добавить(ИмяПакета);
									Прервать;
								КонецЕсли;
							КонецЦикла;
						КонецЕсли;
						
						Структура.Вставить(Ключ, Новый Структура("ТекстЗапроса, ИмяПакета, ПозицияНачалаСоСкобкой, ПозицияОкончанияСоСкобкой, ПозицияИз, Подзапросы", ТекстПодзапросаБезСкобок, ИмяПакета, ПозицияВГлобальномТексте - 1 + НомерБуквы, ПозицияВГлобальномТексте - 1 + НомерПодбуквы, ПозицияИз));
						Структура[Ключ].Подзапросы = ПолучитьСтруктуруПодзапросов(ТекстПодзапросаБезСкобок, ПозицияВГлобальномТексте + НомерБуквы, ГлобальныйТекстЗапроса, МассивИменПакетов);		
						НомерБуквы = НомерПодбуквы + 1;
						Прервать;
					КонецЕсли;
					// Проверим, что скобки закрылись, значит подзапрос закрывается
					// --
					
				КонецЦикла;			
			КонецЕсли;
		КонецЕсли;
		// Определяем, что это начало нового запроса
		// --
		
	КонецЦикла; 
	// Перебираем текст по символьно
	// --
	
	Возврат Структура;
	
КонецФункции

// Функция получает тексты подзапросов из структуры подзапросов
// МассивВырезок - нужен для накопления информации о подзапросах
Функция ПолучитьТекстПодзапросов(Знач ГлобальныйТекстЗапроса, Подзапросы, МассивВырезок)
	ТекстЗапроса = "";
	
	Для Каждого Подзапрос Из Подзапросы Цикл
		
		// Добавляем вырезку текушего подзапроса
		МассивВырезок.Добавить(Новый Структура("ПозицияНачала, ПозицияОкончания, ТекстЗапроса", Подзапрос.Значение.ПозицияНачалаСоСкобкой, Подзапрос.Значение.ПозицияОкончанияСоСкобкой, Подзапрос.Значение.ИмяПакета));	
		
		// Получаем подзапросы подзапроса, потом получаем текст подзапроса
		МассивПодвырезок = Новый Массив;
		ТекстПодзапросов = ПолучитьТекстПодзапросов(ГлобальныйТекстЗапроса, Подзапрос.Значение.Подзапросы, МассивПодвырезок);
		ТекстЗапроса = ТекстЗапроса + ?(ТекстЗапроса = "" Или ТекстПодзапросов = "", "", ";") + ТекстПодзапросов;
		
		ТекстПодзапроса = 
		Сред(ГлобальныйТекстЗапроса, Подзапрос.Значение.ПозицияНачалаСоСкобкой + 1, Подзапрос.Значение.ПозицияИз - Подзапрос.Значение.ПозицияНачалаСоСкобкой - 1)
		+ 
		" ПОМЕСТИТЬ " + Подзапрос.Значение.ИмяПакета + " "
		+ 
		ПолучитьВырезкуТекста(ГлобальныйТекстЗапроса, Подзапрос.Значение.ПозицияИз, Подзапрос.Значение.ПозицияОкончанияСоСкобкой - 1, МассивПодвырезок);
	
		ТекстЗапроса = ТекстЗапроса + ?(ТекстЗапроса = "" Или ТекстПодзапроса = "", "", ";") + ТекстПодзапроса;
		
		//// Объединим массив подвырезок с массивом вырезок
		//Для Каждого Элемент Из МассивПодвырезок Цикл
		//	МассивВырезок.Добавить(Элемент);	
		//КонецЦикла;                                    

	КонецЦикла;
	
	Возврат ТекстЗапроса;
КонецФункции

// Функция получает вырезку из текста с учётом всех фрагментов, которые должны быть вырезаны внутри неё
// МассивВырезок - сожержит элементы - структуры (ПозицияНачала, ПозицияОкончания, ТекстЗапроса = ""), где ТекстЗапроса - будет вставлено вместо вырезаемого текста
Функция ПолучитьВырезкуТекста(ГлобальныйТекстЗапроса, ПозицияНачала, ПозицияОкончания, Знач МассивВырезок)
	
	// --
	// Строим МассивТочекТекста
	
	// Массив, элементами которого будет структура(Позиция, ТекстЗапроса = "")
	// Если ТекстЗапроса заполнено, то вместо текста между позициями, берём этот текст
	МассивТочекТекста = Новый Массив;
	
	МассивТочекТекста.Добавить(Новый Структура("Позиция, ТекстЗапроса", ПозицияНачала, ""));
	
	Для Каждого Вырезка Из МассивВырезок Цикл
		Если ПозицияНачала <> Вырезка.ПозицияНачала Тогда
			МассивТочекТекста.Добавить(Новый Структура("Позиция, ТекстЗапроса", Вырезка.ПозицияНачала, Вырезка.ТекстЗапроса));
		КонецЕсли;
		Если ПозицияОкончания <> Вырезка.ПозицияОкончания Тогда
			МассивТочекТекста.Добавить(Новый Структура("Позиция, ТекстЗапроса", Вырезка.ПозицияОкончания, ""));
		КонецЕсли;
	КонецЦикла;
	
	МассивТочекТекста.Добавить(Новый Структура("Позиция, ТекстЗапроса", ПозицияОкончания, ""));
	
	// Строим МассивТочекТекста
	// --
	
	// --
	// Формируем текст
	ТекстЗапроса = "";
	
	ПозицияПрошлая = Неопределено;
	ТекстПрошлый = "";
	Для Каждого ТочкаТекста Из МассивТочекТекста Цикл
		Если ПозицияПрошлая <> Неопределено Тогда
			Если ТекстПрошлый <> "" Тогда
				ТекстЗапроса = ТекстЗапроса + ТекстПрошлый;
			Иначе
				ТекстЗапроса = ТекстЗапроса + Сред(ГлобальныйТекстЗапроса, ПозицияПрошлая, ТочкаТекста.Позиция - ПозицияПрошлая);
			КонецЕсли;
		КонецЕсли;
		
		ПозицияПрошлая = ТочкаТекста.Позиция;
		ТекстПрошлый = ТочкаТекста.ТекстЗапроса;
	КонецЦикла;	
	// Формируем текст
	// --
	
	Возврат ТекстЗапроса;
	
КонецФункции

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

// Функции редактирования запроса
// --

// --
// Дополнительные строковые функции

// Функция разбивает текст на слова и возвращает массив.
// Если нужно получить конкретное количество слов, то
// надо задать параметр НужноСлов.
// В случае если найденных слов меньше показателя НужноСлов, то
// оставшиеся элементы массива будут заданы значением ТекстЗаменыНенайденных.
//
// Параметры
//	- ТекстЗапроса:Строка - текст, в котором ищем слова, разделенные символом
//	- Символ:Строка - символ разделения
//	- НужноСлов:Число - нужно элементов в возвращаемом массиве
//	- ТекстЗаменыНенайденных:Строка - текст, в котором ищем слова, разделенные символом
//  - СимволыКоторыеДолжныЗакрываться:Массив - массив символов, которые в нутри слова должны иметь четное количество или 0. Например в слове не может быть одной открывающей кавычки
//
// Возвращаемое значение:
//	МассивСлов:Массив – массив, элементами которого являются части переданного в функцию текст
//
Функция ПолучитьМассивСловРазделенныхСимволом(Знач ТекстЗапроса, Символ, НужноСлов = 0, ТекстЗаменыНенайденных = "", СимволыКоторыеДолжныЗакрываться = Неопределено) Экспорт
		
	// --
	// Массив слов для возврата
	МассивСлов = Новый Массив();
	// --
	
	// --
	// Предварительно удалаем повтор заданного символа в слове
	ТекстЗапроса = УдалитьДублирующиеСимволы(ТекстЗапроса, Символ);
	// --
	
	// --
	// Находим позицию первого Символа
	ПозицияСимвола = Найти(ТекстЗапроса, Символ);
	// --
	
	// --
	// Перебираем все позиции Символа
	Пока ПозицияСимвола <> 0 Цикл
		
		// Получаем слово и заносим его в массив
		Слово = Лев(ТекстЗапроса, ПозицияСимвола - 1);		
		
		// --
		// Проверка на СимволыДолжныЗакрываться
		Если СимволыКоторыеДолжныЗакрываться <> Неопределено Тогда
			ВыйтиИзВерхнегоЦикла = Ложь;
			
			// --
			// Перебираем символы, которые должны закрываться
			Для Каждого СимволКоторыйДолженЗакрываться Из СимволыКоторыеДолжныЗакрываться Цикл
				ЧислоВхождений = СтрЧислоВхождений(Слово, СимволКоторыйДолженЗакрываться);
				Если ЧислоВхождений <> 0 Тогда
					РезультатДеления = ЧислоВхождений / 2;
					Если РезультатДеления <> Окр(РезультатДеления, 0) Тогда
						ТекстПослеВхожденияСимвола = Сред(ТекстЗапроса, ПозицияСимвола + 1, СтрДлина(ТекстЗапроса));
						НоваяПозиция = Найти(ТекстПослеВхожденияСимвола, Символ);
						Если НоваяПозиция = 0 Тогда
							ПозицияСимвола = 0;
						Иначе							
							ПозицияСимвола = ПозицияСимвола + НоваяПозиция;	
						КонецЕсли;
						// Если находим случай незакрытого символа, то входим в цикл по новому
						ВыйтиИзВерхнегоЦикла = Истина;
						Прервать;
					КонецЕсли;
				КонецЕсли;
			КонецЦикла;
			// Перебираем символы, которые должны закрываться
			// --
			
			Если ВыйтиИзВерхнегоЦикла = Истина Тогда
				Продолжить;
			КонецЕсли;
		КонецЕсли;
		// Проверка на СимволыДолжныЗакрываться
		// --
		
		МассивСлов.Добавить(Слово);
		
		// Уменьшаем количество НужноСлов
		НужноСлов = НужноСлов - 1;
		
		// Обрезаем текст
		ТекстЗапроса = Прав(ТекстЗапроса, СтрДлина(ТекстЗапроса) - ПозицияСимвола);
		
		// Находим позицию следующего Символа
		ПозицияСимвола = Найти(ТекстЗапроса, Символ);
		
	КонецЦикла;
	// --
	
	// --
	// Добавляем последнее слово
	МассивСлов.Добавить(ТекстЗапроса);
	// --
	
	// --
	// Дополняем при необходимости массив пустыми значениями
	Для Нумератор = 1 По НужноСлов Цикл 
		МассивСлов.Добавить(ТекстЗаменыНенайденных); 
	КонецЦикла;
	// --
	
	// --
	// Возвращаем массив
	Возврат МассивСлов;
	// --
	
КонецФункции

// Функция удаления дублирующих символов в строке
//
// Параметры
//	- ТекстЗапроса:Строка - строка, из которой удаляем дублирующие символы
//	- ТекстЗапроса:Символ - строка, которая является разделительным символом в строку замены
//	- НужноСлов:Число - нужно слов, разделенных в данной строке заданным символом
//	- ТекстЗаменыНенайденных:Строка - строки, которые добавляются для достижения нужного количества слов
//
// Возвращаемое значение:
//	ТекстЗапроса:Строка – отредактированная строка ТекстЗапроса 
//
//&НаСервере
Функция УдалитьДублирующиеСимволы(Знач ТекстЗапроса, ТекстУдаления) Экспорт
	
	// --
	// Определяем длину текста удаления
	ДлинаТекстаУдаленияТекст = СтрДлина(ТекстУдаления);
	// --
	
	// --
	// Удаляем дублирующие символы
	Пока Найти(ТекстЗапроса, ТекстУдаления + ТекстУдаления) <> 0 Цикл 
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ТекстУдаления + ТекстУдаления, ТекстУдаления); 
	КонецЦикла;
	// --
	
	// --
	// Обрезаем пробелы
	ТекстЗапроса = СокрЛП(ТекстЗапроса); 
	// --
	
	// --
	// Удалям заданный символ из начала и конца строки: слева и справа
	// Слева
	Если Лев(ТекстЗапроса, ДлинаТекстаУдаленияТекст) = ТекстУдаления Тогда
		ТекстЗапроса = Прав(ТекстЗапроса, СтрДлина(ТекстЗапроса) - ДлинаТекстаУдаленияТекст);	
	КонецЕсли;
	
	// Справа
	Если Прав(ТекстЗапроса, ДлинаТекстаУдаленияТекст) = ТекстУдаления Тогда
		ТекстЗапроса = Лев(ТекстЗапроса, СтрДлина(ТекстЗапроса) - ДлинаТекстаУдаленияТекст);	
	КонецЕсли;
	// --
	
	// --
	// Возвращаем отредактированный текст
	Возврат ТекстЗапроса;
	// --
	
КонецФункции

// Разбивает строку вида ключ=значение;ключ2=значение;
// где СимволМеждуКлючомИЗначением - =, СимволМеждуЗначениемИКлючом - ; 
Функция ПолучитьСтрктуруЗначенийИзСтроки(Знач ТекстЗапроса, СимволМеждуКлючомИЗначением, СимволМеждуЗначениемИКлючом, СимволыКоторыеДолжныЗакрываться)
	
	Структура = Новый Структура;
	
	МассивКлючЗначение = ПолучитьМассивСловРазделенныхСимволом(ТекстЗапроса, СимволМеждуЗначениемИКлючом, , , СимволыКоторыеДолжныЗакрываться);
	Для Каждого КлючЗначение Из МассивКлючЗначение Цикл
		Массив = ПолучитьМассивСловРазделенныхСимволом(КлючЗначение, СимволМеждуКлючомИЗначением, , , СимволыКоторыеДолжныЗакрываться);
		Если Массив.Количество() = 2 Тогда
			Структура.Вставить(Массив[0], Массив[1]);			
		Иначе
			// Что-то распарсили не так, возможно надо вызвать ошибку
		КонецЕсли;
	КонецЦикла;
	
	Возврат Структура;
	
КонецФункции

// Получает следующее слово в тексте
// ОбходВперед - Слово должно быть за начальной позицией или до начальной позиции
// НачальнаяПозицияСкорректированная - служит для возврата скорректированной начальной позиции
Функция ПолучитьСлово(ТекстЗапроса, Знач НачальнаяПозиция, КорриктороватьНачальнуюПозицию = Ложь, ОбходВперед = Истина, МассивСпециальныхСимволов, НачальнаяПозицияСкорректированная = Неопределено)
		
	ДлинаТекста = СтрДлина(ТекстЗапроса);
	
	// --
	// Подредактировать начальную позицию.
	// Например, если начальная позиия не верна, равна пробелу, то нужно увеличить вправо начальную позицию, чтобы добравться до первой буквы
	// и потом получить начиная с неё слово
	Если КорриктороватьНачальнуюПозицию = Истина Тогда
		
		Если ОбходВперед = Истина Тогда
			Для НомерБуквы = НачальнаяПозиция По ДлинаТекста Цикл				
				Если МассивСпециальныхСимволов.Найти(Сред(ТекстЗапроса, НомерБуквы, 1)) = Неопределено Тогда				
					НачальнаяПозиция = НачальнаяПозиция + 1;				
				Иначе				
					Прервать;				
				КонецЕсли;				
			КонецЦикла;
		Иначе
			Пока НачальнаяПозиция <> 0 Цикл
				Если МассивСпециальныхСимволов.Найти(Сред(ТекстЗапроса, НачальнаяПозиция, 1)) <> Неопределено Тогда
					НачальнаяПозиция = НачальнаяПозиция - 1;	
				Иначе
					Прервать;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		
	КонецЕсли;
	
	НачальнаяПозицияСкорректированная = НачальнаяПозиция;
	// Подредактировать начальную позицию.
	// Например, если начальная позиия не верна, равна пробелу, то нужно увеличить вправо начальную позицию, чтобы добравться до первой буквы
	// и потом получить начиная с неё слово
	// --
	
	// --
	// Ищем конец слова
	Если ОбходВперед = Истина Тогда
		Для НомерБуквы = НачальнаяПозиция По ДлинаТекста Цикл
			Если МассивСпециальныхСимволов.Найти(Сред(ТекстЗапроса, НомерБуквы, 1)) <> Неопределено 
				Или
				НомерБуквы = ДлинаТекста
				Тогда
				
				// --
				// Возвращаем найденное слово
				// Если слово последнее в тексте (НомерБуквы = ДлинаТекста), то возвращаем с последним символом
				НайденноеСлово = Сред(
				ТекстЗапроса,
				НачальнаяПозиция,
				НомерБуквы - НачальнаяПозиция + ?(НомерБуквы = ДлинаТекста, 1, 0)
				); 
				Возврат НайденноеСлово;
				// --
				
			КонецЕсли;
		КонецЦикла;
	Иначе
		НомерБуквы = НачальнаяПозиция;
		Пока НомерБуквы <> 0 Цикл
			Если МассивСпециальныхСимволов.Найти(Сред(ТекстЗапроса, НомерБуквы, 1)) <> Неопределено
				Или
				НомерБуквы = 0
				Тогда
				
				// --
				// Возвращаем найденное слово
				// Если слово последнее в тексте (НомерБуквы = ДлинаТекста), то возвращаем с последним символом
				НайденноеСлово = Сред(
				ТекстЗапроса,
				НомерБуквы + ?(НомерБуквы = 0, 0, 1),
				НачальнаяПозиция - НомерБуквы
				); 
				Возврат НайденноеСлово;
				// --
				
			КонецЕсли;
			НомерБуквы = НомерБуквы - 1;
		КонецЦикла;
	КонецЕсли;
	
	Возврат Неопределено;
	
КонецФункции

// Дополнительные строковые функции
// --

 

Скачать файлы

Наименование Файл Версия Размер
Набор функций

.txt 20,40Kb
26.08.16
7
.txt 20,40Kb 7 Скачать
КонсольОтчетов (Вынесение вложенных запросов)

.epf 91,52Kb
26.08.16
12
.epf 91,52Kb 12 Скачать

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

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. Bazin 5 30.08.16 12:19 Сейчас в теме
Интересно, нашел маленький баг, нужно добавить проверку СтрДлина(ИмяПакета) > 0:
// Проверка на уникальность будущего пакета
	Если МассивИменПакетов.Найти(ИмяПакета) = Неопределено И СтрДлина(ИмяПакета) > 0 Тогда
		МассивИменПакетов.Добавить(ИмяПакета);	

2. ostapchenko.alexandr 19 30.08.16 12:31 Сейчас в теме
(1) Bazin, Здравствуйте, а как может ИмяПакета быть пустой строкой? Имя пакета берётся из вложенного запроса после слова КАК. Т.е. в запросе
ВЫБРАТЬ
	ВложенныйЗапрос.Ссылка
ИЗ
	(ВЫБРАТЬ
		Банки.Ссылка КАК Ссылка
	ИЗ
		Справочник.Банки КАК Банки) КАК ВложенныйЗапрос
Показать

ВложенныйЗапрос - это ИмяПакета. Разве есть вложенные запросы без КАК ... ?
3. Bazin 5 30.08.16 12:59 Сейчас в теме
Вот пример:
ВЫБРАТЬ
	ВложенныйЗапрос.Поле1
ИЗ
	(ВЫБРАТЬ
		ПОДСТРОКА(Банки.Код, 1, 9) КАК Поле1
	ИЗ
		Справочник.Банки КАК Банки
	
	СГРУППИРОВАТЬ ПО
		ПОДСТРОКА(Банки.Код, 1, 9)) КАК ВложенныйЗапрос
Показать
4. Bazin 5 30.08.16 13:06 Сейчас в теме
А вот вообще без "КАК"
ВЫБРАТЬ
	ВложенныйЗапрос.Поле1
ИЗ
	(ВЫБРАТЬ
		1 КАК Поле1
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		2) КАК ВложенныйЗапрос
Показать
5. Bazin 5 30.08.16 13:19 Сейчас в теме
И вот такой, "Временная таблица уже существует":
ВЫБРАТЬ
	Банки.Ссылка
ПОМЕСТИТЬ Банки
ИЗ
	Справочник.Банки КАК Банки
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВложенныйЗапрос.Ссылка
ИЗ
	(ВЫБРАТЬ
		Банки.Ссылка КАК Ссылка
	ИЗ
		Банки КАК Банки) КАК ВложенныйЗапрос
Показать
6. ostapchenko.alexandr 19 30.08.16 14:19 Сейчас в теме
(5) Bazin, Спасибо! Все замечания исправил.
7. DrAku1a 1314 31.08.16 10:52 Сейчас в теме
У меня в отладчике запросов - это реализовано, года так три назад...
http://infostart.ru/public/190493/#UnwrapQueryToBatch
8. Bazin 5 01.09.16 06:21 Сейчас в теме
9. kiruha 384 01.09.16 12:33 Сейчас в теме
(7)Мощная вещь, но к сожалению там обычные формы, на современных конфигурациях(управляемые) не открываются даже если выбрать толстый клиент управляемое приложение. Так что автору плюс за алгоритм, но просьба для в запросник для управляемых добавить
12. ostapchenko.alexandr 19 01.09.16 20:34 Сейчас в теме
(9) kiruha, на управляемых формах должно работать, все функции выполняются на сервере
14. tormozit 5824 02.09.16 09:49 Сейчас в теме
(9)
на современных конфигурациях(управляемые) не открываются даже если выбрать толстый клиент управляемое приложение
надо выбирать Толстый клиент обычное приложение, а не управляемое.
10. uri1978 128 01.09.16 17:54 Сейчас в теме
(7) DrAku1a, Но при этом сам обработчик толком не работает. Уж извините за пост в защиту автора.
А если добавить что есть комментарий к Вашему обработчику:
13.06.2013 12:37
Функция "Разложить вложенный запрос в пакетный" (ноухау)
...
Это довольно интересная функция - нигде такого не встречал.

Кто не хочет видеть, тот не видит =) В консоли запросов из подсистемы "Инструменты разработчика" это уже давно есть. В описании есть такая функция "Вынести в новый запрос" и даже на картинке видно http://devtool1c.ucoz.ru/index/konsol_zaprosov/0-18
Ссылка на сообщение
То совсем весело.

Эх-х-х если бы Вы его довели до ума, цены бы не было.
13. tormozit 5824 02.09.16 07:56 Сейчас в теме
Бездумно выносить все вложенные запросы в отдельные запросы пакета вредно. Временные таблицы имеют свои накладные расходы. Поэтому выносить оправдано те подзапросы, для которых эти расходы будут меньше "сложности" для построения плана запроса, вносимой подзапросом. Поэтому то и была сделана команда для выборочного вынесения (10)
17. Bazin 5 05.09.16 05:25 Сейчас в теме
(13) tormozit, Публикация начинается со слов "Запросы неудобно отлаживать...", а не использовать
18. tormozit 5824 05.09.16 07:27 Сейчас в теме
(17) Согласен, чисто для отладки такое может быть полезно быть полезно с учетом того, что нет возможности использовать дерево запроса. Однако связь частей полученного пакетного запроса с частями оригинального запроса может быть довольно ненаглядной после переноса всех подзапросов во временные таблицы.
19. DrAku1a 1314 08.09.16 02:46 Сейчас в теме
(10) uri1978, Как обычно, руки не доходят сделать. Да и смысл? Есть же хорошая консоль от ИР (в т.ч. мобильных ИР).
Сам - пользуюсь отладчиком, мне удобно - то, что разделил всё по вкладкам. В итоге - большое окно для редактирования текста запроса, большое окно для просмотра результата, и ничего лишнего.
11. ostapchenko.alexandr 19 01.09.16 20:30 Сейчас в теме
Если данный алгоритм не работает на каких-либо примерах, присылайте, буду править.
15. Ovrfox 14 02.09.16 10:59 Сейчас в теме
А еще добавлять обработки на УФ в конфигурацию. чтобы они открывались.
Этот вариант не для того, чтобы к конфе на УФ добавить обычную обработку, а как раз наоборот
К обычной конфе добавить обработку на УФ.

Т.е не реально использовать эту обработку на УФ конфе, чтобы при этом конфа еще и работала.
16. МимохожийОднако 130 03.09.16 09:02 Сейчас в теме
ОФФ наверное. Маленькое замечание. В режиме отладки, если не применять специальные инструменты можно использовать метод Запрос.ВыполнитьПакетСПромежуточнымиРезультатами()
После отладки можно вернуть метод ВыполнитьПакет() на место
20. ostapchenko.alexandr 19 01.12.17 12:54 Сейчас в теме
Исправил
ПрошлоеСлово <> "ВСЕ" И ПрошлоеСлово <> "ОБЪЕДИНИТЬ" И ПрошлоеСлово <> "В" Тогда
на
ПрошлоеСлово <> "ВСЕ" И ПрошлоеСлово <> "ОБЪЕДИНИТЬ" И ПрошлоеСлово <> "В" И ПрошлоеСлово <> "ИЕРАРХИИ" Тогда
Оставьте свое сообщение

См. также

Установка предопределенных элементов: просмотр, исправление и поиск ошибок (задвоенных и отсутствующих) Промо

Инструментарий разработчика Универсальные обработки v8 1cv8.cf Абонемент ($m)

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

2 стартмани

06.10.2014    145304    1952    ekaruk    164    

Консоль запросов 9000

Консоль запросов v8 v8::Запросы 1cv8.cf Абонемент ($m)

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

1 стартмани

24.02.2020    8808    193    kuza2000    119    

Помощник работы с идентификаторами объектов

Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Инструмент для расширенного анализа идентификаторов объектов.

2 стартмани

24.01.2020    6521    23    YPermitin    25    

Инструменты оптимизации для 1С на MS SQL Server

Прочие инструменты разработчика v8 v8::УФ 1cv8.cf Абонемент ($m)

Набор базовых инструментов для поиска узких мест в работе 1С на MS SQL Server.

1 стартмани

15.12.2019    14653    192    berezdetsky    23    

Навигатор по конфигурации базы 1С 8.3 Промо

Инструментарий разработчика Универсальные обработки v8 v8::УФ 1cv8.cf Россия Абонемент ($m)

Универсальная внешняя обработка для просмотра метаданных конфигураций баз 1С 8.3. Отображает свойства и реквизиты объектов конфигурации, их количество, основные права доступа и т.д. Отображаемые характеристики объектов: свойства, реквизиты, стандартные рекизиты, реквизиты табличных частей, предопределенные данные, регистраторы для регистров, движения для документов, команды, чужие команды, подписки на события, подсистемы. Отображает структуру хранения объектов базы данных, для регистров доступен сервис "Управление итогами". Платформа 8.3, управляемые формы. Версия 1.1.0.63 от 10.06.2020

3 стартмани

28.10.2018    29334    276    ROL32    67    

Полезные процедуры и функции для программиста

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

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

1 стартмани

07.10.2019    26655    14    HostHost    40    

CF & SQL : конструктор прямых запросов к БД 1С

Инструментарий разработчика Администрирование СУБД v8 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

02.10.2019    15821    186    dmitrydemenew    44    

Конвейер проверки качества кода

Инструментарий разработчика Практика программирования Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Jenkinsfile для выполнения проверки качества кода. Собирает информацию с АПК, EDT и BSL-LS. Сопоставляет ошибки с гит-репозиторием, выгруженным ГитКонвертором. Отправляет в Сонар.

3 стартмани

04.09.2019    20876    21    Stepa86    44    

[Расширение] Контроль отрицательных остатков по регистру бухгалтерии при проведении Промо

Универсальные функции Инструментарий разработчика Учет ТМЦ Учет ТМЦ v8 1cv8.cf Россия БУ Абонемент ($m)

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

1 стартмани

17.08.2015    44836    155    ekaruk    31    

Просмотр и анализ структуры базы данных (отчет на СКД)

Инструментарий разработчика v8 v8::СКД 1cv8.cf Абонемент ($m)

Отчет для просмотра и анализа структуры базы данных с поддержкой файловых баз (ограниченный режим), а также баз на SQL Server и PostgreSQL.

5 стартмани

24.07.2019    18504    157    YPermitin    27    

Модель объекта

Инструментарий разработчика v8 Абонемент ($m)

Подсистема позволяет описать модель данных объекта, где описана зависимость между реквизитами, и затем использовать эту модель в разных сценариях работы с объектом. Версия платформы: 8.3.6 и выше. С небольшими доработками будет работать на 8.2.

1 стартмани

30.06.2019    10843    0    vadim1980    5    

Переводим рутину ручного тестирования 1C на рельсы Jenkins-а и ADD

Инструментарий разработчика Jenkins v8 Абонемент ($m)

Вы все еще тестируете свои конфигурации 1С вручную? Да вы просто тратите жизнь впустую! В данном туториале попробуем скрестить ADD и jenkins для автоматического запуска тестов.

1 стартмани

03.06.2019    20876    5    ripreal1    89    

Faster - многофункциональный ускоритель работы программиста 1С Промо

Инструментарий разработчика v8 1cv8.cf Россия Абонемент ($m)

Программа Faster 8.7 позволяет ускорить процесс работы программиста 1С (и не только 1C). Программа Faster позволяет делится кодом с другими программистами в два клика или передать ссылку через QR Код. Исправление введенных фраз двойным Shift (с помощью speller.yandex) Полезная утилита для тех, кто печатает много однотипного текста, кодирует в среде Windows на разных языках программирования. Через некоторое время работы с программой у вас соберется своя база часто используемых словосочетаний и кусков кода. Полностью переделан механизм перехвата клавиш, теперь не зависает при обработке скриптов.

1 стартмани

24.05.2012    75482    207    moolex    145    

Универсальный HTTP-сервис на платформе 1С, аля HTTP-сервер с примером

Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

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

1 стартмани

13.05.2019    26656    119    Diversus    42    

Групповая проверка доработок

Прочие инструменты разработчика v8 v8::УФ 1cv8.cf Абонемент ($m)

Обработка для массовой проверки доработок конфигурации: Открытие форм, Печать, Формирование отчетов, Проведение документов, Запись справочников, ПВХ, ПВР. Выдает список обнаруженных ошибок. Рекомендуется применять для тестирования обновленной конфигурации, перед установкой пользователям. В коде используются универсальные методы поэтому подходит для большинства конфигураций, построенных на базе библиотеки стандартных подсистем. Проверялась на Зарплата и управление персоналом КОРП 3.1.8.216, Управление торговлей 11, 1С:ERP Управление предприятием 2.4.7.141, Бухгалтерия предприятия КОРП 3.0.68.66.

2 стартмани

05.05.2019    13127    94    sapervodichka    23    

Расширение "Быстрая проверка кода" для конфигурации 1С:Автоматизированная проверка конфигураций

Инструментарий разработчика v8 v8::УФ 1cv8.cf Абонемент ($m)

Расширение для конфигурации "1С:Автоматизированная проверка конфигураций", позволяющее проверять произвольный код.

1 стартмани

26.03.2019    17014    55    Bazil    25    

Консоль запросов + ТЗ как параметры Промо

Консоль запросов v8 1cv8.cf Украина Абонемент ($m)

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

2 стартмани

12.11.2010    32722    58    Kashemir    24    

Настройка отладки на сервере 1С

Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Обработка для настройки отладки на сервере, включение отладки COM-соединений и отладки Web-сервисов.

1 стартмани

26.03.2019    22521    89    frkbvfnjh    37    

Конструктор мобильного клиента Simple WMS Client: способ создать полноценный ТСД без мобильной разработки. Теперь новая версия - Simple UI (обновлено 14.11.2019)

Инструментарий разработчика Сканер штрих-кода Терминал сбора данных Мобильная разработка Оптовая торговля Производство готовой продукции (работ, услуг) Розничная торговля Учет ОС и НМА Учет ТМЦ Оптовая торговля Производство готовой продукции (работ, услуг) Розничная торговля Учет ОС и НМА Учет ТМЦ v8 v8::Mobile БУ УУ Абонемент ($m)

Simple WMS Client – это визуальный конструктор мобильного клиента для терминала сбора данных(ТСД) или обычного телефона на Android. Приложение работает в онлайн режиме через интернет или WI-FI, постоянно общаясь с базой посредством http-запросов (вариант для 1С-клиента общается с 1С напрямую как обычный клиент). Можно создавать любые конфигурации мобильного клиента с помощью конструктора и обработчиков на языке 1С (НЕ мобильная платформа). Вся логика приложения и интеграции содержится в обработчиках на стороне 1С. Это очень простой способ создать и развернуть клиентскую часть для WMS системы или для любой другой конфигурации 1С (УТ, УПП, ERP, самописной) с минимумом программирования. Например, можно добавить в учетную систему адресное хранение, учет оборудования и любые другие задачи. Приложение умеет работать не только со штрих-кодами, но и с распознаванием голоса от Google. Это бесплатная и открытая система, не требующая обучения, с возможностью быстро получить результат.

5 стартмани

09.01.2019    39339    245    informa1555    200    

Управление задачами в 1С - готовая подсистема с открытым кодом и широким базовым функционалом. Версия 1.0.6

Инструментарий разработчика Управление бизнес-процессами (BPM) Управление проектом v8 Абонемент ($m)

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

2 стартмани

17.12.2018    17875    94    for_sale    38    

[x1c.ru] 1CDBin: Работа с файлами *.1CD на низком уровне средствами языка 1С с возможностью чтения таблиц (поддерживается формат 8.3.8.0) Промо

Тестирование и исправление Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Обработка позволяет просматривать файловые базы 1CD на низком уровне средствами встроенного языка. Реализована часть функциональности Tool_1CD, но на языке 1С Предприятия. Показываются таблицы, параметры таблиц, поля таблиц, записи таблиц, значения полей BLOB, есть 16-ричный просмотр страниц базы и консоль кода. Можно использовать для изучения структуры файлов 1CD, просмотра баз 1CD для выявления повреждений, создания своих обработок для выгрузки данных без открытия исследуемой базы в 1С:Предприятии.

1 стартмани

07.10.2014    49510    200    GusevNA    75    

Использование подсистемы БСП "Заполнение объектов"

Практика программирования Универсальные функции БСП (Библиотека стандартных подсистем) v8 v8::УФ 1cv8.cf Россия Абонемент ($m)

Применение механизмов БСП для добавления новых команд заполнения к формам различных объектов. Использование расширений конфигурации для доработки. Шаблоны для реализации собственных команд заполнения.

1 стартмани

23.11.2018    23727    12    ids79    23    

HTTP Сервисы: Путь к своему сервису. Часть 4

Инструментарий разработчика Практика программирования v8 1cv8.cf Абонемент ($m)

Продолжение статьи «HTTP Сервисы: Путь к своему сервису. Часть 3». В предыдущих частях мы уже о многом поговорили. В этой части поговорим про размер сообщений, о файлах, о порциях и немножко, о регламентах.

1 стартмани

28.09.2018    22336    36    dsdred    15    

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

Печатные формы документов Универсальные функции Email v8 КА1 БП2.0 УТ10 УПП1 Абонемент ($m)

Решение для интерактивной (нажал-отредактировал) отправки электронных писем и печатных форм через почтовый клиент (Thunderbird, Outlook) находящийся на локальном компьютере, из конфигурации 1С, развернутой под удаленным рабочим столом (RDP, remote-app). Подходит также для локального развертывания 1С. Представлен пример быстрой интеграции с конфигурациями "Управление торговлей 10.3", "Управление производственным предприятием 1.3", "Комплексная автоматизация 1.1", "Бухгалтерия предприятия 2.0".

1 стартмани

21.09.2018    21264    13    stvorl    0    

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

Инструментарий разработчика v8 КД Абонемент ($m)

При переносе данных между различающимися данными частенько приходится смотреть в правила. И часто, чтобы выяснить, к примеру, каким документом формируются остатки по конкретному ПВД, нужно заглядывать в него и искать, какое ПКО в нем вызывается. А может вызываться и алгоритм, в котором вызывается ПКО ;-) А если правил много? Чтобы не мучить себя утомительными поисками, предлагаю воспользоваться этой обработкой.

1 стартмани

14.10.2011    21132    29    Meta    17    

Консоль Внедренца v.3.6.2 (vnedr.cf)

Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Идея данной обработки заключается в создании простого, функционального и универсального инструментария для внедренцев и программистов 1С, который будет работать как в толстом клиенте на обычных и на управляемых формах, так и в тонком клиенте. Интерфейс и логика работы максимально идентичны у обычных форм и управляемых. Инструментарий включает в себя: Консоль кода, Консоль запросов, Консоль отчетов (СКД), Универсальную обработку объектов, Средства для работы с таблицами базы данных 1С, Редактирование регистров сведений базы, Инструмент по работе с табличными документами - загрузка данных из табличного документа.

1 стартмани

27.08.2018    19296    327    evvakra    42    

HTTP Сервисы: Путь к своему сервису. Часть 3

Инструментарий разработчика Практика программирования v8 1cv8.cf Абонемент ($m)

Продолжение статьи «HTTP Сервисы: Путь к своему сервису. Часть 2». В предыдущих частях мы использовали только Get, в этой части поговорим о других методах и длительных операциях.

1 стартмани

27.08.2018    30793    48    dsdred    15    

HTTP Сервисы: Путь к своему сервису. Часть 2

Инструментарий разработчика Практика программирования v8 1cv8.cf ERP2 УТ11 КА2 Абонемент ($m)

Продолжение статьи «HTTP Сервисы: Путь к своему сервису. Часть 1». В этой части будет "Микс" из OData+HTTP-Сервис(Get)+СКД. Наш пример будет работать как в браузере, так и в написанной нами обработке. Работать будем с разными версиями платформ.

1 стартмани

13.08.2018    29555    33    dsdred    0    

Интерфейс сопоставления объектов для обмена (для типового регистра СоответствиеОбъектовДляОбмена) Промо

Инструментарий разработчика Универсальные обработки Перенос данных из 1C8 в 1C8 v8 КА1 БП2.0 ЗУП2.5 УТ10 УПП1 Абонемент ($m)

Вы внедряете обмен данными между двумя типовыми или основанными на типовых БД и вам необходим инструмент, чтобы сопоставить между собой справочники этих конфигураций? Вы хотите навести порядок в обмене данными, потому что вам надоело вылавливать дублирующиеся объекты? Вам очень хочется перепоручить сопоставление объектов обменивающихся баз пользователям, но нет подходящего и понятного пользователям интерфейса? Тогда вам нужна именно эта обработка!

4 стартмани

11.11.2015    37225    133    catsam    8    

Позиционирование в помещении с помощью нейросети по сигналу Wi-Fi. Интерактивная карта склада в 1С с показом позиции

Инструментарий разработчика Практика программирования v8 Абонемент ($m)

Данная публикация содержит в себе редактор и интерактивную карту склада или иного помещения, на которой в реальном времени отображается позиция устройства, координаты которого вычисляются по уровням сигнала нескольких роутеров Wi-Fi. В статье и приложенным к ней разработкам предлагаются инструменты и методика для реализации вычисления точной геопозиции внутри помещений с помощью нейронной сети. Конфигурация написана на релизе 1С:Предприятие 8.3.12.1412, клиентское приложение имеет минимальный уровень совместимости SDK -16.

5 стартмани

09.08.2018    25409    25    informa1555    26    

Консоль HTTP-запросов с генерацией кода

Консоль запросов v8 v8::УФ 1cv8.cf Абонемент ($m)

Консоль HTTP-запросов, которая не только выполняет запросы и получает результат их выполнения, но и генерирует необходимый код. Использую на 8.3.11.2899.

1 стартмани

25.05.2018    21816    255    leongl    16    

Работа со схемой запроса

Инструментарий разработчика Практика программирования v8 v8::Запросы Абонемент ($m)

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

1 стартмани

24.04.2018    41009    85    kalyaka    34    

Exec - Выполнение кода, консоль запросов и не только! Промо

Консоль запросов v8 1cv8.cf Абонемент ($m)

Незаменимый инструмент администратора БД и программиста: Выполняйте произвольный код из режима 1С Предприятие; сохраняйте/загружайте часто используемые скрипты; выполняйте запросы с замером производительности запроса в целом и каждой из временных таблиц в частности, а также с просмотром содержимого временных таблиц; произвольным образом изменяйте любые объекты БД, редактируя даже не вынесенные на формы реквизиты и записывая изменения в режиме "ОбменДанными.Загрузка = Истина"; легко узнавайте ИД объектов БД; выполняйте прямые запросы к SQL с замером производительности и не только!

5 стартмани

10.11.2015    39202    75    catsam    11    

Регистры правил [Расширение]

Инструментарий разработчика Информационная безопасность v8 v8::Права УТ11 Абонемент ($m)

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

10 стартмани

15.03.2018    16261    8    33lab    1    

Тестирование интерфейса в обычном приложении 8.2 при помощи SikuliX

Инструментарий разработчика Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

Как же не хватает клиента тестирования на платформе 8.2. Не кликнешь на кнопку, не выберешь из списка, не проверишь видит ли надпись пользователь. Воспользуемся внешним инструментом SikuliX, который позволит нам протестировать функционал форм. Данный инструмент легко встраивается в линию сборки и может "дружить" с уже известным многим Open-source продуктами.

1 стартмани

03.01.2018    27092    5    kraynev-navi    41    

Расширение возможностей печати: Вывод произвольного нижнего и верхнего колонтитула

Печатные формы документов Практика программирования Универсальные функции v8 1cv8.cf Абонемент ($m)

Расширяем функционал вывода нижнего / верхнего колонтитула. Стандартно 1С имеет достаточно ограничений по выводу и наполнению колонтитулов содержимым, взять хотя бы такие, как вывод только текста и отсутствие ограничения на номер конечной страницы. А при разработке кода сталкиваешься с тем, что свой блок с нижним колонтитулом нужно прижимать к низу страницы. Казалось бы быстро решаемый вопрос, но и в нем есть нюансы. Сейчас я расскажу о том, как решалась эта задача. UPD 15.02.2018. Добавлен вывод верхнего колонтитула; Вывод колонтитулов на первой и последней странице управляется параметрами; Научился считать страницы: Добавлено заполнение переменных аналогичных стандартным из колонтитулов; Задаются форматы даты и времени. Ограничения прежние: 1. Повторно сформировать табличный документ после смены параметров страницы интерактивно.; 2. Передавать данные для более плотной печати как можно более мелко нарезанными кусками.

1 стартмани

29.12.2017    36588    27    agent00mouse    0    

КонЗап - консоль запросов с улучшенным интерфейсом и дополнительными функциями Промо

Консоль запросов v8 1cv8.cf Абонемент ($m)

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

1 стартмани

16.07.2014    13765    20    serjpsv    18    

Универсальный конструктор отчетов СКД (Управляемые формы, тонкий клиент)

Инструментарий разработчика v8 v8::УФ v8::СКД 1cv8.cf Россия Абонемент ($m)

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

3 стартмани

20.11.2017    23307    249    Boneman    22    

Программное формирование форматированной строки в стиле html+inline CSS

Работа с интерфейсом Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Если вам приходилось работать с форматированными строками программно, то вы знаете, какая это боль. Данное решение облегчает программное формирование таких строк.

1 стартмани

18.11.2017    28421    31    bonv    10    

Макет в СКД - пример всех возможных типовых вариантов

Практика программирования Инструментарий разработчика v8 v8::СКД 1cv8.cf Абонемент ($m)

Макет СКД: наглядное представление того, что, как и куда выводится при типовых настройках.

1 стартмани

09.11.2017    20092    76    freelancer    4    

Размеры управляемой формы

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

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

1 стартмани

08.10.2017    25438    71    json    9    

Полезный код для программистов 1С (часть 1). Управление свойствами элементов формы. Хранение копии данных реквизитов

Инструментарий разработчика Практика программирования v8 Абонемент ($m)

У каждого программиста за время работы накапливается полезный инструментарий, которым он привык пользоваться. Естественно и у меня он тоже имеется. И вот решено было немного поделиться с сообществом. Возможно идеи не новые. Более того, допускаю, что реализованы они не самым оптимальным образом. Но ведь для этого сообщество и существует, чтобы делиться с ним, получая обратную связь.

1 стартмани

24.09.2017    40151    15    vandalsvq    80    

Тестирование: пример из семи шагов создания Unit-теста для платформы 1С

Инструментарий разработчика v8 ERP2 УТ11 Абонемент ($m)

В этой статье мы расскажем, как создать Unit-тест. Опишем как это сделать с использованием Фреймворка xUnitFor1C. Рассмотрим пример максимально приближенный к боевому, покажем процесс отладки теста, поделимся советами и приложим несколько обработок-примеров. Вы сможете убедиться, что создание тестов на самом деле это относительно быстрый и простой процесс.

1 стартмани

29.08.2017    28065    16    ivanov660    46    

Трансформатор 1С - SQL

Инструментарий разработчика v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

28.06.2017    33098    334    Synoecium    49    

OneStyle. Улучшенное форматирование кода в конфигураторе

Инструментарий разработчика v8 Абонемент ($m)

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

1 стартмани

19.06.2017    22085    22    Stepa86    45    

"Конвертация данных" + Git. Решение проблемы различий в файлах

Инструментарий разработчика Обмен через XML v8 КД Абонемент ($m)

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

1 стартмани

08.06.2017    23324    39    stas_ganiev    13    

Шаблон внешней обработки регламентного задания с формой настройки параметров выполнения

Инструментарий разработчика Универсальные функции v8 v8::УФ 1cv8.cf Абонемент ($m)

Шаблон внешней обработки призван упростить программисту процесс реализации внешнего регламентного задания. Пригоден к использованию во всех конфигурациях на управляемых формах, в которых присутствует подсистема "Дополнительные отчеты и обработки" из состава библиотеки стандартных подсистем (БСП) версии 2.1 и выше.

1 стартмани

28.05.2017    23619    169    Bassgood    10    

Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов

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

Восстановление партий, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

26.05.2017    47328    15    DarkAn    86    

Набор подсистем "Умные таблицы"

Инструментарий разработчика v8 Беларусь Россия Казахстан Абонемент ($m)

Данный набор подсистем – прикладная библиотека, призванная помочь программисту 1С быстрее решать ряд типовых задач бизнес-логики, таких как: ведение статусов объектов, отправка почтовых сообщений в определенное время, ведение произвольных таблиц с возможностью редактирования, сохранения и группировки, ориентированные на расчет бюджетных таблиц (план продаж, ретробонусы B2C, проценты по договорам B2B и договорные условия по КАМ), расчет коммерческой политики для бюджетных таблиц, исполнение произвольных алгоритмов с хранением кода в информационной базе, определение рабочих баз, хранение файлов во внешних СУБД (Postgre SQL, MS SQL и MongoDB) и выполнение произвольного кода после изменений ссылочного объекта вне транзакции изменения.

1 стартмани

22.05.2017    31187    94    Silenser    34