Динамическая таблица значений на форме

Часто возникают ситуации, что необходимо отобразить данные на форме в виде таблицы (динамическая таблица значений на форме). Классический метод — добавить к документу (справочнику и т.п.) табличную часть — объект. Но из этого возникает значительный минус — при записи данные будут храниться в БД. А если это не нужно, и данные должны подтягиваться динамически из других таблиц? Выход есть — создать таблицу не как объект, а как переменную формы. В этом случае данные в БД сохраняться не будут. Что для этого нужно?

Создать реквизит с типом «Таблица значений»:

динамическая таблица значений на форме

Затем добавить колонки реквизита, указывая для них необходимый тип:

Далее, перетащите получившуюся таблицу на форму:

И остаётся только при событии формы «При создании на сервере», заполнить эту таблицу:

ТЗДвижения.Очистить();
 
 НомерИП=СокрЛП(объект.НомерИП);
 ТЗ=Новый ТаблицаЗначений();
 ТЗ.Колонки.Добавить("Дата");
 ТЗ.Колонки.Добавить("ИсточникДанных");
 ТЗ.Колонки.Добавить("ВидДанных");
 ТЗ.Колонки.Добавить("Комментарий");
 ТЗ.Колонки.Добавить("СсылкаНаДокумент");
...
заполняем таблицу
...
 ТЗ.Сортировать("Дата УБЫВ"); 
 ТЗДвижения.Загрузить(ТЗ);

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

Кнопка выбора периода

Довольно редко использую, потому забываю постоянно, вот сделал себе очередную шпаргалку, как делается кнопка выбора периода в 1с на управляемых формах. Итак, первым делом создайте реквизит формы, с типом «стандартный период»:

кнопка выбора периода

Далее, перетаскиваем этот реквизит на форму, и добавляю обычные реквизиты с типом Дата+Время:

Осталось всего ничего — добавить обработчик события «при изменении»:


&НаКлиенте
Процедура ВыборПериодаПриИзменении(Элемент)
	НачПериода = ВыборПериода.ДатаНачала;
	КонПериода = ВыборПериода.ДатаОкончания;
	
	Сообщить("Начало: " + НачПериода + ", окончание: " + КонПериода);
КонецПроцедуры

На этом задача «кнопка выбора периода» будем считать завершена. Еще больше всяких шпаргалок по 1С, легко найдется здесь.

Сколько дней в году

Иногда возникает задача, как определить сколько дней в году на языке 1С. Их есть у нас (с), ну я имею ввиду решение.. Странно конечно, что в 1С нет готовой функции, приходится напрягать мозжечок (ну или гугл/яндекс) и велосипедить. Ну на самом деле есть несколько вариантов, Например первый вариант:

Функция ДнейВЭтомГоду()
 Дата = ТекущаяДата();
 ДнейВГоду = ДеньГода(КонецГода(Дата));
 возврат ДнейВГоду;
конецфункции

Основан на функциях 1С которые позволяют определить порядковый номер дня по переданной дате. Т.е. передаём в неё последний день текущего года, и получаем или 365 или 366, в зависимости от високосности года.

Есть другой вариант того-же решения:

Функция ДнейВЭтомГоду()
 Попытка
   А = Дата(Год(ТекущаяДата()),2,29);
   Возврат 366;
 Исключение
   Возврат 365;
 КонецПопытки;
КонецФункции 

,проверяем наличие 29 Февраля в этом году. Если возникает исключение, значит в этом году 365 дней, иначе — 366.

Есть еще вариант с делением года на 4. Если он делится без остатка, то год високосный. Но там есть исключения для некоторых годов. Ну и самый тупой 😉 способ определить сколько дней в году:

Сколько дней в году

1С: Поиск слова обрамлённого символами

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

Контролер процесса {Коновалова Е.П.} очень хочет получить премию в размере (20 рублей)!

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


Функция СложитьМассивы(массив1,массив2) экспорт
	для каждого эл из массив2 цикл
		массив1.добавить(эл);
	конеццикла;	
	возврат массив1;
конецфункции	
              
             
Функция ВычленитьМассивФИОИзСкобок(стр,стрн,стрк) экспорт
	 МассивФИО=Новый Массив();
	 // сначала вычленяем из ()
	 массивКонцовСкобки=СтрРазделить(стр,стрк);
	 для каждого эл из массивКонцовСкобки цикл
		если СтрНайти(эл,стрн)>0 тогда
			МассивНачалСкобки=СтрРазделить(эл,стрн);	 		
			если СокрЛП(МассивНачалСкобки[1])<>"" тогда
				МассивФИО.Добавить(СокрЛП(МассивНачалСкобки[1]));		
			конецесли;
		конецесли;
	конеццикла;	 	
	возврат МассивФИО; 
конецфункции	

				контролеры=ВычленитьМассивФИОИзСкобок(body.message,"(",")");
				контролеры=СложитьМассивы(контролеры,ВычленитьМассивФИОИзСкобок(body.message,"{","}"));
				контролеры=СложитьМассивы(контролеры,ВычленитьМассивФИОИзСкобок(body.message,"<",">"));
				контролеры=СложитьМассивы(контролеры,ВычленитьМассивФИОИзСкобок(body.message,"[","]"));

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

1С: поиск слова обрамлённого символами

Задача: поместить в переменную содержимое строки обрамленной скобками. Т.е. например Есть строка вида:

начальная_строка="Это строка {пример} того что нужно сделать";

Нужно положить в переменную строчку содержащуюся внутри скобок. Решение:

&НаСервере
Функция ПолучитьПеременнуюИзСтроки(ПереданнаяСтрока,Откр,Закр) Экспорт
	Переменная = "";
	ПервыйСимвол = Найти(ПереданнаяСтрока,Откр);
	Если  ПервыйСимвол > 0 Тогда
		ВторойСимвол = Найти(ПереданнаяСтрока,Закр);
		Если  (ВторойСимвол > 0) И (ВторойСимвол > ПервыйСимвол) Тогда
			Переменная = (Сред(ПереданнаяСтрока,ПервыйСимвол+1,ВторойСимвол-ПервыйСимвол-1));
		КонецЕсли;	
		
	КонецЕсли;	
	Возврат Переменная;	
КонецФункции  

&НаСервере
Процедура ТрямНаСервере()
	сооб="Контролер процесса {Коновалова Е.П.} очень хочет получить премию!";
	контролер=ПолучитьПеременнуюИзСтроки(сооб,"{","}");
КонецПроцедуры
1 7 8 9 10 11 37