"Хочу универсально!" [Часть 1]
Разработка - Практика программирования
Жил-был начинающий разработчик Вася. И было у него три «пунктика»:
-
Писать по стандартам
-
Делать универсально
-
Перепроверять, что все соответствует п.1 и п.2
И в зависимости от расположения звёзд на небе, у Василия активизировались те или иные пункты. Например.
Есть на форме обработки таблица с колонками. Разработчик столкнулся с, на первый взгляд, примитивной задачей — сделать кнопку, которая будет открывать значение в текущей колонке. Пользователь становится курсором на валюту «Руб.» и нажимает кнопку. Карточка валюты «руб.» открывается. Пользователь становится на другую ячейку и нажимает на кнопку — открывается значение из этой ячейки.
И вот программист Вася, вдохновившись тем, что сможет моментально решить задачу, добавляет команду.
- А вдруг пользователь нажмёт кнопку в тот момент, когда в таблице вообще не будет строк?
И прилежный программист сразу же (как учили) в процедуре делает стандартную проверку.
ТаблицаФормы = Элементы.Валюты; Если ТаблицаФормы.ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли;
- Ну вот! Уже лучше. Начинаем эксперименты
И вот Василий берётся за определение текущей колонки. А так как наш разработчик любит сначала всё проверять, то выводит её сообщением.
ТекущаяКолонка = ТаблицаФормы.ТекущийЭлемент; Сообщить("Имя текущего поля: " + ТекущаяКолонка.Имя);
Открывает свой любимый тонкий клиент и проверяет:
- Но ведь сама колонка в таблице называется «Валюта», а не «ВалютыВалюта».
Взмахнув мышкой, Василий открывает редактор формы и видит, что на самом деле происходит.
«Валюты» - это имя таблицы, в которой хранятся данные.
«Валюта» - имя колонки этой таблицы.
А «ВалютыВалюта» - это имя поля на форме. Оно не хранит данные, а лишь выводит их. На самом деле данные хранятся в строке таблицы «Валюты» в колонке «Валюта».
Так происходит, когда имя поля было сгенерировано автоматически. Например, разработчик вынес его «вручную» на форму обработки. Имя автоматически присвоелось по формуле:
имя таблицы + имя колонки.
- И как же мне определить реальное имя колонки у текущего элемента?
Чему зачастую учат программистов в этих ваших интернетах? Прежде чем создавать свой велосипед, нужно поискать чужие. Естественно, в интернете.
Недолго думая гугля, Вася находит несколько примеров.
- А где-то я уже это видел...
Флэшбеки вспышками имен методов и переменных пролетают в сознании разработчика 1С и, погрузившись в океан жёлтых воспоминаний, он хватает за хвост имя обработки, в которой видел нечто подобное.
- Точно, я уже такое видел!
И действительно, в одной из завалявшихся в конфигурации обработок есть это:
ТаблицаФормы.ТекущиеДанные[Сред(ТаблицаФормы.ТекущийЭлемент.Имя, СтрДлина(ТаблицаФормы.Имя) + 1)]
Всё просто. Автор этого кода полагает, что имена элементов в его инструменте всегда будут строиться по приведенной ранее формуле: имя таблицы + имя колонки. И вроде бы ничего страшного, ведь так чаще всего и бывает, но:
- Я хочу универсальное решение!
Звёзды сошлись. Сегодня Василий решается на серьёзный поступок — не денег ради, но во имя высокой цели, сделать кнопку не «как можно быстрее», а «как можно круче». Естественно, степень крутости определяется им самим.
Нужно решение, которое можно будет скопировать в другой инструмент, не заботясь о том, чтобы имена элементов соответствовали какому-то там шаблону.
Порывшись в гугле синтаксис помощнике, Василий находит свойство у поля: ПутьКДанным
ПолеФормы (FormField)
ПутьКДанным (DataPath)
Использование:
Чтение и запись.
Описание:
Тип: Строка.
Содержит путь к реквизиту, с которым связан объект.
Доступность:
Сервер, мобильное приложение(сервер).
И вроде бы вот оно решение, однако:
Доступность:
Сервер, мобильное приложение(сервер).
Есть загвоздка — свойство доступно только на сервере.
Можно, конечно, написать серверную функцию, которая будет возвращать путь к данным формы:
&НаКлиенте Процедура ОткрытьЗначениеЯчейки(Команда) ТаблицаФормы = Элементы.Валюты; Если ТаблицаФормы.ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; ТекущаяКолонка = ТаблицаФормы.ТекущийЭлемент; Сообщить("Имя текущего поля: " + ТекущаяКолонка.Имя); Сообщить("Путь к данным текущего поля: " + ПутьКДаннымЭлементаФормы(ТекущаяКолонка.Имя)); КонецПроцедуры &НаСервере Функция ПутьКДаннымЭлементаФормы(ИмяЭлемента) ПутьКДаннымЭлемента = Неопределено; НайденныйЭлемент = Элементы.Найти(ИмяЭлемента); Если НЕ НайденныйЭлемент = Неопределено Тогда ПутьКДаннымЭлемента = НайденныйЭлемент.ПутьКДанным; КонецЕсли; Возврат ПутьКДаннымЭлемента; КонецФункции
Но...
- Так не пойдёт!
Вспомнив, что каждое излишнее обращение к серверу — это зло, за которое его ругали в Великой Школе Одинэсников Имени Желтого Чайника, разработчик Вася решает попробовать не плодить серверные вызовы. Тем более с передачей всей формы.
Программист добавляет на форму обработки реквизит произвольного типа «ПутиКДаннымЭлементовФормы»
А при создании формы заполняем эту структуру именами полей и адресами их значений, хранящихся в свойстве «ПутьКДанным»
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ПутиКДаннымЭлементовФормы = Новый Структура; Для Каждого ЭлементФормы Из ЭтаФорма.Элементы Цикл Если ТипЗнч(ЭлементФормы) = Тип("ПолеФормы") ИЛИ ТипЗнч(ЭлементФормы) = Тип("ТаблицаФормы") Тогда ПутиКДаннымЭлементовФормы.Вставить(ЭлементФормы.Имя, ЭлементФормы.ПутьКДанным); КонецЕсли; КонецЦикла; КонецПроцедуры
Теперь остаётся лишь сделать клиентский метод, который будет возвращать соответствующее значение свойства «ПутьКДанным»
&НаКлиенте Функция ПутьКДаннымЭлементаФормы(ИмяЭлемента) ПутьКДаннымЭлемента = Неопределено; ПутиКДаннымЭлементовФормы.Свойство(ИмяЭлемента, ПутьКДаннымЭлемента); Возврат ПутьКДаннымЭлемента; КонецФункции
Разработчик оглядывает код и радуется проделанной работе. А заодно и проверяет насколько правильно всё работает:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ПутиКДаннымЭлементовФормы = Новый Структура; Для Каждого ЭлементФормы Из ЭтаФорма.Элементы Цикл Если ТипЗнч(ЭлементФормы) = Тип("ПолеФормы") ИЛИ ТипЗнч(ЭлементФормы) = Тип("ТаблицаФормы") Тогда ПутиКДаннымЭлементовФормы.Вставить(ЭлементФормы.Имя, ЭлементФормы.ПутьКДанным); КонецЕсли; КонецЦикла; КонецПроцедуры &НаКлиенте Процедура ОткрытьЗначениеЯчейки(Команда) ТаблицаФормы = Элементы.Валюты; Если ТаблицаФормы.ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; ТекущаяКолонка = ТаблицаФормы.ТекущийЭлемент; Сообщить("Имя текущего поля: " + ТекущаяКолонка.Имя); Сообщить("Путь к данным текущего поля: " + ПутьКДаннымЭлементаФормы(ТекущаяКолонка.Имя)); КонецПроцедуры &НаКлиенте Функция ПутьКДаннымЭлементаФормы(ИмяЭлемента) ПутьКДаннымЭлемента = Неопределено; ПутиКДаннымЭлементовФормы.Свойство(ИмяЭлемента, ПутьКДаннымЭлемента); Возврат ПутьКДаннымЭлемента; КонецФункции
Вернувшись в тонкий клиент, Василий смотрит на результат:
Уже лучше. Теперь мы можем на клиенте узнать путь к данным формы. Для проверки, что всё на самом деле так, как планировалось, разработчик Вася переименовал элемент формы на «КолонкаСВалютой». Теперь путь к данным и имя элемента непохожи между собой, что поможет понять разницу. Вася любит всё перепроверять.
Ну вот. Всё хорошо. Но что теперь делать с этим? Нужно же определить имя колонки из полного пути к данным формы. Василий берёт самый прямой способ - расщепить полный путь на массив и взять его последний элемент:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ПутиКДаннымЭлементовФормы = Новый Структура; Для Каждого ЭлементФормы Из ЭтаФорма.Элементы Цикл Если ТипЗнч(ЭлементФормы) = Тип("ПолеФормы") ИЛИ ТипЗнч(ЭлементФормы) = Тип("ТаблицаФормы") Тогда ПутиКДаннымЭлементовФормы.Вставить(ЭлементФормы.Имя, ЭлементФормы.ПутьКДанным); КонецЕсли; КонецЦикла; КонецПроцедуры &НаКлиенте Функция ПутьКДаннымЭлементаФормы(ИмяЭлемента) ПутьКДаннымЭлемента = Неопределено; ПутиКДаннымЭлементовФормы.Свойство(ИмяЭлемента, ПутьКДаннымЭлемента); Возврат ПутьКДаннымЭлемента; КонецФункции &НаКлиенте Процедура ОткрытьЗначениеЯчейки(Команда) ТаблицаФормы = Элементы.Валюты; Если ТаблицаФормы.ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; ИмяПоляКолонки = ТаблицаФормы.ТекущийЭлемент.Имя; //КолонкаСВалютой ПутьКДаннымКолонки = ПутьКДаннымЭлементаФормы(ИмяПоляКолонки); //Валюты.Валюта СоставПутиКДанным = СтрРазделить(ПутьКДаннымКолонки, ".", Ложь); //Валюты; Валюта ИмяКолонкиТаблицы = СоставПутиКДанным[СоставПутиКДанным.ВГраница()]; //Валюта Сообщить("Имя колонки таблицы: " + ИмяКолонкиТаблицы); КонецПроцедуры
- Сейчас проверим
Осталось немного — просто взять значение из колонки и открыть его:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ПутиКДаннымЭлементовФормы = Новый Структура; Для Каждого ЭлементФормы Из ЭтаФорма.Элементы Цикл Если ТипЗнч(ЭлементФормы) = Тип("ПолеФормы") ИЛИ ТипЗнч(ЭлементФормы) = Тип("ТаблицаФормы") Тогда ПутиКДаннымЭлементовФормы.Вставить(ЭлементФормы.Имя, ЭлементФормы.ПутьКДанным); КонецЕсли; КонецЦикла; КонецПроцедуры &НаКлиенте Функция ПутьКДаннымЭлементаФормы(ИмяЭлемента) ПутьКДаннымЭлемента = Неопределено; ПутиКДаннымЭлементовФормы.Свойство(ИмяЭлемента, ПутьКДаннымЭлемента); Возврат ПутьКДаннымЭлемента; КонецФункции &НаКлиенте Процедура ОткрытьЗначениеЯчейки(Команда) ТаблицаФормы = Элементы.Валюты; Если ТаблицаФормы.ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; ИмяПоляКолонки = ТаблицаФормы.ТекущийЭлемент.Имя; ПутьКДаннымКолонки = ПутьКДаннымЭлементаФормы(ИмяПоляКолонки); СоставПутиКДанным = СтрРазделить(ПутьКДаннымКолонки, ".", Ложь); ИмяКолонкиТаблицы = СоставПутиКДанным[СоставПутиКДанным.ВГраница()]; ЗначениеЯчейки = Неопределено; ТаблицаФормы.ТекущиеДанные.Свойство(ИмяКолонкиТаблицы, ЗначениеЯчейки); ПоказатьЗначение(Новый ОписаниеОповещения, ЗначениеЯчейки); КонецПроцедуры
Замечательно! Инструмент заработал. И теперь уже значение будет открываться независимо от того, как называется наш элемент формы.
Василий уже прикинул в голове способы применения этого кода. Например, у нас есть табличная часть документа, которую нельзя редактировать. Наш разработчик ставит на таблицу ТолькоПросмотр, а так же подвязывает событие «Выбор», в котором открывает текущее значение.
И как только наш начинающий программист подумал об этом, в голову пришла мысль.
- Недостаточно удобно!
Да, этого мало. Василий хочет сделать ещё круче! Он решает переспать с этой мыслью, чтобы уже позже продолжить свой путь от простой задачи к универсальному механизму...
Понравилась статья?
Дамы и господа 1Сники. Не будьте равнодушными. Каждая ваша "звёздочка" порадует и автора и программиста Васю. Ведь это показатель того, что кому-то текст зашёл, а значит и время было потрачено не зря.
Ну а после переходите к другим работам.
"Меньше копипаста!", или как Вася универсальную процедуру писал
Сортируем ДанныеФормыДерево на клиенте
Не провоцируйте СКД, или пример "как не надо"
Специальные предложения
См. также
"Хочу универсально!" [Часть 2] 22
25.09.2019 3655 SeiOkami 4
Программы для исполнения 54-ФЗ Промо
С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.
[Шпаргалка] Программное создание элементов формы 338
06.09.2019 16706 rpgshnik 43
Агрегатные функции СКД, о которых мало кто знает 386
05.09.2019 19811 ids79 45
Онлайн-курс «Практические аспекты внедрения регламентированного учета и расчета себестоимости в 1С:ERP на крупных промышленных предприятиях» с 17 февраля по 13 марта 2020 года. Промо
Курс рассчитан для подготовки экспертов по регламентированному учету и учету затрат для внедрения на крупных промышленных предприятиях с «исторически сложившимся» учетом
9000 рублей
Обмен данными. Консистентность vs Многопоточность 29
03.09.2019 5882 m-rv 1
Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив 285
08.08.2019 24611 ids79 34
Открыто голосование за доклады на INFOSTART MEETUP Krasnodar Промо
Выбирайте и голосуйте за самые интересные доклады, лучшие из них попадут в окончательную программу митапа. Голосование продлится до 30 января 2020 года.
Обработчики событий при записи объектов. Зачем и что за чем? 247
25.07.2019 18983 4 AlbinaAAA 24
Создание отчетов с помощью СКД - основные понятия и элементы 225
25.06.2019 27707 ids79 17
INFOSTART MEETUP Krasnodar. 14 февраля 2020 г. Промо
Краснодар станет первым в 2020 году местом, где пройдет региональная встреча IT-специалистов сообщества Инфостарт. Тема мероприятия - управление и технологии автоматизации учета на платформе "1С: Предприятие". Стоимость участия - 5000 рублей. Цена действительна до 26.12.2019.
Подсистема "Варианты отчетов". Используете ли Вы ее правильно? 228
04.06.2019 22549 YPermitin 49
Выгрузка документа по условию 5
25.04.2019 8605 m-rv 2
Онлайн-курс "Подготовка к экзамену 1С:Эксперт и 1С:Профессионал по технологическим вопросам" с 7 по 24 апреля 2020 г. Промо
На курсе вы получите практические навыки решения задач производительности 1С, в том числе характерных для высоконагруженных информационных систем (более 1000 пользователей). Подготовка к экзамену – только одна из составляющих курса. 70% слушателей приходят за знаниями, которые позволят расти и зарабатывать, делать сложные задачи на крупных проектах.
16450 рублей
Как настроить правильную техподдержку (helpdesk, service desk на коленке) 40
24.04.2019 10263 siddy 0
Преобразование EXCEL в таблицу значений без COM и других извращений 219
18.04.2019 16360 9 Eret1k 43
Перенос данных УПП 1.3 => ERP 2 (ЕРП) / УТ 11 / КА 2.х (обработка переноса документов, остатков и справочников из "1С:Управление производственным предприятием, ред. 1.3" в ERP / УТ 11 / КА 2). Обновлен до УПП 1.3.130.х, КА 2.4.11.х и ERP 2.4.11.х! Промо
Обработка позволяет переносить из УПП 1.3 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления при выходе новых релизов конфигураций 1С.
29700 руб.
Как прикрутить ГУИД к регистру сведений 23
16.04.2019 11490 m-rv 16
Excel vs 1С: битва с неожиданным исходом 43
11.04.2019 29052 bolefirenko 109
Программы для исполнения 488-ФЗ: Маркировка товаров Промо
1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.
Копирование числовых ячеек из 1С в Excel 26
15.01.2019 14233 itriot11 21
Разработка и сценарное тестирование с Vanessa-ADD. Концепция, теория и сквозной пример создания сценария 236
09.01.2019 32053 Vladimir Litvinenko 69
Готовые переносы данных из различных конфигураций 1C Промо
Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.
Универсальные функции ЗУП 3.1 / ЗКГУ 3.1, которые помогут в разработке 529
14.11.2018 44344 GeterX 94
Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С 132
10.11.2018 25019 ids79 40
Новый раздел на Инфостарте - Electronic Software Distribution Промо
Инфостарт напоминает: на нашем сайте можно купить не только ПО, связанное с 1С. В нашем арсенале – ESD-лицензии на ПО от ведущих вендоров: Microsoft, Kaspersky, ESET, Dr.Web, Аскон и другие.
- Низкие цены, без скрытых платежей и наценок
- Оперативная отгрузка
- Возможность оплаты с личного счета (кешбек, обмен стартмани на рубли и т.п.)
- Покупки идут в накопления для получения скидочных карт лояльности Silver (5%) и Gold (10%)
Git + 1С. Часть 1. Как подключиться к команде разработки и начать использовать Git 285
18.10.2018 43441 stas_ganiev 72
Вспомогательные инструкции в коде 1С 108
15.10.2018 22903 tormozit 100
С 2020 года сервис «Продление поддержки конфигурации 1С:УПП» подорожает вдвое Промо
Успейте продлить поддержку УПП до повышения цен! Фирма «1С» предупредила об изменении цен на сервис «Продление поддержки конфигурации "1С:Управление производственным предприятием"». С 1 января 2020 года сервис подорожает в два раза.
Из Excel в 1С запросом 33
14.08.2018 15956 m-rv 5
Тестер: частые вопросы 159
25.07.2018 22850 grumagargler 24
Подборка решений для взаимодействия со ФГИС «Меркурий» Промо
С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.
Повышаем эффективность разработки правил обмена 127
25.06.2018 22433 olegtymko 47
Как сделать запрос на изменение данных 76
01.06.2018 23952 m-rv 21
Базовый курс по разработке мобильных 1C-приложений для Android-устройств. Третий поток. Онлайн-интенсив с 11 февраля по 05 марта 2020 г. Промо
Данный онлайн-курс предусматривает изучение базовых принципов создания приложений для операционной системы Android, работающих на мобильной платформе “1С:Предприятие”. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие” при разработке прикладных решений для “обычных” компьютеров, но пока ещё не занимался разработкой 1С-приложений, предназначенных для работы на мобильных устройствах.
7500 рублей
Строим графы средствами 1С (без GraphViz) 46
23.05.2018 19812 slozhenikin_com 20
Распределение расходов пропорционально продажам 9
13.05.2018 13939 Rustig 9