Обход указания ссылок на конкретные элементы по реквизитам в коде
Разработка - Механизмы платформы 1С
Код наподобие следующего мешает получить удовольствие от проделанной работы:
ЦенаПродажи = Справочники.ТипыЦен.НайтиПоНаименованию("Розничные");
Это решение чревато ошибками в случае изменения ссылочных реквизитов, и неверно методологически: в случае перенумерации справочника надо лезть в код. Что делать?
Я предлагаю решение, которое не требует модификации стандартных объектов конфигурации, но подразумевает включение возможности внесения изменений в саму конфигурацию. Это решение опробовано на многочисленных типовых и самописных конфигурациях клиентов как в ОП, так и в УП (обычное и управляемое приложения).
В конфигурацию добавляем справочник СсылкиНаОбъекты:
- Без кода. Он не мешает, но это лишняя информация.
- С реквизитами:
- "СсылкаНаОбъект" типа "Любая ссылка" или с множественным значением нужных типов;
- "Описание" тип Строка (неогр.) для описания параметра;
- С предопределёнными элементами.
В качестве предопределённых элементов задаём те самые объекты, на которые бывает нужна ссылка:

В Наименовании указываем краткое описание параметра. Затем в режиме предприятия добавляем в реквизит "Описание" более подробное описание параметра с указанием механизмов, в которых он используется. В значении выбираем тип и нужный объект:

Ну и теперь то, ради чего весь этот механизм создавался. Из кода можно сослаться на значение такого элемента следующим образом:
СвойствоСрокГарантии = Справочники.СсылкиНаОбъекты.СвойствоСрокГарантии.СсылкаНаОбъект;
Т.о. обеспечивается корректность ссылки при изменении любых реквизитов объекта и внесение каких-либо изменений при замене значения в код не требуется.
Добавлю для тех, кому лень читать комментарии:
- В (4) я признаю, что методологически этот способ не совсем правильный, т.к. именного для этих задач предназначен ПВХ. Этот механизм я использую в тех случаях, когда бюджет проекта не подразумевает выделения средств для программирования конструкций ПВХ + РС + общий модуль.
- Там же, в (4) я комментирую аналогичную статью на эту тему, автор которой не предлагал описываемый мной вариант. "Баянистов" прошу указывать пруф: до сих пор его нет.
- Решение не предусматривает ведения хронологии. Я до сих пор не сталкивался с такой необходимостью. Нужна хронология - периодический РС + ПВХ.
- Не считаю минусом то, что приходится выгонять всех пользователей ради применения изменений. Подразумевается, что программист ведёт разработку в тестовой базе и уже отлаженный механизм применяет в боевую. Следовательно, выгонять пользователей нужно будет в любом случае и этот случай один.
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Механизмы платформы 1С Разработчик Бесплатно (free)
Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?
16.07.2025 45685 TitanLuchs 109
Работа с интерфейсом WEB-интеграция Механизмы платформы 1С Бесплатно (free)
Веб-интерфейсы повышают качество внешнего вида приложений 1С, предсказуемы с точки зрения верстки, позволяют организовать удобные и высокопроизводительные рабочие места для пользователей. Расскажем об особенностях разработки веб-интерфейсов на React внутри 1С, двустороннем взаимодействии 1С и JavaScript, а также сборке веб-приложения в одностраничный файл.
19.06.2025 18703 zeegin 15
Механизмы платформы 1С Работа с интерфейсом Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).
03.02.2025 26040 bayselonarrend 127
Механизмы платформы 1С Разработчик 1С:Предприятие 8 Бесплатно (free)
В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.
30.01.2025 33329 user2122906 10
Механизмы платформы 1С Файловый обмен (TXT, XML, DBF), FTP Разработчик 1С:Предприятие 8 Бесплатно (free)
Этот материал познакомит вас с механизмом XDTO (XML Data Transfer Objects) в 1С и научит эффективно использовать его возможности. Мы разберёмся, как работать с XML-схемами, создавать модели данных, манипулировать объектами XDTO, а также сериализовать и десериализовать их в XML. Вы узнаете, как использовать XDTO для интеграции с внешними системами, избегать типичных ошибок и оптимизировать код. К концу вы будете уверенно применять XDTO для решения сложных задач обмена данными и автоматизации процессов.
17.01.2025 55833 user2122906 13
Механизмы платформы 1С WEB-интеграция Разработчик 1С:Предприятие 8 Бесплатно (free)
В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.
14.01.2025 46809 dsdred 110
Механизмы платформы 1С Разработчик 1С:Предприятие 8 Бесплатно (free)
Особенности "Знач" и разбор документации к нему.
10.01.2025 26469 VAAngelov 60
Механизмы платформы 1С Разработчик Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.
23.06.2024 40472 bayselonarrend 24
Друзья, логика проста: есть пруф, подтверждающий баянность - статья удаляется. Если вы в кулуарах где-то что-то обсудили на эту тему , извините, это известно только вам. Если решили иначе (через РС, например), то это другое решение со своими плюсами и минусами. Например, пользователь может ввести вторую строку или же при обмене данными они могут задвоиться. Т.е. потенциально это решение может привести к ошибкам.
В автор предлагает аж три решения. Первое и третье - модификация стоящих на поддержке объектов, посему лично для меня неприменимо. Второе решение: ПВХ + РС + код. Оно сложнее в реализации и содержит те же потенциальные ошибки, что я описывал выше применительно к РС.
ps: Замечу сам, чтобы быть первым. :) Предлагаемое мной решение методологически верно не на 100%. Какой-нибудь преподаватель УЦ может сказать, что именно для таких случаев со значениями составных типов и создавались ПВХ: они позволяют жёстко определить, что такой-то параметр имеет такой тип, а другой параметр - иной. Возразить могу только то, что элементов в таком справочнике мало, а тип явно указывается в описании. Это не оставляет шансов пользователю накосячить.
Доработаешь статью с учетом рекомендаций из переписки по той публикации - тогда будет здорово.
В частности - про общий модуль с кешированием возвращаемых значений для ускорения работы и улучшения читабельности кода.
Мысль неоднозначной полезности, пожалуй. На моей практике нет таких случаев, когда бы я получал значение такой ссылки много раз за сеанс. Даже если идёт работа в цикле, то логично получить значение в переменную перед циклом и использовать в цикле её.
Если предопределённых элементов в конкретной базе предполагается немного, то можно по-старинке воспользоваться именно Константами... аналогично ОсновнойСклад и ОсновнаяФирма...
в общем не стал заморачиваться с НайтиПоНаименованию().
информация в статье для меня новая, не могу сказать что баян, и в целом реализация мне нравится.
как - то на эту тему не думал . найтиПоНаименованию, найтиПоКоду пока работает )
1) раз справочник все равно служебный и пользователю запрещено добавлять в него элементы, то предопределенные элементы не обязательны и не требуется выгонять пользователей при добавлении нового элемента. Сама же ссылка настройки без проблем получается через НайтиПоКоду
2) Нет возможности учета истории. Часто история все же нужна. Для этого есть доп. периодический регистр сведений.
Пользователь к ошибкам привести не может, т.к. прав интерактивного редактирования РС у него нет.
3) Еще, если добавить в РС группу пользователей можно разграничивать настройки между пользователями. Для общих настроек - все пользователи.
В типовых, когда изменения конфигурации запрещены, использовал ХранилищеЗначения в типовых справочниках хранения настроек. Нет контроля ссылочной целостности, но лучше чем НайтиПоКоду и настраивать можно.
К пункту 1. Поскольку добавление нового элемента всегда связано с изменением кода (нет смысла добавлять новый элемент, если на него нигде нет ссылок, а ссылки для этой задачи могут быть только в коде), то какая разница для чего выгонять пользователей - только для обновления кода конфигурации, или для изменения кода конфигурации плюс добавление нового предопределённого элемента?
2. Историю вполне можно хранить в табличной части справочника, добавив реквизит "Период".
3. Права доступа можно при необходимости организовывать - в еще одной табличной части.
Донг = Справочники.Валюты.ПолучитьСсылку(Новый УникальныйИдентификатор("..."));В любом случае такого рода приемов подразумевает инициализацию подобных элементов в новой базе, либо использование ее только в семействе уже инициализированных баз с общими данными этого типа.
Если появиться новый пользователь один раз ему поставить эти значения и ВСЁ.
На крайний случай искать через ПОПЫТКУ по наименованию.
И лесть в конфигурацию?
В результате можно хранить как одиночные значения (на замену константам), так и списки этих значений, в том числе упорядоченные.
Периодичность значений пока не требовалась, но допилить не сложно.
Если руки дойдут, может выложу и свой вариант :)
А вообще если говорить про обычные формы, во всех конфигурациях есть РС "Сохраненные значения", в управляемых формах стал пользоваться хранилищами значений.
Но, как уже было замечено, нельзя "про запас" накидать предопределенных элементов, нужно при возникновении потребности лезть в конфигуратор. При наличии РИБ - и не в один. Чем не вариант добавить ПВХ (пользователю недоступный), в котором на лету создавать необходимые записи и в коде нетленных отчетов\обработок ссылаться через (чую смерть моя близка!) НайтиПоНаименованию (или Коду) на свежесозданный элемент ПВХ...
PS. ПВХ в твоем полном распоряжении, изменил чего - ну кто тебе доктор...
PPS. Если группа разработчиков - и так должно быть понятно к каким последствиям может привести правка Наименования (Кода) именно этого ПВХ...
PPPS. Вместо ПВХ никто не запрещает использовать Справочник, как у автора...
PPPPS. При желании можно привязать историю правок...
Как ссылаться на конкретный элемент? НайтиПоРеквизиту или даже запросом?
Как убедиться, что нужный параметр присутствует в РС?
Как убедиться, что нужный параметр присутствует в одном экземпляре?
Не вижу плюсов данного варианта при наличии такого количества минусов.
Ссылку на строковое значение объекта мы заменяем на ссылку на строковое значение регистра. Суть не меняется.
При чём тут преподаватели или руководители отдела? Это наглядный пример задействования объекта, предназначенного для одних нужд, для реализации других. Я склонен считать такое решение методологически некорректным. Из практики 1С не могу вспомнить конкретные примеры, но из практики IT помню, как один клиент хранил важные документы в "корзине". До тех пор, пока другой, не подозревая об этом, не очистил "корзину". Аналогия, думаю, понятна. Удачи.
Справочники.МойСправочник.МоеНазвание"Выбрать Ссылка Из Справочник.МойСправочник Где Наименование = ""МоеНазвание"""Справочники.МойСправочник.НайтиПоНаименованию("МоеНазвание");(34)
(37)Если мягко сказать вы неправы. Во первых наименование, это такая вещь, когда каждый пользователь может просто добавить туда пробел и ваш код перестанет работать. За работу с поиском по наименованию, били по рукам, еще во времена 77 и предопределенные элементы нужны как раз для того, что бы их заменить. Во вторых это
равносильно
"Выбрать Ссылка Из Справочник.МойСправочник Где Наименование = ""МоеНазвание"""
и равносильно
Справочники.МойСправочник.НайтиПоНаименованию("МоеНазвание");
тоже мягко говоря не так
(42) DrAku1a, методологически Вам нет оправдания. Нежелание включать возможность изменения для объектов не должно приводить к созданию таких некорректных решений. Эмулируем регистр сведений при его жизни? Игнорируем RLS? Я считаю, не стоит.
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 294052
Создание 28.07.14 14:26
Обновление 18.08.14 13:16
Просмотры 13148
Загрузки 0
Рейтинг
35
Комментарии 43
Код открыт Не указано
Рубрики Механизмы платформы 1С
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)