"Хочу универсально!" [Часть 1]

02.09.19

Разработка - Универсальные функции

Сентябрьская серия статей про то, как начинающий разработчик Вася проходит путь от простой задачки к созданию своего механизма. На этот раз - открытие значения из текущей колонки.

 

 

Жил-был начинающий разработчик Вася. И было у него три «пунктика»:

  1. Писать по стандартам

  2. Делать универсально

  3. Перепроверять, что все соответствует п.1 и п.2

 

И в зависимости от расположения звёзд на небе, у Василия активизировались те или иные пункты. Например.

 

Есть на форме обработки таблица с колонками. Разработчик столкнулся с, на первый взгляд, примитивной задачей — сделать кнопку, которая будет открывать значение в текущей колонке. Пользователь становится курсором на валюту «Руб.» и нажимает кнопку. Карточка валюты «руб.» открывается. Пользователь становится на другую ячейку и нажимает на кнопку — открывается значение из этой ячейки.

 

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

 

- А вдруг пользователь нажмёт кнопку в тот момент, когда в таблице вообще не будет строк?

 

И прилежный программист сразу же (как учили) в процедуре делает стандартную проверку.

 

ТаблицаФормы = Элементы.Валюты;
	
Если ТаблицаФормы.ТекущиеДанные = Неопределено Тогда
	Возврат;
КонецЕсли;

- Ну вот! Уже лучше. Начинаем эксперименты

И вот Василий берётся за определение текущей колонки. А так как наш разработчик любит сначала всё проверять, то выводит её сообщением.

 

ТекущаяКолонка = ТаблицаФормы.ТекущийЭлемент;
Сообщить("Имя текущего поля: " + ТекущаяКолонка.Имя);

Открывает свой любимый тонкий клиент и проверяет:

 


 

- Но ведь сама колонка в таблице называется «Валюта», а не «ВалютыВалюта».

Взмахнув мышкой, Василий открывает редактор формы и видит, что на самом деле происходит.

 

«Валюты» - это имя таблицы, в которой хранятся данные.

«Валюта» - имя колонки этой таблицы.

А «ВалютыВалюта» - это имя поля на форме. Оно не хранит данные, а лишь выводит их. На самом деле данные хранятся в строке таблицы «Валюты» в колонке «Валюта».

 

 


 

 

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

имя таблицы + имя колонки.

 

- И как же мне определить реальное имя колонки у текущего элемента?

Чему зачастую учат программистов в этих ваших интернетах? Прежде чем создавать свой велосипед, нужно поискать чужие. Естественно, в интернете.

 

Недолго думая гугля, Вася находит несколько примеров.

 

- А где-то я уже это видел...

Флэшбеки вспышками имен методов и переменных пролетают в сознании разработчика 1С и, погрузившись в океан жёлтых воспоминаний, он хватает за хвост имя обработки, в которой видел нечто подобное.

 

- Точно, я уже такое видел!

И действительно, в одной из завалявшихся в конфигурации обработок есть это:

 

ТаблицаФормы.ТекущиеДанные[Сред(ТаблицаФормы.ТекущийЭлемент.Имя, СтрДлина(ТаблицаФормы.Имя) + 1)] 

Всё просто. Автор этого кода полагает, что имена элементов в его инструменте всегда будут строиться по приведенной ранее формуле: имя таблицы + имя колонки. И вроде бы ничего страшного, ведь так чаще всего и бывает, но:

 

- Я хочу универсальное решение!

Звёзды сошлись. Сегодня Василий решается на серьёзный поступок — не денег ради, но во имя высокой цели, сделать кнопку не «как можно быстрее», а «как можно круче». Естественно, степень крутости определяется им самим.

 

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

 

Порывшись в гугле синтаксис помощнике, Василий находит свойство у поля: ПутьКДанным

 

ПолеФормы (FormField)

ПутьКДанным (DataPath)

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

Чтение и запись.

Описание:

Тип: Строка.
Содержит путь к реквизиту, с которым связан объект.

Доступность:

Сервер, мобильное приложение(сервер).

 

И вроде бы вот оно решение, однако:

 

Доступность:

Сервер, мобильное приложение(сервер).

 

Есть загвоздка — свойство доступно только на сервере.

 

