Получение стабильных ссылок на объекты ИБ (УФ, 8.3)

18.05.23

Разработка - Инструментарий разработчика

В копилку инструментария разработчика - утилита генерации кода ссылок на объекты информационной базы.

Скачать исходный код

Наименование Файл Версия Размер
Получение стабильных ссылок на объекты ИБ:
.epf 11,54Kb
1
.epf 11,54Kb 1 Скачать

Думаю, что нередко у программистов возникает ситуация, когда какой-то программный код вдруг перестаёт работать, а после разбора программы выясняется, что кому-то из пользователей взбрело в голову переименовать группу (или элемент) справочника и т.п.

Хороший программист старается избегать поиска по наименованию, поскольку это небезосновательно считается ненадёжным методом. Чаще прибегают к поиску по коду – это поле, как правило, не так-то просто поменять, да и в голову пользователям это приходит чуть реже, чем никогда.

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

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

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

Обработка позволяет в пользовательском режиме выбрать необходимые ссылочные объекты и сформировать программный код, однозначно идентифицирующий именно эти объекты независимо от кода и/или наименования.

Обработка работает в любой конфигурации на управляемых формах, тестировалась в типовых и нетиповых конфигурациях на платформе 1С:Предприятие 8.3 (8.3.22.1704), но будет работать на всей линейке релизов платформы 1С:Предприятие 8.3

UPD: На основании комментариев привожу дополнение к описанию.
Предлагается использовать функцию платформы "XMLЗначение" как лаконичное и быстрое решение. Однако, я провел проверки и остался в своём решении.
Во-первых, предложенный мной подход подходит для авторефакторинга - при переименовании объекта в дереве конфигурации код будет модифицирован так, что он останется рабочим. Исключение составляет единственный случай - это формирование пустой ссылки на точку бизнесс-процесса. Пустое значение такого объекта можно сформировать только через конструктор.

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

//1:
Документы.Документ1.ПустаяСсылка()
//2:
Новый(Тип("ДокументСсылка.Документ1"))
//3:
XMLЗначение(Тип("ДокументСсылка.Документ1"), "00000000-0000-0000-0000-000000000000");

Во-вторых, при проверке текста кода конфигурации мой подход также выигрывает - если объект переименован в дереве конфигурации, а авторефакторинг по какой-то причине не произведен, проверка выявит ошибку, тогда как все методы с использованием имён типов не будут проверены на ошибки корректности имени типа. Здесь в исключение и попадает случай с пустой ссылкой на точку маршрута, но такое значение нужно настолько редко, что можно сказать, что оно вообще не нужно.

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

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    124555    681    389    

732

Infostart PrintWizard

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

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 руб.

06.10.2023    7714    24    6    

42

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 руб.

10.11.2023    4231    12    2    

36

SALE! %

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

3600 2880 руб.

14.01.2013    178557    1083    0    

861

Многопоточность. Универсальный «Менеджер потоков» 2.1

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

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99579    239    97    

298

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18348    6    8    

40

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23840    16    15    

33

1С HTML Шаблоны / HTML Templates

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

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28294    3    10    

15
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. basicmaster 2 18.05.23 19:36 Сейчас в теме
а чем плох метод глобального контекста ПолучитьНавигационнуюСсылку ?
siamagic; dsdred; +2 1 Ответить
3. Fuego 462 19.05.23 00:28 Сейчас в теме
(1), никогда не говорил, что этот метод плох. Только вот к чему этот вопрос здесь?
6. basicmaster 2 19.05.23 07:47 Сейчас в теме
(3) я имел ввиду следующий сценарий:
- если нам нужно получить "код ссылки на объект информационной базы", то мы просто в режиме Предприятие в форме объекта выполняем команду платформы "Получить ссылку [Ctrl+F11]" (в свежих релизах платформы можно даже в форме списка);
- полученное значение, например "e1cib/data/Справочник.Пользователи?ref=818538eaa7374f8611ead7db5d031352" копируем в буфер обмена;
- в коде (в любом контексте: Сервер, Тонкий, Толстый, Веб-клиент) используем сравнение результата метода глобального контекста ПолучитьНавигационнуюСсылку с фиксированным (хард-кодным) значением полученным в предыдущем пункте.

что-то типа того:
Если ПолучитьНавигационнуюСсылку(СкладПолучатель)="e1cib/data/Справочник.Склады?ref=810a38eaa7374f8611e6c1e4c13bdb85" Тогда
	Сообщить("Выбран запрещенный склад-получатель");
КонецЕсли;
7. Fuego 462 19.05.23 08:59 Сейчас в теме
(6), такой подход весьма ограничен.
Во-первых, я бы не использовать сравнение по строкам - это довольно медленно. Кроме того, здесь бы ещё к одному регистру для надёжности привести - ещё время. Во-вторых, таким образом не получится получить адекватную иерархическую выборку в запросе, например.
2. dsdred 3318 18.05.23 22:46 Сейчас в теме
У вас вся статья около XMLЗначение(<Тип>, <СтрокаXML>) крутится.

Получаем УИ -> XMLСтрока(<Значение>)

и обратный метод -> XMLЗначение(<Тип>, <СтрокаXML>)

Доступен, начиная с версии 8.1.
корум; siamagic; +2 Ответить
4. Fuego 462 19.05.23 00:49 Сейчас в теме
(2), о какой статье идёт речь?
Об указанных методах я осведомлён, пользуюсь ими там, где это уместно.
Здесь другой подход, и он не умаляет инструмента. Какой бы метод получения ссылок не использовался, вручную формировать код - не айс. Здесь я предлагаю именно инструмент.
12. siamagic 19.05.23 09:39 Сейчас в теме
(2) Пятница же ))) Я тоже гагатнул с его решения.
5. dsdred 3318 19.05.23 07:39 Сейчас в теме
(4) Ну хорошо, перефразирую.
Ваш универсальный инструмент при формировании кода использует дедовский метод:
Значение.Добавить(Задачи.ЗадачаИсполнителя.ПолучитьСсылку(Новый УникальныйИдентификатор("66eacf8a-b0f7-11ed-8e26-00505691f3ee")));


Хотя более лаконично и универсально использовать XMLЗначение (да и по скорости XMLЗначение работает быстрее, не намного но быстрее):
 Значение.Добавить(XMLЗначение(Тип("ЗадачаСсылка.ЗадачаИсполнителя"), "66eacf8a-b0f7-11ed-8e26-00505691f3ee")));
8. Fuego 462 19.05.23 09:08 Сейчас в теме
(5), возможно, Вы правы. Я проведу пару исследований, и по результатам приму решение и объявлю.
9. Fuego 462 19.05.23 09:30 Сейчас в теме
(5), я выполнил проверку и мои предположения подтвердились.
//Проверка конфигурации:
Функция ПолучитьФиксированнуюСсылку1() Экспорт
	// ОбщийМодуль.ОбщийМодуль1.Модуль Возможно ошибочное свойство: "Документ1"
	Возврат Документы.Документ1.ПолучитьСсылку(Новый УникальныйИдентификатор("dc1ac179-f60c-11ed-83ec-005056917c03"));
КонецФункции

Функция ПолучитьФиксированнуюСсылку2() Экспорт
	Возврат XMLЗначение(Тип("ДокументСсылка.Документ1"), "dc1ac179-f60c-11ed-83ec-005056917c03");
КонецФункции

Функция ПолучитьФиксированнуюСсылку3() Экспорт
	//ОбщийМодуль.ОбщийМодуль1.Модуль Возможно ошибочное свойство: "Документ1"
	Возврат Документы.Документ1.ПолучитьСсылку(Новый УникальныйИдентификатор("3d89e889-6aaa-4ca3-a2c6-acf014cfd861"));
КонецФункции

Функция ПолучитьФиксированнуюСсылку4() Экспорт
	Возврат XMLЗначение(Тип("ДокументСсылка.Документ1"), "3d89e889-6aaa-4ca3-a2c6-acf014cfd861");
КонецФункции

//Рефакторинг (Документ1 переименован в дереве конфигурации в Документ2):
Функция ПолучитьФиксированнуюСсылку1() Экспорт
	Возврат Документы.Документ2.ПолучитьСсылку(Новый УникальныйИдентификатор("dc1ac179-f60c-11ed-83ec-005056917c03"));
КонецФункции

Функция ПолучитьФиксированнуюСсылку2() Экспорт
	Возврат XMLЗначение(Тип("ДокументСсылка.Документ1"), "dc1ac179-f60c-11ed-83ec-005056917c03");
КонецФункции
Показать

