1С Процедуры на разные случаи

На добрую память)

Функция для разбора текста

// Ищем пРазделитель в пВход и возвращаем то что слева от разделителя
// В пРазделитель оставляем то что с права от разделителя
Функция РазборСтроки(пВход, пРазделитель)
	Результат = "";
	Найдено = Найти(пВход, пРазделитель);
	
	Если Найдено = 0 тогда 
		Результат = пВход;
		пВход = "";
	Иначе
		Результат = Сред(пВход,1,Найдено-1);
		НачСимвол = Найдено + СтрДлина(пРазделитель);
		пВход = Сред(пВход,НачСимвол);
	КонецЕсли;
	
	Возврат Результат;
КонецФункции

Наверх

Поиск максимума и минимума в таблице значений

// Возвращает структуру с минимальное и максимальное значение в таблице значений
// Структура содержит поля Макс,Мин
// тзДанные - таблица значений
// ПолеМакс, ПолеМин - строка с именем максимального и минимального поля
// Если поле ПолеМакс неуказанно то минимум ищеться по ПолеМин
Функция МаксМинВТаблицеЗначений(тзДанные, ПолеМин, ПолеМакс = Неопределено)
	Результат = Новый Структура("Макс,Мин");

	ЗапросМакМин = Новый Запрос;
	ЗапросМакМин.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	ЗапросМакМин.Текст = "ВЫБРАТЬ
	                     |	РабТаблица._ПолеМакс КАК Макс,
	                     |	РабТаблица._ПолеМин КАК Мин
	                     |ПОМЕСТИТЬ РабочаяТаблица
	                     |ИЗ
	                     |	&РабТаблица КАК РабТаблица
	                     |;
	                     |
	                     |////////////////////////////////////////////////////////////////////////////////
	                     |ВЫБРАТЬ
	                     |	МАКСИМУМ(РабочаяТаблица.Макс) КАК Макс,
	                     |	МИНИМУМ(РабочаяТаблица.Мин) КАК Мин
	                     |ИЗ
	                     |	РабочаяТаблица КАК РабочаяТаблица
	                     |;
	                     |
	                     |////////////////////////////////////////////////////////////////////////////////
	                     |УНИЧТОЖИТЬ РабочаяТаблица";

	ЗапросМакМин.Текст = СтрЗаменить(ЗапросМакМин.Текст, "_ПолеМакс" , ПолеМакс);
	ЗапросМакМин.Текст = СтрЗаменить(ЗапросМакМин.Текст, "_ПолеМин" , ПолеМин);
	ЗапросМакМин.УстановитьПараметр("РабТаблица",  тзДанные);
	РезМаксМин = ЗапросМакМин.Выполнить().Выгрузить();

	Результат["Макс"]= РезМаксМин[0].Макс;
	Результат["Мин"] = РезМаксМин[0].Мин;

	Возврат Результат;
КонецФункции

Наверх

Объединение 2 таблиц значений

// Объединить 2 таблицы значения
// тзОсновная - таблица к которой будут изменяться данные
// тзПрисоединяемая - таблица из которой будут браться данные
// стОтборОдинаковых - стурктура со списком полей по которым определяеться одинаковость записи
// ДобавлятьНеНайденное  - ИСТИНА => не сущесвующие записи в тзОсновная будут браться из тзПрисоединяемая
Процедура ОбъединитьТаблицыЗначений(тзОсновная,тзПрисоединяемая, стОтборОдинаковых, ДобавлятьНеНайденное = Ложь) Экспорт
	Для каждого текПрисоединяемаяЗапись из тзПрисоединяемая цикл
		ЗаполнитьЗначенияСвойств(стОтборОдинаковых,текПрисоединяемаяЗапись);
		НайденыеСтроки = тзОсновная.НайтиСтроки(стОтборОдинаковых);
		Если НайденыеСтроки.Количество() > 0 тогда
			Для каждого текНайденная из НайденыеСтроки цикл
				ЗаполнитьЗначенияСвойств(текНайденная,текПрисоединяемаяЗапись);
			КонецЦикла;
		ИначеЕсли ДобавлятьНеНайденное тогда
			НовСтрокаОсновном = тзОсновная.Добавить();
			ЗаполнитьЗначенияСвойств(НовСтрокаОсновном,текПрисоединяемаяЗапись);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

Наверх

Сравнение 2-х структур

// Сравнение 2-х стурктур
// Возвращает структуру с полями которые отличаются и значением из сравниваемой
// Если в стСравнимое нет нужного поля,то в результат добавляется поля = Неопределенно
// стОсновная, стСравнимое  - сравниваемые структуры
// ДоПервойРазницы - ищет только одно отличие
Функция СравнитьСтруктуры(стОсновная, стСравнимое,ДоПервойРазницы = Ложь)  Экспорт
	Результат = Новый Структура;

	Для каждого текПоле из стОсновная цикл
		ЗначениеСравнение = ?(стСравнимое.Свойство(текПоле.Ключ), стСравнимое[текПоле.Ключ], Неопределено);
		Если текПоле.Значение  ЗначениеСравнение тогда
			Результат .Вставить(текПоле.Ключ,ЗначениеСравнение);
			Если ДоПервойРазницы тогда
				Прервать;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

	Возврат Результат;
КонецФункции

Наверх

Отслеживание изменений в документе

Была написана когда не мог понять почему документ при открытие сразу же становился в режиме «изменен».