Можно, конечно, написать серверную функцию, которая будет возвращать путь к данным формы:

 

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


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

Но...

- Так не пойдёт!

Вспомнив, что каждое излишнее обращение к серверу — это зло, за которое его ругали в Великой Школе Одинэсников Имени Желтого Чайника, разработчик Вася решает попробовать не плодить серверные вызовы. Тем более с передачей всей формы.

 

Программист добавляет на форму обработки реквизит произвольного типа «ПутиКДаннымЭлементовФормы»

 


 

А при создании формы заполняем эту структуру именами полей и адресами их значений, хранящихся в свойстве «ПутьКДанным»

 

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

Теперь остаётся лишь сделать клиентский метод, который будет возвращать соответствующее значение свойства «ПутьКДанным»

&НаКлиенте
Функция ПутьКДаннымЭлементаФормы(ИмяЭлемента)
	
	ПутьКДаннымЭлемента = Неопределено;
	ПутиКДаннымЭлементовФормы.Свойство(ИмяЭлемента, ПутьКДаннымЭлемента);
	Возврат ПутьКДаннымЭлемента;
	
КонецФункции

 

Разработчик оглядывает код и радуется проделанной работе. А заодно и проверяет насколько правильно всё работает:

 

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

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

&НаКлиенте
Функция ПутьКДаннымЭлементаФормы(ИмяЭлемента)
	
	ПутьКДаннымЭлемента = Неопределено;
	ПутиКДаннымЭлементовФормы.Свойство(ИмяЭлемента, ПутьКДаннымЭлемента);
	Возврат ПутьКДаннымЭлемента;
	
КонецФункции

Вернувшись в тонкий клиент, Василий смотрит на результат:

 

 


 

 

 

Уже лучше. Теперь мы можем на клиенте узнать путь к данным формы. Для проверки, что всё на самом деле так, как планировалось, разработчик Вася переименовал элемент формы на «КолонкаСВалютой». Теперь путь к данным и имя элемента непохожи между собой, что поможет понять разницу. Вася любит всё перепроверять.

 


 

 

 

Ну вот. Всё хорошо. Но что теперь делать с этим? Нужно же определить имя колонки из полного пути к данным формы. Василий берёт самый прямой способ - расщепить полный путь на массив и взять его последний элемент:

 


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


&НаКлиенте
Функция ПутьКДаннымЭлементаФормы(ИмяЭлемента)
	
	ПутьКДаннымЭлемента = Неопределено;
	ПутиКДаннымЭлементовФормы.Свойство(ИмяЭлемента, ПутьКДаннымЭлемента);
	Возврат ПутьКДаннымЭлемента;
	
КонецФункции


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

 

- Сейчас проверим

 


 

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

 

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


&НаКлиенте
Функция ПутьКДаннымЭлементаФормы(ИмяЭлемента)
	
	ПутьКДаннымЭлемента = Неопределено;
	ПутиКДаннымЭлементовФормы.Свойство(ИмяЭлемента, ПутьКДаннымЭлемента);
	Возврат ПутьКДаннымЭлемента;
	
КонецФункции


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

 

Замечательно! Инструмент заработал. И теперь уже значение будет открываться независимо от того, как называется наш элемент формы.

 

Василий уже прикинул в голове способы применения этого кода. Например, у нас есть табличная часть документа, которую нельзя редактировать. Наш разработчик ставит на таблицу ТолькоПросмотр, а так же подвязывает событие «Выбор», в котором открывает текущее значение.

 

И как только наш начинающий программист подумал об этом, в голову пришла мысль.

 

- Недостаточно удобно!

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

 

 

Понравилась статья?

 

Дамы и господа 1Сники. Не будьте равнодушными. Каждая ваша "звёздочка" порадует и автора и программиста Васю. Ведь это показатель того, что кому-то текст зашёл, а значит и время было потрачено не зря. 

 

Ну а после переходите к другим работам.

"Меньше копипаста!", или как Вася универсальную процедуру писал

Сортируем ДанныеФормыДерево на клиенте

Не провоцируйте СКД, или пример "как не надо"

 

 

код универсально программирование теория практика

См. также

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

21.05.2024    20129    dimanich70    81    

144

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

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

1 стартмани

18.03.2024    4091    3    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    18065    atdonya    24    

56

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    5502    ke.92@mail.ru    16    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    14734    YA_418728146    7    

166

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3581    56    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18478    171    sapervodichka    112    

135
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. serg-lom89 76 03.09.19 08:48 Сейчас в теме
классно написано!)Жду дальше историй про Васю!)
2. genayo 03.09.19 08:57 Сейчас в теме
Нам плюсиков не жалко, они бесплатные :)) Так что пиши ещё :))
3. Arxxximed 37 03.09.19 09:02 Сейчас в теме
Написано классно, стиль повествования понравился... Но , никогда так не буду делать, потому что структура колонок в реквизите формы - это уже костыль.
1. при открытии значения все равно будет обращение к серверу, если это конечно не примитивный тип данных. Так почему просто не обращаться на сервере к ПутьКДанным. Другой вопрос действительно не хочется тянуть на сервер всю форму, но для этого можно поискать обходные пути.
2. универсальность может и появилась. Но не очень... а что будет если программист Петя, у которого нету времени вникать в суть процедур Васи захочет программно добавить колонки, не задумываясь что за переменная ПутиКДаннымЭлементовФормы? Он будет думать над своей логикой, и только потом обнаружит что эта "кнопка" уже не совсем работает...
12. fredly_nightly 03.09.19 10:48 Сейчас в теме
(3) 1. обращение минимальное. Это не тоже самое, что в добавок ещё и форму всю перекидывать ради одной строчки
2. ага, выглядит как костылик. Но я вот помню сталкивался с подобной ситуацией... И что-то подобное только и получилось сделать. Как-то вариантов других не нашли (
27. Arxxximed 37 04.09.19 11:31 Сейчас в теме
(12) Все таки интересно, пример или хотя бы суть такой ситуации, в которой без костылика не обойдешься?
Могу только предоположить , когда данные на форме объемные, и любая отправка формы на сервер вызывает задержку?
4. Arxxximed 37 03.09.19 09:41 Сейчас в теме
А можете мне рассказать суть статьи? Это подход к решению задачи, или описание маленькой задачи?

Извините за критику, надеюсь она будет конструктивной.

1 Если первое: То как то не расскрыто. Не вижу разбора паттерна , да и самого паттерна подхода к решению задачи.
2 Если про саму задачу: решение - так себе... Вроде и работает. Но... писал уже выше.

Пока - статья для статьи.. Что тоже имеет место быть.
CyberCerber; +1 Ответить
5. RustIG 1747 03.09.19 10:20 Сейчас в теме
(0) как-то все сложно...
Прикрепленные файлы:
ПолучениеИмениКолонки.epf
7. Arxxximed 37 03.09.19 10:39 Сейчас в теме
(5) Ну и ? Добавлю колонку со своим именем... Как данные потом найдешь? В статье это как раз и написано. Вот лишь бы написать не почитавши.
9. fredly_nightly 03.09.19 10:45 Сейчас в теме
(5) ну так стоит изменить имя элемента и всё сломается. В этом и вся суть
11. RustIG 1747 03.09.19 10:46 Сейчас в теме
(9) имя какого элемента вы хотите поменять?
13. fredly_nightly 03.09.19 10:51 Сейчас в теме
(11) любого. Если элемент будет называться как угодно, не соответствуя шаблону "Список" + ИмяКолонки, то всё сломается.
14. RustIG 1747 03.09.19 10:53 Сейчас в теме
(13) Название табличной части "Список" можно выделить в переменную
&НаКлиенте
Процедура СообщитьИмяЭлемента(Команда)
ИмяТЧ = "Список";
ТекЭлемент = ЭтаФорма.Элементы[ИмяТЧ ].ТекущийЭлемент;
Сообщить(СтрЗаменить(ТекЭлемент.Имя, "ИмяТЧ ", ""));
КонецПроцедуры
16. fredly_nightly 03.09.19 10:56 Сейчас в теме
(14) с таким подходом лучше уж как в статье:

ТаблицаФормы.ТекущиеДанные[Сред(ТаблицаФормы.ТекущийЭлемент.Имя, СтрДлина(ТаблицаФормы.Имя) + 1)]

но это не меняет сути, что имена элементов должны быть строго стандартизированы.
21. RustIG 1747 03.09.19 11:44 Сейчас в теме
(16)
&НаКлиенте
Процедура СообщитьИмяЭлемента(Команда)
	ИмяТЧ = ЭтаФорма.ТекущийЭлемент.Имя;
	ТекЭлемент = ЭтаФорма.Элементы[ИмяТЧ].ТекущийЭлемент;
	Сообщить(СтрЗаменить(ТекЭлемент.Имя, ИмяТЧ, ""));
КонецПроцедуры
17. fredly_nightly 03.09.19 10:58 Сейчас в теме
(14) а если элемент будет называться не "СписокВалюта", а "ВалютаУчета" ?
Или нужно вынести два элемента, привязанного к одной колонке.
ваш подход работает только с самыми примитивными ситуациями. А тут описывается "универсальное мега супер решение"
Светлый ум; +1 Ответить
22. RustIG 1747 03.09.19 11:45 Сейчас в теме
(17) я не вижу супер-решения.
15. RustIG 1747 03.09.19 10:54 Сейчас в теме
(13) Имя табличной части сможете сами вытащить ? и в переменную передавать и далее в процедуру.
6. RustIG 1747 03.09.19 10:38 Сейчас в теме
(0) вот видео
Прикрепленные файлы:
ScreenCaptureProject2.mp4
8. Arxxximed 37 03.09.19 10:40 Сейчас в теме
(6) еще и с видео заморочились )))... Там в обработке две строчки. можно же было просто сюда код написать!
10. RustIG 1747 03.09.19 10:45 Сейчас в теме
(8) :)))))))))))))))) да уж... вы правы
&НаКлиенте
Процедура СообщитьИмяЭлемента(Команда)
	ТекЭлемент = ЭтаФорма.Элементы.Список.ТекущийЭлемент;
	Сообщить(СтрЗаменить(ТекЭлемент.Имя, "Список", ""));
КонецПроцедуры
18. Arxxximed 37 03.09.19 11:02 Сейчас в теме
По мне так все таки нормальный вариант Получать ПутьКданным на сервере, и там получать сразу данные... Если не нравится идея передавать всю форму на сервер, используйте НаСервереБезконтекста, куда в параметрах передавать ТаблицуФормы и Данныеформыколлекция
19. SeiOkami 3515 03.09.19 11:05 Сейчас в теме
(18) нельзя сделать при помощи &НаСервереБезконтекста
Если у Вас выйдет, поделитесь, пожалуйста - это заметно упростит код.
20. Arxxximed 37 03.09.19 11:20 Сейчас в теме
(19) Да , прошу прощения, Элементы формы не передаются в параметрах на сервер...


Но тут пришла и другая мысль... А зачем боятся вызова этого сервера в контексте этой задачи? Ведь важно что бы не было частых вызовов, а тут тоолько один , по нажатию кнопки... А если предполагается частый контекстный вызов, то наверное нужно использовать другие события ТаблицыФормы
adhocprog; +1 Ответить
24. SlavaKron 03.09.19 12:12 Сейчас в теме
(20) Если говорить об универсальности, хотелось бы найти такое решение, которое подошло бы, например, для этой задачи: Открывашка ячеек таблиц. То есть всё должно быть на клиенте. Менять код формы мы не можем, всё что у нас есть - это текущий элемент и ДанныеФормыСтруктура ДанныеФормыЭлементКоллекции (ТекущиеДанные).
23. Arxxximed 37 03.09.19 12:04 Сейчас в теме
Коллеги, все равно считаю , что данный метод получения значения ячейки таблицы формы или же имени колонки таблицы - костыльный... Не рекомендуйте особенно новичкам так делать! Пользуйтесь по стандарту - на стороне сервера получаете путькданным. Просто , понятно, читабельно , легко! Ваш код всегда будут читать другие, зачем усложнять сложное.
Конечно , все в зависимости от поставленной задачи.
25. Infector 201 03.09.19 18:58 Сейчас в теме
Автор! Вы забыли указать, что Василий это кот :)
Merkalov; Jimbo; cuztam; RustIG; SeiOkami; +5 Ответить
26. ntemny 62 04.09.19 09:32 Сейчас в теме
Не совсем понял задачу. ТекущаяСтрока и НайтиПоИдентификатору() в обработке выбора без использования элементов формы религией запрещены?
30. Arxxximed 37 04.09.19 14:22 Сейчас в теме
(26) А причем тут обработка выбора.. Автор хочет по кнопке получить текущую колонку и текущую строку, а потом по этим данным найти и открыть значение.
31. ntemny 62 04.09.19 17:56 Сейчас в теме
(30)Ну ок, по кнопке, не по обработке выбора. Разницы нет. В любом случае правильнее работать не с элементами формы а с реквизитом типа ДанныеФормыКоллекция.
28. Yashazz 4790 04.09.19 14:11 Сейчас в теме
Вот не лень же людям ерундой заниматься - текущие проблемы, которые по ходу дела решаются, расписывать в виде статей про всяких вась...
29. Yashazz 4790 04.09.19 14:20 Сейчас в теме
А вообще, с возрастом и опытом приходит понимание тонкой грани между решением "по месту", кастомизацией, продиктованной сроками, стоимостью, сложностью, перспективами развития и эксплуатации системы, и универсализацией. И вместо сферических универсалов в вакууме гораздо чаще востребованы и удобны оказываются узкоспециализированные решения. Не говоря уже о том, что универсализация на уровне разработчика частенько "выпихивает" проблему настоящей собственно автоматизации процесса на следующий уровень - уровень админа, продвинутого юзера - того, кто настраивает этот супер-пупер-универсал и рулит им. Универсалам нужна подробная справка, и всё равно не читают; универсалов тупо опасаются; универсалы редко "угадывают" настоящие направления работы и оказываются бесполезны...
vozzhaev; mbalyukin; sergathome; +3 Ответить
32. Leon29 05.09.19 07:52 Сейчас в теме
(29)
и оказываются бесполезны...


