Архив метки: 1с

Определение длины строки в запросе 1С

Как извесно боль запросов 1С, в невозможности «штатно» определить длину строки в запросе. Вот один из обходных «велосипедов»:

&НаСервере
Процедура ПроанализироватьНаСервере(имя)	
		
	
	ТекстДерево = Дерево("ацукацукацук.Поле_1_1", -1, 300); 
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|    " + ТекстДерево + " КАК Длина
		|ИЗ
		|	РегистрСведений.ацукацукацук КАК ацукацукацук
		|УПОРЯДОЧИТЬ ПО
    	|    Длина УБЫВ";
		
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		сообщить(ВыборкаДетальныеЗаписи.Длина);
	КонецЦикла;	


КонецПроцедуры

&НаСервере
Функция Дерево(Реквизит, Начало, Конец) Экспорт
    Если Начало + 1 = Конец Тогда
        Возврат Строка(Конец);
    КонецЕсли;
    Середина = Начало + Цел((Конец - Начало) / 2);
    СтрокаДерево = "ВЫБОР КОГДА ПОДСТРОКА(" + Реквизит + ", " + (Середина + 1) + ", 3) = """" ТОГДА " 
        + Дерево(Реквизит, Начало, Середина) + " ИНАЧЕ " + Дерево(Реквизит, Середина, Конец) + " КОНЕЦ";
    Возврат СтрокаДерево;
КонецФункции

1С: Выделение цветом ячеек в таблице значений на форме

Задача: раскрасить ячейки в ТЗ на форме в зависимости от условий.

Решение: будем использовать условное оформление, которое назначается перед выводом формы на экран. Например в процедуре «ПриСозданииНаСервере»

	ЭлементОформления = УсловноеОформление.Элементы.Добавить();	 
	Оформление  = УсловноеОформление.Элементы.Добавить();
 	Оформление.Использование = Истина;
	 Поле1 = Оформление.Поля.Элементы.Добавить();
	 Поле1.Поле = Новый ПолеКомпоновкиДанных("тчСумма");
	 Отбор = Оформление.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	 Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.тч.СуммаПениНачисленная");
	 Отбор.ПравоеЗначение = 0;
	 Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
	 Отбор.Использование = Истина;
	 Оформление.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Аквамарин);

1C: Правильное удаление элементов из таблицы значений

Некоторые пытаются сделать так:

			 для каждого стр из док.Начисления цикл
			     если стр.ВидНачисления=справочники.vscВидыНачислений.НайтиПоКоду("000000048") и стр.ТипРасчета<>перечисления.vscТипРасчетаКомУслуг.ПерерасчетПредыдущихПериодов тогда
			    	  док.Начисления.удалить(стр);
			    	  продолжить;
			     конецесли;	 
			     если стр.ВидНачисления=справочники.vscВидыНачислений.НайтиПоКоду("000000058") и стр.ТипРасчета<>перечисления.vscТипРасчетаКомУслуг.ПерерасчетПредыдущихПериодов тогда
			    	 	док.Начисления.удалить(стр);
			    		продолжить;
			     конецесли;	 
			     если стр.ВидНачисления=справочники.vscВидыНачислений.НайтиПоКоду("000010010") и стр.ТипРасчета<>перечисления.vscТипРасчетаКомУслуг.ПерерасчетПредыдущихПериодов тогда
			    	 	док.Начисления.удалить(стр);
			    		продолжить;
			     конецесли;	 				 
			 конеццикла;

Т.е. перебирают всю таблицу и по условию удаляют это строчку. И это совершенноне верно! При таком удалении, если строчки которые нужно удалить идут «вподряд», идет «перескок» и строка не удаляется. Правильно удалять с отборами:

			    СтруктураОтбора = Новый Структура();
				СтруктураОтбора.Вставить("ВидНачисления", справочники.vscВидыНачислений.НайтиПоКоду("000000048"));
				СтруктураОтбора.Вставить("ТипРасчета", перечисления.vscТипРасчетаКомУслуг.НачислениеЗаРасчетныйПериод);
			 	МассивСтрок = док.Начисления.НайтиСтроки(СтруктураОтбора);
				Для Каждого ЭлементМассив Из МассивСтрок Цикл
					док.Начисления.Удалить(ЭлементМассив); //удаляем строки
				КонецЦикла; 
			    СтруктураОтбора = Новый Структура();
				СтруктураОтбора.Вставить("ВидНачисления", справочники.vscВидыНачислений.НайтиПоКоду("000000058"));
				СтруктураОтбора.Вставить("ТипРасчета", перечисления.vscТипРасчетаКомУслуг.НачислениеЗаРасчетныйПериод);
			 	МассивСтрок = док.Начисления.НайтиСтроки(СтруктураОтбора);
				Для Каждого ЭлементМассив Из МассивСтрок Цикл
					док.Начисления.Удалить(ЭлементМассив); //удаляем строки
				КонецЦикла; 
			    СтруктураОтбора = Новый Структура();
				СтруктураОтбора.Вставить("ВидНачисления", справочники.vscВидыНачислений.НайтиПоКоду("000010010"));
				СтруктураОтбора.Вставить("ТипРасчета", перечисления.vscТипРасчетаКомУслуг.НачислениеЗаРасчетныйПериод);
			 	МассивСтрок = док.Начисления.НайтиСтроки(СтруктураОтбора);
				Для Каждого ЭлементМассив Из МассивСтрок Цикл
					док.Начисления.Удалить(ЭлементМассив); //удаляем строки
				КонецЦикла;

Пусть более громоздко, но зато работает верно. Можно еще покопать в строну использования «И и ИЛИ» в отборах. Будет короче.  Не стал

Регистр не попадает в меню перейти

А именно вот сюда, после добавления нового регистратора у документа:

Возможно кому-то сэкономит минуту времени. Это глюк платформы 1С, как минимум 8.3.16.1502 и ниже. Достаточно выйти из конфигуратора и зайти снова, и регистр появится.

Полезности при работе в конфигураторе 1С

Не все о них знают, работая в конфигураторе много лет. Сам о них узнал совсем недавно 😉

  1. Закладки.  Они есть. По горячим клавишам Alt-F2 установить и F2 — ходить по ним. Не очень конечно удобно, но хотяб так..
  2. В «штатной» настройке конфигуратор группирует только процедуры — функции. И я несколько лет думал что «вот убогий конфигуратор». Ан нет, просто я не потыкал настройки: