Получение стабильных ссылок на объекты ИБ (УФ, 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");

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

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

См. также

SALE! %

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

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

12000 10000 руб.

02.09.2020    164916    914    402    

889

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

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

8400 руб.

20.08.2024    9873    81    36    

90

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

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

22200 руб.

06.10.2023    16244    39    9    

75

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

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

9360 руб.

17.05.2024    24947    81    48    

125

SALE! %

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

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

15000 10000 руб.

10.11.2023    11027    40    27    

66

SALE! %

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

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

4800 руб.

14.01.2013    189423    1146    0    

916

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

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

2220 руб.

21.02.2023    8295    8    38    

24

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

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

5000 руб.

07.02.2018    103530    244    100    

306
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 3647 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 3647 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 3647 19.05.23 09:39 Сейчас в теме
(10)
нет метода "ПустаяСсылка()

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

В общем дело ваше я вам просто предложил более лаконичный вариант
13. Fuego 463 19.05.23 09:44 Сейчас в теме
(11), Вы не увидели сравнения? Два плюса в пользу моего подхода перед преложенным Вами? Скорость и лаконичность здесь не являются приоритетными, так как код предлагается писать не вручную, а разница в скорости будет явно заметна при работе с большим объемом ссылок, для чего этот подход не предназначен. Свой подход я использую для инкапсуляции некоторых опорных данных и формирования параметров запроса.
15. dsdred 3647 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 3647 19.05.23 09:56 Сейчас в теме
(14)Достаточно функцию сделать и получим более универсальный механизм

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

.......


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

Но как Вы уже сказали -"Однако, этот код вряд ли вообще кому-то понадобится."
18. Fuego 463 19.05.23 10:18 Сейчас в теме
(16) Ваша функция не может быть универсальной. Ни пустое перечисление, ни пустую точку бизнес-процесса таким образом не получить. К тому же, зачем создавать такую функцию, если есть стандартный метод менеджера "ПустаяСсылка" там, где он есть?
"Не понадобится код" - это касается исключительной ситуации с пустой точкой бизнес-процесса, где используется подход с конструктором значения по типу.
19. dsdred 3647 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), шире нужно мыслить. Я среди тех, нередко производит доработки, не снимая с полной официальной поддержки типовые конфигурации. В таких конфигурациях не добавить предопределенный элемент. К тому же, такой способ подходит в случаях, когда база уже наполнена данными, и эти данные повсеместно задействованы - изменить ссылки на новый предопределенный элемент может быть проблематично.
Оставьте свое сообщение