// Вывод изменений в документе
// Вставить вызов процедуры в модуль объекта ПередЗаписью()
// Параметры:
// Ссылка - ссылка на документ
// ЭтотОбъект - объект в котором происходили изменения
Процедура ЧтоМенялиВДокументе(Ссылка, ЭтотОбъект) Экспорт
	Сообщить("==== " +  ТекущаяДата() +  " ====");
	Для Каждого Реквизит Из ЭтотОбъект.Метаданные().Реквизиты Цикл
		Если ЭтотОбъект[Реквизит.Имя]  Ссылка[Реквизит.Имя] Тогда
			Сообщить("Изменен реквезит: " + Реквизит.Имя);
			Сообщить(Символы.Таб + Ссылка[Реквизит.Имя]  + " => " + ЭтотОбъект[Реквизит.Имя]);
		КонецЕсли;
	КонецЦикла;

	Для Каждого Реквизит Из ЭтотОбъект.Метаданные().СтандартныеРеквизиты Цикл
		Если ЭтотОбъект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
			Сообщить("Изменен реквезит:" + Реквизит.Имя);
			Сообщить(Символы.Таб + Ссылка[Реквизит.Имя]  + " => " + ЭтотОбъект[Реквизит.Имя]);
		КонецЕсли;
	КонецЦикла;

	Для Каждого ТабличнаяЧасть Из ЭтотОбъект.Метаданные().ТабличныеЧасти Цикл
		ТабОбъекта = ЭтотОбъект[ТабличнаяЧасть.Имя];
		ТабСсылка = Ссылка[ТабличнаяЧасть.Имя];

		Если ТабОбъекта.Количество() <> ТабСсылка.Количество() тогда
			Сообщить("Изменена таблица (разное количество):" + ТабличнаяЧасть.Имя) ;
			Продолжить;
		КонецЕсли;

		Для НомерЗаписи = 0 по ТабОбъекта.Количество()-1 цикл
			стрОбъекта = ТабОбъекта[НомерЗаписи];
			стрСсылка = ТабСсылка[НомерЗаписи];

			Для каждого ПолеТаблицы из ТабличнаяЧасть.Реквизиты цикл
				Если стрОбъекта[ПолеТаблицы.Имя] <>  стрСсылка[ПолеТаблицы.Имя] тогда
					Сообщить("Изменена таблица:"  + ТабличнаяЧасть.Имя + " ;Строка:" + НомерЗаписи + " ;Атрибу:" + ПолеТаблицы.Имя);
					Сообщить(Символы.Таб + стрСсылка[ПолеТаблицы.Имя]  + " => " + стрОбъекта[ПолеТаблицы.Имя]);
				КонецЕсли;
			КонецЦикла; // По поляем табличной части
		КонецЦикла;	// По записям
	КонецЦикла; // По табличным частям
КонецПроцедуры

Наверх

Упрощенное сравнение переменной через ВидСравнения

// Функция проверки значения
// Проверяемое - значение которое проверяем
// ТипСравнения - значение типа ВидСравнения
// Сравниваемое - значение с которым сравниваем
Функция СоответствиеОтбора(Проверяемое, ТипСравнения, Сравниваемое)
	Результат = Истина;

	Если ТипСравнения = ВидСравнения.Равно тогда
		Результат = (Проверяемое = Сравниваемое);
	ИначеЕсли ТипСравнения = ВидСравнения.НеРавно тогда
		Результат = (Проверяемое <> Сравниваемое);
	ИначеЕсли ТипСравнения = ВидСравнения.БольшеИлиРавно тогда
	    Результат = Проверяемое  >= Сравниваемое;
	ИначеЕсли ТипСравнения = ВидСравнения.Больше тогда
	    Результат = Проверяемое  > Сравниваемое;
	ИначеЕсли ТипСравнения = ВидСравнения.Меньше тогда
	    Результат = Проверяемое  < Сравниваемое;
	ИначеЕсли ТипСравнения = ВидСравнения.ВСписке тогда
	    Результат = (Сравниваемое.НайтиПоЗначению(Проверяемое) <> Неопределено);
	ИначеЕсли ТипСравнения = ВидСравнения.НеВСписке тогда
	    Результат = (Сравниваемое.НайтиПоЗначению(Проверяемое) = Неопределено);
	ИначеЕсли ТипСравнения = ВидСравнения.Содержит тогда
	    Результат = Найти(Сравниваемое,Проверяемое) > 0;
	ИначеЕсли ТипСравнения = ВидСравнения.НеСодержит тогда
	    Результат = Найти(Сравниваемое,Проверяемое) = 0;
	КонецЕсли;

	Возврат Результат;
КонецФункции

Наверх

Быстрый способ вывести резульатат запроса в табличный документ

Можно результат запроса, а можно и таблицу значений.

ТекстЗапроса = "ВЫБРАТЬ * ИЗ Справочник.Пользователи";						   
ЗапросаДанных = Новый Запрос(ТекстЗапроса);
РезЗапроса = ЗапросаДанных.Выполнить();
	
ТабДокумент = Новый ТабличныйДокумент;
Построитель	= Новый ПостроительОтчета;
Построитель.ИсточникДанных=Новый ОписаниеИсточникаДанных(РезЗапроса);		
Построитель.Вывести(ТабДокумент);
ТабДокумент.Показать("Пользователи");	

Наверх

1С Процедуры на разные случаи: 2 комментария

  1. Аноним

    Абсолютно бесполезная информация без примеров, вот допустим
    Процедура ОбъединитьТаблицыЗначений(тзОсновная,тзПрисоединяемая, стОтборОдинаковых, ДобавлятьНеНайденное = Ложь) Экспорт
    с ТЗ понятно а как допустим в эту структуру стОтборОдинаковых передать нужные колонки, про это ни слова

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *