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

29.03.21

Разработка - Работа с интерфейсом

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

 

Это всего лишь небольшой пример, как можно реализовать дружелюбный интерфейс пометки.

На форме надо разместить:

  1. Команды: "Таблица_Отмена" и "Таблица_Пометить", соответственно командам надо назначить действие: "Таблица_Отмена" и "Таблица_Пометить".
  2. Разместить кнопки на форме.

*Описывать этот процесс не стал, это вы и сами должны уметь делать.

 

Пример кода.


#Область Пометка

&НаКлиенте
Функция ПолучитьНомерСтроки_Клиент(ЭлементТаблицы)
	
	ТекущиеДанные = ЭлементТаблицы.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда Возврат Неопределено; КонецЕсли;
	
	Возврат ТекущиеДанные.НомерСтроки;
	
КонецФункции

&НаСервере
Функция ЗначениеРеквизита(ЭтаФорма,ИмяОбъектТаблицы)
	Перем ИмяПоля, МассивПолей;
	
	МассивПолей = СтрРазделить(ИмяОбъектТаблицы,".",Ложь);
	Если МассивПолей.Количество() = 0 Тогда
		Возврат Неопределено
	ИначеЕсли МассивПолей.Количество() = 1 Тогда
		ИмяПоля = МассивПолей[0];
		РезФункц = ЭтаФорма[ИмяПоля];
		Возврат РезФункц; 
	КонецЕсли;
	
	РезФункц = Неопределено;
	Для Каждого ИмяПоля Из МассивПолей Цикл 
		Если РезФункц = Неопределено Тогда 
			РезФункц = ЭтаФорма[ИмяПоля];
		Иначе 
			РезФункц = РезФункц[ИмяПоля];
		КонецЕсли;
	КонецЦикла;
	
	Возврат РезФункц;
КонецФункции

//&НаСервере
// Устарело
//Процедура Выбор_Пометить_Сервер(Выбор, ИмяОбъектТаблицы, ИмяКолонки);
//	
//	ТаблОбъект = ЗначениеРеквизита(ЭтаФорма,ИмяОбъектТаблицы);
//	Если ТаблОбъект = Неопределено Тогда Возврат; КонецЕсли;
//	
//	ТЗ_Строк = ТаблОбъект.Выгрузить();
//	ТЗ_Строк.ЗаполнитьЗначения(Выбор, ИмяКолонки);
//	ТаблОбъект.Загрузить(ТЗ_Строк);
//	
//КонецПроцедуры

&НаКлиенте
Процедура ПерейтиПоНомеруСтроки_Клиент(ТекНомерСтроки, ОбъектТаблицы,ЭлементТаблицы)
	
	Если ТекНомерСтроки = Неопределено или ОбъектТаблицы.Количество() < (ТекНомерСтроки) Тогда 
		Возврат; 
	КонецЕсли;
	
	СтрокаТаблицы = ОбъектТаблицы[ТекНомерСтроки-1];
	ИДСтроки = СтрокаТаблицы.ПолучитьИдентификатор();
	ЭлементТаблицы.ТекущаяСтрока = ИДСтроки;
	
КонецПроцедуры

&НаКлиенте
Процедура Выбор_Пометить_Клиент(МассВыдСтр, Выбор, ОбъектТаблицы,ЭлементТаблицы, ИмяКолонки);
	
	Если МассВыдСтр = Неопределено Тогда 
		Для Каждого СтрокаТаблицы Из ОбъектТаблицы Цикл
			Если НЕ ЭлементТаблицы.ПроверитьСтроку(СтрокаТаблицы.ПолучитьИдентификатор()) Тогда
				Продолжить;
			КонецЕсли;
			
			Если СтрокаТаблицы[ИмяКолонки] <> Выбор Тогда
				СтрокаТаблицы[ИмяКолонки] = Выбор;
			КонецЕсли;
		КонецЦикла;
		
	Иначе 
		Для Каждого Идентификатор Из МассВыдСтр Цикл
			СтрокаТаблицы = ОбъектТаблицы.НайтиПоИдентификатору(Идентификатор);
			Если СтрокаТаблицы <> Неопределено 
				И СтрокаТаблицы[ИмяКолонки] <> Выбор Тогда
				СтрокаТаблицы[ИмяКолонки] = Выбор;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Функция ЕстьНомерСтрокиТаблицы(ИмяОбъектТаблицы)
	Если Найти(ИмяОбъектТаблицы,".") > 0 Тогда
		Возврат Истина;
	Иначе 
		Возврат Ложь;
	КонецЕсли;
КонецФункции

&НаКлиенте
Процедура Таблица_ПометитьОтменить(Пометка, ЭлементТаблицы,ОбъектТаблицы,ИмяОбъектТаблицы,ИмяРеквизита)
	
    //Определим, есть ли у таблицы предопределенная колонка "НомерСтроки"
	ЕстьНомерСтрокиТаблицы = ЕстьНомерСтрокиТаблицы(ИмяОбъектТаблицы);
	
	МассВыдСтр = ЭлементТаблицы.ВыделенныеСтроки;
	Если МассВыдСтр = Неопределено или МассВыдСтр.Количество() <= 1 Тогда
        //Если выбрана одна строка или нечего не выбран, то всегда обрабатываем все строки
		Если ЕстьНомерСтрокиТаблицы = Истина Тогда 
            //Если есть "Номер строки", то можно обработать и на сервере
			ТекНомерСтроки = ПолучитьНомерСтроки_Клиент(ЭлементТаблицы);
			Выбор_Пометить_Клиент(Неопределено, Пометка, ОбъектТаблицы,ЭлементТаблицы, ИмяРеквизита);
			ПерейтиПоНомеруСтроки_Клиент(ТекНомерСтроки, ОбъектТаблицы,ЭлементТаблицы);
		Иначе 
			Выбор_Пометить_Клиент(Неопределено, Пометка, ОбъектТаблицы,ЭлементТаблицы, ИмяРеквизита);
		КонецЕсли;
	Иначе 
		Выбор_Пометить_Клиент(МассВыдСтр, Пометка, ОбъектТаблицы,ЭлементТаблицы, ИмяРеквизита);
	КонецЕсли;
	
КонецПроцедуры

//Обработка кнопки - "Пометка"
&НаКлиенте
Процедура Таблица_Пометить(Команда)
	
	ЭлементТаблицы = Элементы.ТаблицаРазделов; //Элемент на форме (ТЗ или Табличная часть)
	ОбъектТаблицы = ЭтаФорма.ТаблицаРазделов;  //Указывается Объект(если это документ, справочник: "Объект.Товары") или Реквизит (Если это реквизит формы: "ЭтаФорма.РеквизитТаблица")
	ИмяОбъектТаблицы = "ТаблицаРазделов";      //Имя, для объектов "Объект.Товары" (для табличной части обработки, документа и справочника), или "РеквизитТаблица" (для реквизита формы)
	ИмяРеквизита = "Выборка";                  //Имя колонки "табличной части" (ТЗ)
	
	Таблица_ПометитьОтменить(Истина, ЭлементТаблицы,ОбъектТаблицы,ИмяОбъектТаблицы,ИмяРеквизита);
	
КонецПроцедуры

//Обработка кнопки - "Отмена пометки"
&НаКлиенте
Процедура Таблица_Отмена(Команда)
	
	ЭлементТаблицы = Элементы.ТаблицаРазделов; //Элемент на форме (ТЗ или Табличная часть)
	ОбъектТаблицы = ЭтаФорма.ТаблицаРазделов;  //Указывается Объект(если это документ, справочник: "Объект.Товары") или Реквизит (Если это реквизит формы: "ЭтаФорма.РеквизитТаблица")
	ИмяОбъектТаблицы = "ТаблицаРазделов";      //Имя, для объектов "Объект.Товары" (для табличной части обработки, документа и справочника), или "РеквизитТаблица" (для реквизита формы)
	ИмяРеквизита = "Выборка";                  //Имя колонки "табличной части" (ТЗ)
	
	Таблица_ПометитьОтменить(Ложь, ЭлементТаблицы,ОбъектТаблицы,ИмяОбъектТаблицы,ИмяРеквизита);
	
