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

18.05.23

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Получение стабильных ссылок на объекты ИБ:
.epf 11,54Kb
1
1 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

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

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

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

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

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

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

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

См. также

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

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

12000 руб.

02.09.2020    171888    962    403    

924

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

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    14372    109    46    

108

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

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

22200 руб.

06.10.2023    17314    43    15    

75

Инструментарий разработчика Программист Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

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

9360 руб.

17.05.2024    27305    96    48    

138

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

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

15000 руб.

10.11.2023    11917    45    27    

67

SALE! %

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

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

4800 3840 руб.

14.01.2013    191283    1152    0    

920

Инструментарий разработчика Программист 8.3.14 Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

20000 руб.

07.10.2021    18101    7    32    

42

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

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    1136    2    0    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. basicmaster 2 18.05.23 19:36 Сейчас в теме
а чем плох метод глобального контекста ПолучитьНавигационнуюСсылку ?
siamagic; dsdred; +2 1 Ответить
3. Fuego 463 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 463 19.05.23 08:59 Сейчас в теме
(6), такой подход весьма ограничен.
Во-первых, я бы не использовать сравнение по строкам - это довольно медленно. Кроме того, здесь бы ещё к одному регистру для надёжности привести - ещё время. Во-вторых, таким образом не получится получить адекватную иерархическую выборку в запросе, например.
2. dsdred 3777 18.05.23 22:46 Сейчас в теме
У вас вся статья около XMLЗначение(<Тип>, <СтрокаXML>) крутится.

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

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

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


Хотя более лаконично и универсально использовать XMLЗначение (да и по скорости XMLЗначение работает быстрее, не намного но быстрее):
 Значение.Добавить(XMLЗначение(Тип("ЗадачаСсылка.ЗадачаИсполнителя"), "66eacf8a-b0f7-11ed-8e26-00505691f3ee")));
8. Fuego 463 19.05.23 09:08 Сейчас в теме
(5), возможно, Вы правы. Я проведу пару исследований, и по результатам приму решение и объявлю.
9. Fuego 463 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 463 19.05.23 09:34 Сейчас в теме
(9)+
В моей обработке есть генерация кода, опирающаяся на тип - это пустое значение ссылки точки маршрута, иначе его не создать (нет метода "ПустаяСсылка()". Однако, этот код вряд ли вообще кому-то понадобится. А ссылки на перечисления и другие типы объектов формируются так, что будут доступны для авторефакторинга и проверки текста кода конфигурации.
11. dsdred 3777 19.05.23 09:39 Сейчас в теме
(10)
нет метода "ПустаяСсылка()

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

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

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

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

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

.......


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

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

Пример:

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

..........

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


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

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

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