1С: таблица значений на форме

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

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

&НаКлиенте
Процедура СкрытьКолонку(Команда)
      ТЭ_имя_объект=ТекущийЭлемент.Имя;
      ТЭ_поле=ТекущийЭлемент.ТекущийЭлемент.имя;
      имяКолонки=СтрЗаменить( ТЭ_поле,ТЭ_имя_объект,"");	  
	  элементы[ТЭ_поле].Видимость=Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьВсеКолонки(Команда)
      ТЭ_имя_объект=ТекущийЭлемент.Имя;
      ТЭ_поле=ТекущийЭлемент.ТекущийЭлемент.имя;
      имяКолонки=СтрЗаменить( ТЭ_поле,ТЭ_имя_объект,"");
	  для каждого стр из элементы[ТЭ_имя_объект].ПодчиненныеЭлементы цикл
		  стр.Видимость=Истина;
	  конеццикла;	  
КонецПроцедуры

Функционал можно например навесить на контекстное меню

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

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

  • добавляем команды СортироватьПоКолонкеВозр и СортироватьПоКолонкеУбыв
  • добавляем их в контекстное меню
  • Код команды может быть такой:
&НаКлиенте
Процедура СортироватьПоКолонке(Команда)
      ТЭ_имя_объект=ТекущийЭлемент.Имя;
      ТЭ_поле=ТекущийЭлемент.ТекущийЭлемент.имя;
      имяКолонки=СтрЗаменить( ТЭ_поле,ТЭ_имя_объект,"");
      если команда.имя="СортироватьПоКолонкеУбыв" тогда
           СортироватьНасервере(ТЭ_имя_объект,имяКолонки,"Убыв");
	  конецесли;		   
      если команда.имя="СортироватьПоКолонкеВозр" тогда
          СортироватьНасервере(ТЭ_имя_объект,имяКолонки,"Возр");
	конецесли;
КонецПроцедуры

&НаСервере
Процедура сортироватьНасервере(имяОбъекта,имяКолонки,ВидСортировки)
    тз= РеквизитФормыВЗначение("БуферТЗ");
    тз.Сортировать(имяКолонки+" "+ВидСортировки);
    ЗначениеВРеквизитФормы(ТЗ,"БуферТЗ");
конецпроцедуры

В результате получаем что-то подобное:

1С: Шпаргалка по работе с таблицей значений

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

Определение типа колонок:


// Ссылочные типы
ТЗ_ДанныеПоСотрудникам.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));  
ТЗ_ДанныеПоСотрудникам.Колонки.Добавить("СчетФактура", Новый ОписаниеТипов("ДокументСсылка.СчетФактураВыданный"));
ТЗ_ДанныеПоСотрудникам.Колонки.Добавить("ТипКонтактнойИнформации", Новый ОписаниеТипов("ПеречислениеСсылка.ТипыКонтактнойИнформации"));  
 
// Простые типы
ТЗ_ДанныеПоСотрудникам.Колонки.Добавить("ДолжностьНаименование", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(150))); 
ТЗ_ДанныеПоСотрудникам.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число",, Новый КвалификаторыЧисла(10,2)));
ТЗ_ДанныеПоСотрудникам.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата",, Новый КвалификаторыДаты(ЧастиДаты.Дата)));
ТЗ_ДанныеПоСотрудникам.Колонки.Добавить("ЕстьОповещение", Новый ОписаниеТипов("Булево"));   
ТЗ_ДанныеПоСотрудникам.Колонки.Добавить("ИменаПолейСубконто", Новый ОписаниеТипов("Массив"));  

//Составное
МассивТипов = Новый Массив();
МассивТипов.Добавить(Тип("Булево"));
МассивТипов.Добавить(Тип("ПеречислениеСсылка.ВидыПродукцииИС"));	
ТЗ_ДанныеПоСотрудникам.Колонки.Добавить("МаркировкаОстатков", Новый ОписаниеТипов(МассивТипов));
     

Удаление строк:

// 1. Обходом строк
МассивКУдалению = Новый Массив;
Для Каждого ТекущаяСтрока Из ТЗ Цикл	
	Если ТекущаяСтрока.Удалить Тогда
		МассивКУдалению.Добавить(ТекущаяСтрока);
	КонецЕсли;	
КонецЦикла;
Для Каждого ТекущаяСтрока Из МассивКУдалению Цикл
	ТЗ.Удалить(ТекущаяСтрока);
КонецЦикла;
 
// 2. Найденные по отбору
НайденныеСтроки = ТЗ.НайтиСтроки(Новый Структура("Удалить", Истина));
Для Каждого ТекущаяСтрока Из НайденныеСтроки Цикл	
	ТЗ.Удалить(ТекущаяСтрока);	
КонецЦикла;
 
// 3. Выгрузка с отбором
НоваяТЗ = ТЗ.Скопировать(Новый Структура("Удалить", Ложь));

Сортировка:

ТЗДат.Сортировать("Дата Возр");

1с: Еще раз о сортировке массива структур

Уже не однократно поднимал в своём блоге вопрос о методе сортировки массива структур по какому то ключу. В конце концов остановился на самом медленном, но зато самом менее трудоёмком методе. Для нескольких тысяч записей пойдет. Для нескольких десятков тысяч записей уже нет, ибо памяти не хватит. Общая методика такова:

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

       НоваяСтрока = ТЗ.Добавить();
       Для Каждого ЭлементМассива Из СтрокаМассива Цикл
           НоваяСтрока[ЭлементМассива.Ключ] = ЭлементМассива.Значение;
       КонецЦикла;
   КонецЦикла;
   Возврат ТЗ;
КонецФункции

Использование:

ТЗ_ЛС=ПреобразованиеМассивВТаблицуЗначений(список_лс.result.responseObject);
ТЗ_ЛС.Сортировать("room Возр");
...
для каждого стр из ТЗ_ЛС цикл
....
конеццикла

1С: Преобразование данных в JSON. Вся боль и печаль.

К сожалению 1С не умеет преобразовывать абсолютно любые данные в формат JSON. Есть некоторые ограничения. Из тех которые мне попались: не умеет преобразовывать NULL, не умеет преобразовывать таблицы значений.

Как обхожу проблему NULL в запросах:

Как преобразовываю Таблицу Значений:

Вариант 1:

Вариант 2 (по сути «ручной» вариант первого варианта):