КонецПроцедуры

#КонецОбласти

Код протестирован на версии платформы: 1С:Предприятие 8.3 (8.3.15.1830)

Дружелюбный интерфейс пометки и отмены в диалоге табличный полей для Управляемых форм УФ

См. также

Управление дашбордами

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    17088    23    4    

37

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    11529    769    elcoan    46    

107

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

10.04.2023    10112    156    acces969    31    

119

Модель состояния для MVC

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    4112    kalyaka    4    

31

Условное оформление элементов форм в пользовательском режиме 1С (управление видимостью и доступностью элементов форм)

Работа с интерфейсом Платформа 1С v8.3 Платные (руб)

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

6000 руб.

18.01.2022    9058    1    2    

6

Программный интерфейс для доработки форм

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

25.11.2021    9885    AtamanovYS    19    

139
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user1032621 14.08.20 10:03 Сейчас в теме
Всем привет! Давно слежу за этим талантливым программистом, все его разработки во истину уникальны, код оригинален и свеж, нахожу много нового, спасибо гуру 1с.
AnryMc; Yashazz; Sla; Evg-Lylyk; jONES1979; +5 Ответить
2. DrZombi 293 14.08.20 10:14 Сейчас в теме
(1) Спасибо... Незнакомец, мне так лестно читать такой чудесный отзыв.

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

...
Ну и для людей полезно, вдруг что углядят себе полезное... Люди, пользуйтесь.
3. ivanov660 4362 17.08.20 17:25 Сейчас в теме
(2) Написать комментарии в коде хотя бы для приличия. Получилось не особо оно дружественно к программисту.
Иногда еще бывает полезно привести более подробный пример использования.
Мне не понравилось.
4. DrZombi 293 18.08.20 00:03 Сейчас в теме
(3)Постарась учесть ваши пожелания 😁
ivanov660; +1 Ответить
5. Yashazz 4735 18.08.20 14:18 Сейчас в теме
Докатились. Уже такое в тренде. Вообще ниже плинтуса.
Не говоря уж о совершенно уродливом подходе - тащить всё на сервер с контекстом ради пометки в табличном поле. Всё это спокойно решается на клиенте. Да и вообще это из серии "как вывести сообщение пользователю", прямо удивительные высоты продемонстрированы...

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

А если подобные азы "лениво вспоминать", то просто, видимо, практики маловато. Это пишется за пару минут на полном автоматизме.

Автор, вы б для разнообразия хоть чуток посложней задачку бы взяли. Например, отметку в дереве с включением и выключением флажков во вложенных ветках. Хотя б приличнее смотрелось бы, чем эта детская песочница.
Brawler; XSlava; e.kogan; +3 2 Ответить
8. DrZombi 293 18.08.20 17:18 Сейчас в теме
(5) Хвастаться не хорошо.
6. Yashazz 4735 18.08.20 14:57 Сейчас в теме
Вообще, за одно только "ТаблОбъект.Выгрузить();" эту, простихосспади, "публикацию", уже надо люто заминусить.
Brawler; XSlava; +2 Ответить
7. DrZombi 293 18.08.20 17:17 Сейчас в теме
(6) Все в ваших руках, Взялись и выпилили у себя Выгрузить... Наслаждайтесь циклом :)
9. Yashazz 4735 18.08.20 18:16 Сейчас в теме
(7) А вы, мил-человек, вообще представляете, какая будет нагрузка на сеть, кэш и сервер приложения, если ради такой ерунды неслабые объёмы гонять туда-сюда? Вы считаете нормальным такое выкладывать и рекомендовать к использованию? Ну-ну) На уровне автоматизации ларька оно прокатит, на промышленном - ни разу.