Оба метода нормально работают с битыми ссылками. Функции с постфиксами 3 и 4 - это неликвидная ссылка, которой нет в базе.
Однако, мой метод подходит и для автоматического рефакторинга и для поиска ошибок в тексте кода конфигурации.
10. Fuego 462 19.05.23 09:34 Сейчас в теме
(9)+
В моей обработке есть генерация кода, опирающаяся на тип - это пустое значение ссылки точки маршрута, иначе его не создать (нет метода "ПустаяСсылка()". Однако, этот код вряд ли вообще кому-то понадобится. А ссылки на перечисления и другие типы объектов формируются так, что будут доступны для авторефакторинга и проверки текста кода конфигурации.
11. dsdred 3318 19.05.23 09:39 Сейчас в теме
(10)
нет метода "ПустаяСсылка()

тип нужный подставляем и пустую ссылку получаем, пример со справочником Товары
XMLЗначение(Тип("СправочникСсылка.Товары"), "00000000-0000-0000-0000-000000000000");

В общем дело ваше я вам просто предложил более лаконичный вариант
13. Fuego 462 19.05.23 09:44 Сейчас в теме
(11), Вы не увидели сравнения? Два плюса в пользу моего подхода перед преложенным Вами? Скорость и лаконичность здесь не являются приоритетными, так как код предлагается писать не вручную, а разница в скорости будет явно заметна при работе с большим объемом ссылок, для чего этот подход не предназначен. Свой подход я использую для инкапсуляции некоторых опорных данных и формирования параметров запроса.
15. dsdred 3318 19.05.23 09:50 Сейчас в теме
(13)я лично не увидел плюсов. и там и там можно сделать так чтобы не писать его вручную.
При этом насколько я понимаю у вас и тип уже оределен...

XMLЗначение(<Ваш тип>, "3d89e889-6aaa-4ca3-a2c6-acf014cfd861");
17. Fuego 462 19.05.23 10:12 Сейчас в теме
(15) Плюсы: 1 - подходит для авторефакторнга; 2 - подходит для выявления ошибок имен объектов при проверке текстов кода конфигурации.
При использовании функций с именами типов ни авторефакторинг, ни проверка конфигурации не будут полезными.
14. Fuego 462 19.05.23 09:47 Сейчас в теме
(11)+ Кстати, в приведенном Вами примере с пустой ссылкой Ваш подход как раз и не лаконичен. Сравните:
Документы.Документ1.ПустаяСсылка()

и
XMLЗначение(Тип("ДокументСсылка.Документ1"), "00000000-0000-0000-0000-000000000000");
16. dsdred 3318 19.05.23 09:56 Сейчас в теме
(14)Достаточно функцию сделать и получим более универсальный механизм

ВашаПустаяСсылка = ПолучитьПустуюСсылку(ВашТип);

.......


Функция ПолучитьПустуюСсылку(ВашТип)
Возврат XMLЗначение(ВашТип, "00000000-0000-0000-0000-000000000000"));
КонецФункции

Но как Вы уже сказали -"Однако, этот код вряд ли вообще кому-то понадобится."
18. Fuego 462 19.05.23 10:18 Сейчас в теме
(16) Ваша функция не может быть универсальной. Ни пустое перечисление, ни пустую точку бизнес-процесса таким образом не получить. К тому же, зачем создавать такую функцию, если есть стандартный метод менеджера "ПустаяСсылка" там, где он есть?
"Не понадобится код" - это касается исключительной ситуации с пустой точкой бизнес-процесса, где используется подход с конструктором значения по типу.
19. dsdred 3318 19.05.23 10:36 Сейчас в теме
(18)Для перечисления не надо указывать УИД

Пример:

ВашаПустаяСсылка = ПолучитьПустуюСсылку(Тип("ПеречислениеСсылка.Тестовое"));

..........

Функция ПолучитьПустуюСсылку(ВашТип)
Возврат XMLЗначение(ВашТип, "");
КонецФункции


В итоге:
XMLЗначение(Тип("ПеречислениеСсылка.Тестовое"), ""); = Перечисления.Тестовое.ПустаяСсылка()
Прикрепленные файлы:
20. Fuego 462 20.05.23 00:25 Сейчас в теме
(19) Вы просто с пеной у рта топите за этот метод, и уже сами не видите, какой не универсальный способ с этим методом. Я достаточно чётко изложил доводы в пользу своего решения. Даже Ваше зацикливание на пустой ссылке реально решается весьма универсальным методом, и не нужно делать никаких функций, и я это показал:
ПустоеЗначение = Новый(Тип("<имя типа>"));

Вы будете спорить, что это самый универсальный и самый лаконичный способ получения любой пустой ссылки (и не ограничиваясь только ссылками)? Обратите внимание - нет никакой необходимости создавать где-то дополнительные функции, всё уже есть во встроенном языке.

Способов получить ссылку несколько. Однако, каждый из способов имеет свою нишу.
21. Defender aka LINN 24.05.23 19:56 Сейчас в теме
Какой только хернёй люди не страдают, лишь бы не использовать предопределение элементы.
22. Fuego 462 25.05.23 09:32 Сейчас в теме
(21), шире нужно мыслить. Я среди тех, нередко производит доработки, не снимая с полной официальной поддержки типовые конфигурации. В таких конфигурациях не добавить предопределенный элемент. К тому же, такой способ подходит в случаях, когда база уже наполнена данными, и эти данные повсеместно задействованы - изменить ссылки на новый предопределенный элемент может быть проблематично.
Оставьте свое сообщение