Я же правильно Вас понял, что учитывая тонкую грань бесполезны бывают лишь в некоторых случаях, а не всегда.

Ведь много идёт по пути универсальности. Например, платформа 1С. Уже есть готовые объекты и действительно надо знать как ими пользоваться. И всякие универсальные вещи ускоряют работу. Например, автомобильные детали используются в различных брендах и надо знать их качество, надежность, крепления, параметры.
vozzhaev; +1 Ответить
33. Yashazz 4790 05.09.19 22:54 Сейчас в теме
(32) Разумеется. Нигде нет смысла бросаться в крайности и возводить в абсолюты. Программирование или нет, тут не суть.
vozzhaev; +1 Ответить
34. Jimbo 10 06.09.19 11:04 Сейчас в теме
Что за критика ? Универсальное ради универсального. Просто читать - бальзам на душу. Разобран конкретный пример, все с этим столкнутся. Васе зачёт и молочка.
dvsidelnikov; +1 Ответить
35. mbalyukin 26.09.19 15:05 Сейчас в теме
Для чего вообще делать кнопку и все это? Я правильно понимаю, что задача программиста в данном случае открывать значение из ячейки в таблице? Но из-за того, что установлено свойство "ТолькоПросмотр" = Истина в самой ячейке таблицы не работает кнопка "Открыть"? А почему нельзя убрать "ТолькоПросмотр", тогда естесственное открытие ведь станет работать. Потому что тогда пользователь сможет менять значение в колонке, а это плохо? На мой взгляд решение есть проще.

Имеем:
0. Таблица значений на форме, нужно открывать любое значение из колнки стандартной "лупой", но не иметь возможности менять элемент.
1. У всех ссылочных полей таблицы ставим свойство "Редактирование текста" = Ложь.
2. У тех же полей создаем событие "Начало выбора", в котором ставим "СтандартнаяОбработка" = Ложь.
3. У тех же полей создаем событие "Очистка, в котором ставим "СтандартнаяОбработка" = Ложь.
4. "Только просмотр" не ставим.

Все. Теперь любое ссылочное значение из таблицы можно открыть без доп. кнопок и кучи кода, простой кнопкой "открыть" из ячейки. А также поменять или очистить значение тоже никак не получится.
Pavl0; romankoav; Altez50; +3 Ответить
Оставьте свое сообщение