И, чисто так к вашему сведению, в таблице значений "ЗаполнитьЗначения" реализована по сути тем же самым циклом.
10. DrZombi 293 19.08.20 06:42 Сейчас в теме
(9) Успокоиться не можешь.
Никакой нагрузки не будет.
Люди не работают с миллонном строк.
Вашему боту ненужны мои галочки.

П.с. и сударь поймите сперва для чего этот код размещен ..
11. Yashazz 4735 19.08.20 08:10 Сейчас в теме
(10)
Никакой нагрузки не будет.

О да, великий гуру, вам виднее за все случаи жизни)
...у меня больше нет вопросов. Мне же больше заработка, потом после всяких горе-разработчиков оптимизацию делать) Не впервые)
13. Brawler 455 23.09.20 00:28 Сейчас в теме
(11) да автор сей публикации видимо не в курсе как даже мелкие объемы данных могут сожрать производительноть системы, тем более если это будет типа универсальный алгоритм и будет он везде юзаться по всей конфигурации, а это значит это будут и 10 строк и тысячи, а еще это помножить на две сотни+ юзеров...

Помнится приходилось фирму 1С учить уму разуму, при расчете автоматических скидок в тех же заказах клиентов 1С ERP, где для того чтобы получить пустую таблицу значений с колонками 1С делали "Выгрузить" всей табличной части и потом делали вызов "СкопироватьКолонки", ну посоветовал им хотя бы так делать "Выгрузить(Новый Массив)" (то есть получить таблицу без строк, так как массив строк пуст), а уже потом "СкопироватьКолонки"))) деталей не помню, но суть была такова, что в документах реализации тоже идет расчет скидок, а заказов в одной реализации была туча, и просадка была по производительности ой как значительна)))

ну про косяк с теми же автоскидками, где в документе реализации получалось свыше 99999 строк в таблице скидок я помолчу))) там супер сложная зависимость была, тоже ловил причину ошибки, описывал её, отписывался в суппорт, исправили
12. DrZombi 293 19.08.20 08:46 Сейчас в теме
Данный кусочек кода не для всех видов наборов данных, а для организации Дружественного интерфейса.
Не надо в нем видеть абсолютное, Абсолютное вы должны достигать не по средством копирования кода, а приходить к этому самостоятельно, улучшая свой код.
14. DrZombi 293 23.09.20 06:17 Сейчас в теме
(13) Автор вкурси для чего ему тут это размещать, прочти в (12)
15. AnryMc 849 12.04.21 17:13 Сейчас в теме
ТаблицаФормы (FormTable)
ПроверитьСтроку (CheckRow)
Синтаксис:
ПроверитьСтроку(<Строка>)
Параметры:
<Строка> (обязательный)
Тип: Произвольный.
Строка таблицы. Тип параметра зависит от типа редактируемого значения.
Возвращаемое значение:
Тип: Булево.
Описание:
Проверяет, соответствует ли строка, установленному в таблице отбору.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент, мобильное приложение (клиент).
Показать


&НаКлиенте
Процедура ОбработатьСтрокиТаблицы()
    
    Для Каждого СтрокаТаблицыФормы Из ТаблицаФормы Цикл
        ИдентификаторСтроки= СтрокаТаблицыФормы.ПолучитьИдентификатор();
        Если Элементы.ТаблицаФормы.ПроверитьСтроку(ИдентификаторСтроки) Тогда
            СтрокаТаблицыФормы["ЧекБокс"] = Истина;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры
Показать



З.Ы. "Что тут думать! Трясти надо!" ©
16. DrZombi 293 12.07.23 22:26 Сейчас в теме
Оставьте свое сообщение