Как отказаться от использования НайтиПоНаименованию() и НайтиПоКоду() в уже работающих наполненных базах при дальнейшей разработке.

29.05.14

Разработка - Механизмы платформы 1С

Как научиться не использовать НайтиПо...() в коде, начать заводить друзей среди программистов и перестать беспокоиться о жизнеспособности своего кода.

Если вы встречали в коде конструкции типа

Справочники.Номенклатура.НайтиПоНаименованию("Большая круглая фиговина 1мм");
Документы.РеализацияТоваровУслуг.НайтиПоКоду("00000000001");

то вы, возможно, вкушали последствия использования таких "образцов идеального кода".

Лично я не один и даже не десять раз наталкивался на последствия хардкодинга в виде использования функций НайтиПоКоду(), НайтиПоНаименованию() и НайтиПоНомеру() с зашитыми в коде значениями. Последствия всегда плачевные, их диапазон весьма широк - недоумение "почему оно не работает" или "почему в документе пустые реквизиты, вчера всё работало", необходимость куда-то лезть и менять прописанные значения, красные глаза от поиска в километрах кода той самой заветной строчки, а иногда и возможность интересно провести ночь за удалением/исправлением неправильно перенесённых/сгенерированных данных.

Всю гамму чувств от таких последствий не передать, могу только понадеяться, что для программистов, которые пишут код, не задумываясь о последствиях, есть отдельный котёл в аду.

Лучше напишу о том, как избежать использования этих конструкций в коде.

 

Первый способ,

который подсказывает Капитан Очевидность - это использование предопределённых элементов. Если вам в коде нужно сослаться на валюту Рубль и ни на какую другую - создайте предопределённый Рубль в справочнике "Валюты". На этом способе даже не останавливаюсь, потому что он, надеюсь, понятен всем. Минус такого способа в том, что он не применим в базе, которая уже наполнена данными. Т.е. если в базе уже есть непредопределённый Рубль, то вы же не будете добавлять предопределённый и перебивать все ссылки в базе с одного Рубля на другой? Очень надеюсь, что такая мысль не придёт вам в голову.

 

Второй способ.

Для версий ниже 8.3. Долгое время и весьма успешно для искоренения НайтиПо...() из написанного до меня кода я использовал ПланВидовХарактеристик и РегистрСведений.

Допустим, какой-то нехороший человек до вас в коде написал:

 

Документ.Валюта = Справочники.Валюты.НайтиПоНаименованию("Рубль");

 

Тогда вы берёте и, не переставая молиться за спасение души этого человека, создаёте ПланВидовХарактеристик "СлужебныеПеременные" (типы значений выбираете в нашем случае справочник "Валюты") и РегистрСведений "ЗначенияСлужебныхПеременных" (непериодический, неподчинённый) с измерениями "Переменная" (тип ПВХСсылка.СлужебныеПеременные) и "Значение" (тип Характеристика.СлужебныеПеременные). Дальше в ПВХ создаёте предопределённый элемент Валюта_Рубль, а в РС запись - Валюта_Рубль = Рубль (выбираете из справочника "Валюты"). После этого идёте в код и пишете

//Документ.Валюта = Справочники.Валюты.НайтиПоНаименованию("Рубль");
Документ.Валюта = ПолучитьЗначениеСлужебнойПеременной(ПредопределенноеЗначение("ПланВидовХарактеристик.СлужебныеПеременные.Валюта_Рубль"));

// функция по получению значения служебной переменной
Функция ПолучитьЗначениеСлужебнойПеременной(Переменная, ЗначениеПоУмолчанию = Неопределено) Экспорт
	
	// вернём, если ничего не найдём
	прВернуть = ЗначениеПоУмолчанию;
	
// в запросе получаем значение переменной Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | ЗначенияСлужебныхПеременных.Значение |ИЗ | РегистрСведений.ЗначенияСлужебныхПеременных КАК ЗначенияСлужебныхПеременных |ГДЕ | ЗначенияСлужебныхПеременных.Переменная = &Переменная"; Запрос.УстановитьПараметр("Переменная", Переменная); Результат = Запрос.Выполнить().Выбрать();
// если запрос что-то вернул, то это и есть значение переменной Если Результат.Следующий() Тогда прВернуть = Результат.Значение; КонецЕсли; Возврат прВернуть; КонецФункции

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

Плюс такого подхода - это совершенно отдельно стоящий механизм, который не влияет на типовые механизмы и не затрагивает типовые объекты метаданных.

Минус - да, должен быть заполнен регистр сведений, без него никуда. Здесь можно посоветовать при начале работы системы под админскими правами сверять количество служебных переменных в плане видов характеристик и количество записей в регистре "Значения служебных переменных" и, если какие-то переменные не заполнены - выдавать что-нибудь грозное и устрашающее, пусть заполняют. Ещё можно создать обработку автоматического заполнения регистра. Как заполнять? А с помощью тех самых ненавистных мне НайтиПоКоду("000001") - а что делать, ради такого благого дела можно их и потерпеть ещё разик :) Для особо пугливых можно просто использовать этот механизм как основной, а НайтиПо...() не удалять, а оставить как дублирующий, на всякий случай.

 

Третий способ.

Для версий от 8.3 - неожиданное продолжение первого способа с помощью новых технологий.

В платформе 8.3 появилась интересная возможность переназначать, удалять и всячески извращаться над предопределёнными элементами. Т.е. тот самый Рубль, который непредопределённый, можно просто сделать предопределённым! Не знаю как вы, я вначале не поверил, когда узнал, что так можно. Но оказалось, что да, действительно, докатились, теперь и в мире 1С нет ничего постоянного и надёжного. Но в данном случае это даже хорошо - мы можем, обойдясь подножными средствами, отделаться от НайтиПо...()

Итак, что нужно?

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

Теперь создаём новую обработку, в ней форму, в форме создаём процедуру ПриСозданииНаСервере(), там пишем

 

&НаСервере
Процедура ПриСозданииНаСервере(Отказ)
	
	// лишаем предопределённый рубль его предопределённости
	Валюта = Справочники.Валюты.НайтиПоКоду([Код_Предопределённого_Рубля]).ПолучитьОбъект();
	Валюта.ИмяПредопределенныхДанных = “”;
	Валюта.Записать();
	
	// освободившуюся предопределённость отдаём старому рублю
	Валюта = Справочники.Валюты.НайтиПоКоду([Код_НЕ_Предопределённого_Рубля]).ПолучитьОбъект();
	Валюта.ИмяПредопределенныхДанных = “Рубль”;
	Валюта.Записать();
	
КонецПроцедуры

 

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

 

UPD:

Навеяно комментариями к статье.

В комментариях многие предлагают использовать метод ПолучитьСсылку("уид-того-что-нам-надо") с зашитым в тексте программы УИДом. Но, как и любая разновидность Г-кода, хардкодинг (зашивание значений в код) имеет множество недостатков и кажется мне непримлиемой. Фактически предлагается избавиться от одного хардкодинга другим, мотивируя это тем, что, якобы уид ссылки никогда не меняется. На деле же, как и любой Г-код, это - быстрая и дешёвая заплатка, сделанная на коленке.

Во-первых, УИД может поменяться - не УИД той ссылки, которую мы используем, а сам элемент, который мы используем. Например, раньше нам нужен был УИД элемента справочника Типы цен "Розничная", а теперь нужен "Розничная СПБ". Конечно, нужно лезть в код и менять, а до того система будет работать не так, как нужно.

Во-вторых, можно забыть о тестовых базах - не получится просто взять cf от конфигурации и накатить её на демо-базу и вести разработку там, просто перенося изменения в рабочую. Как раз сейчас работаю на проекте, где изначально было две базы - рабочая и тестовая, создавались они не из одного dt, а независимо друг от друга, соответственно, все УИДы разные. Пытаюсь вести разработку в демо-базе, но каждый раз, когда на тыкаюсь на все эти УИДы, не могу не пожелать долгой и мучительной смерти тому, кто всё это рисовал.

В-третьих, строка

ПолучитьЗначениеПеременной(ПредопределенноеЗначение("ПВХ.Переменные.ТипЦены_Розничная"))

явно читабельнее, чем строка

Справочники.ТипыЦен.ПолучитьСсылку("с3фацфмыф-ф23аф23аф0-2й3укфафц0-23к2к")

Кто-то писал, что это исправляется добавлением комментария, но всё это из области фантастики - я в своей работе ни разу не встречал комментарий рядом с УИДом.

НайтиПоКоду НайтиПоНаименованию НайтиПоНомеру красивый код

См. также

Сервисы интеграции без Шины и интеграции

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    2525    dsdred    16    

57

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    5796    dsdred    53    

82

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    5785    YA_418728146    25    

67

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6914    dsdred    36    

113

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18991    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12664    human_new    27    

76

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    9331    YA_418728146    6    

143

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

20.08.2023    6509    sebekerga    54    

95
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
73. EvilDoc 176 02.05.14 22:03 Сейчас в теме
(71) хтя да... ты прав. Свойство придется искать(( при чем и в пвх и в справочнике. Тут подумать надо
+
74. MadMix 02.05.14 22:40 Сейчас в теме
(73) EvilDoc, все уже придумано до нас и описано в комментариях выше - использовать отдельный механизм ПВХ + РС/справочник. Либо использовать предопределенные элементы. Либо использовать константы.
Можно использовать и связку СвойстваОбъектов/ЗначенияСвойствОбъектов, но создавать предопределенный элемент в ПВХ все равно придется.
+
76. alex_sayan 03.05.14 09:39 Сейчас в теме
А еще есть вот такие предопределенные функции, позволяющие решить аналогичную задачу:
XMLСтрока(<Значение>) 
XMLЗначение(<Тип>, <СтрокаXML>)
+
77. nixel 1408 05.05.14 10:50 Сейчас в теме
(76) puzakov, это тот же вариант с УИДом только в профиль.
for_sale; +1
78. meier8th 05.05.14 14:08 Сейчас в теме
(77) nixel, +1. то же самое
+
81. for-elenak 11 08.05.14 07:00 Сейчас в теме
Дорогие граждане-товарищи! Пожалуйста, используйте НайтиПоКоду и НайтиПоНаименованию только для ваших коротковременных нужд! Не оставляйте эту лажу кому-то в наследство! Намучилась с этим вволю! Наши пользователи не знают, что какой-то код или наименование элемента справочника вы зашили в код вашей обработки или отчета. И ВСЕГДА найдется изобретатель, который изменит его "под себя". В своей практике использую различные решения. Соответственно задаче. Это и Константы, и предопределенные элементы справочников, и регистры сведений, и даже специальные справочники, в которых храню такие значения...Все зависит от многих факторов. Версия автора имеет право на жизнь. Этот вариант мною тоже уже давно и довольно успешно используется
Bukaska; agrustny; for_sale; +3
82. agrustny 19 08.05.14 09:17 Сейчас в теме
(81) for-elenak, Вы умничка=)
Более общё: уважаемые представители ЛГТБ, пишите G-код за пределами РФ, пожалуйста)))
for_sale; for-elenak; +2
85. for_sale 971 21.05.14 14:35 Сейчас в теме
Всем, кто радел за способ ПолучитьСсылку() и рассказывал сказки про комментирование - посвящается!
Щас вот буквально столкнулся с конфигурацией, где повсеместно используется этот способ. Конечно же, нигде ни одного комментария нет, везде в коде

ПланыВидовХарактеристик.ПВХ.ПолучитьСсылку(Новый УникальныйИДентификатор("Хер-его-маму-знает-что-за-элемент")).

Просто офигенный способ - сиди разбирайся с красными глазами, где что, плюс ещё тестировать в отдельно стоящей базе нельзя, нужно всё наживую делать. Отличный способ! В результате за пять минут создал ПВХ и РС и теперь где в коде встречаю эту ахинею - заменяю на предопределённые элементы, а при отладке заполняю в пользовательском режиме. Делов-то на полминуты вместо разборок каждый раз, что за элементы передо мной, да ещё и нервы целы.

Повторяю, Г-код вообще и хардкодинг в частности - это всегда дёшево и сиюминутно.
Bukaska; +1
86. ShantinTD 91 21.05.14 15:23 Сейчас в теме
(85) for_sale, чуть в сторону: про Г-код, а не про предопределенные элементы. История такая: видел конфу на 7.7, разработанную для сети из 10(!) магазинов. В документе были колонки Магазин1, Магазин2,..., Магазин10. А потом количество магазинов поменялось... Продолжать не стану.
+
87. for_sale 971 21.05.14 15:39 Сейчас в теме
(86) ShantinTD, да, это реалии. А потом такой человек сидит на форуме и пишет о том, что нужно грамотно применять НайтиПо() и что если использовать ПолучитьСсылку(), то получится быстрее.
ShantinTD; +1
88. agrustny 19 21.05.14 16:35 Сейчас в теме
91. Bukaska 140 30.05.14 12:58 Сейчас в теме
89. vicmos 42 30.05.14 11:27 Сейчас в теме
Интересная статейка, но к сожалению ни о чем, откройте регламентированную отчетность и посмотрите, как она формируется, в упр. учете это сплошь и рядом, "здесь играем, а здесь рыбу заворачиваем", а так плюс только за потраченное время
+
90. for_sale 971 30.05.14 11:38 Сейчас в теме
(89) vicmos, откройте любую самописную конфу и посмотрите как там всё написано и давайте теперь тоже так делать. Зачем равняться на то, что написано не самым лучшим способом? А в типовых, особенно в старых, на обычных формах, тысячи мест, где код написан спустя рукава - так что ж теперь, только из-за этого и себе такой же код писать?
+
92. vicmos 42 30.05.14 16:46 Сейчас в теме
(90) for_sale, Извините, с самописками не работаю, с типовыми хлопот хватает, не считая Хомнет, Инталев и прочими, просто статья ни о чем, разговор идет не о реализации решения задачи, а о предметной области, правила хорошего тона написания кода учат в ВУЗЕ.
+
93. for_sale 971 30.05.14 17:04 Сейчас в теме
(92) vicmos,
разговор идет не о реализации решения задачи

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

не подскажете, в каком именно ВУЗе учат хорошему тону написания кода на 1С?
ShantinTD; Bukaska; +2
97. Bukaska 140 02.06.14 10:07 Сейчас в теме
(93) for_sale, ИМХО.. но по 1С Высшей школы нет.. а только опыт, опыт и ещё раз опыт)))
+
98. for_sale 971 02.06.14 10:25 Сейчас в теме
(97) Bukaska, полностью согласен, только не каждому умнику это объяснишь.
Иногда смотришь на комментарии к какой-нибудь статье и представляешь себе большую городскую площадь, куда все выходят не для определённой цели, а просто пройтись, на людей посмотреть и, конечно же, себя показать. :)
+
99. Bukaska 140 02.06.14 10:37 Сейчас в теме
(98) for_sale,
и, конечно же, себя показать. :)

Куда ж без этого)))) Это святое)))
+
102. Dimkasan 04.06.14 06:48 Сейчас в теме
(93) for_sale, хорошему тону просто написания учат почти во всех вузах. Беда только в том, что не все этому учатся.
ShantinTD; +1
103. for_sale 971 04.06.14 08:29 Сейчас в теме
(102) Dimkasan, вот именно - учат и учатся - это две разные вещи. На деле большинство, особенно в сфере 1С, не знают ни то, что хорошего тона написания, а даже того, что такой тон есть. И когда начинаешь им о нём рассказывать, начинают смеяться и говорить - да ну, оно ж и так работает, зачем нам ещё думать?
Dimkasan; for-elenak; Bukaska; +3
104. ShantinTD 91 04.06.14 11:15 Сейчас в теме
(103) for_sale, это то и печально. У нас один преподаватель в ВУЗе называл подобный код "душераздирающим". =) У меня термин прижился.

(101) sanek_gk,
Поменяли "постоянный элемент" - получи сообщение об этом и расчеты не могут быть продолжены.

А если на этот "постоянный элемент" завязаны некие автоматические и периодические вычисления? А если сотрудник, ответственный за этот "постоянный элемент", в отпуске/болеет/уволился?
Можно, конечно, написать письмо. Но, например, у меня постоянный адрес (который не поменяется в сколько-нибудь обозримом будущем) только один - техподдержка. Сотрудники техподдержки (в том числе - я) не должны лезть в те вопросы, которые от них не зависят. Программист ли должен лезть в справочник и переименовывать элемент обратно? ИМХО - нет. Как захотели - так и назвали. Спасение утопающих - дело рук самих утопающих. Программист должен помочь пользователю (не обязательно каждого за ручку подводить, можно мануал написать), объяснить ему в чем он не прав. Но переделывать за пользователя - вот уж дудки...
Это я все к тому, что иногда приходится вносить некоторые решения, которые позволят обойтись меньшими жертвами. Если конфа уже снята с поддержки, то добавление предопределенных элементов - не самый плохой вариант.
for-elenak; +1
94. Armando 1399 30.05.14 21:56 Сейчас в теме
Комменты не читал - много.
Уже сказали, что Справочник.Валюты.Рубль и Справочник.Валюты.ПолучитьСсылку() на SQL отрабатывают абсолютно одинаково?
Я не призываю использовать ПолучитьСсылку(), просто информирую.
Хотя сам кое где использовал))
+
95. for_sale 971 30.05.14 22:05 Сейчас в теме
(94) Armando, да, но у ПолучитьСсылку есть большие недостатки, которые я даже из комментов в статью вынес.
+
96. Radkt 31.05.14 23:54 Сейчас в теме
Интересная статейка, но по моему выхода из ситуации кроме как создания нового рег сведений нет. Все остальное либо не универсально, либо замедляет работу и опять же требует снимать объект с поддержки(3 способ).
+
113. pacas 9 10.06.14 10:21 Сейчас в теме
Мне нужно написать обработку табл.части Округлить Профвзносы (Профсоюзные взносы).Это в программе ЗУП 8
В плане видов расчета Удержания-в виде расчета Профвзносы поставил код "ПР"
Пишу в коде чтобы найти нужный вид расчета:

Профвзносы==ПланыВидовРасчета.УдержанияОрганизаций.НайтиПоКоду("ПР");//Профвзносы

Как еще можно обойти этот поиск нужного элемента или в данном случае НайтиПоКоду()является правильным решением?


Программа не должна быть снята с поддержки
+
119. for_sale 971 11.06.14 09:05 Сейчас в теме
(113) pacas, если нельзя снимать с поддержки, тогда нормальный способ, другого всё равно не получится.
+
121. -fox- 11.06.14 10:29 Сейчас в теме
(113) Так можно же установить режим "Редактирование с сохранением поддержки" и воспользоваться любым из способов (26), (2) ....
В обработке всегда можно завести реквизит и сохранять его.
+
128. for-elenak 11 13.06.14 11:54 Сейчас в теме
(113) pacas, если совсем никак не снимается с поддержки, тогда вполне нормальное решение.Но в таких случаях я стараюсь добавить соответствующее предостережение в Справку..а иногда и на форму (чтобы сразу было видно если что)
+
129. pacas 9 16.06.14 09:30 Сейчас в теме
(128) for-elenak, А я сейчас так делаю, если такого элемента не найдено,то вылетает окошко в котором рекомендуется проставить код в нужный вид расчета.
for-elenak; +1
131. for-elenak 11 17.06.14 03:25 Сейчас в теме
(129) pacas, Ну, может быть в крайних случаях этот метод приемлем... Только я все же больше люблю не коды и наименования, а ссылки. Причины уже описывала. Случаи переименования и изменения кодов сформировали мое стойкое мнение
+
120. miniogn 23 11.06.14 10:12 Сейчас в теме
Зашел в базу найти Найти извините за тавтологию :)

Вот, что увидел (франчи при внедрении написали)

Справочник = Справочники.СотрудникиОрганизаций.НайтиПоНаименованию(Элемент.ТекущаяСтрока.Сотрудник.Наименование).ПолучитьОбъект();
...
Справочник.Записать();


В при том в базе есть внутренние совместители с тем же физлицом и ФИО и даже есть полные тезки...
Как мне это развидеть ...
+
122. miniogn 23 11.06.14 10:30 Сейчас в теме
Третий способ, по факту это первый способ, только в 8.2 еще поиск и замена ссылок обработкой. Но да в 8.3 удобно без всякой обработки.


Но придерживаюсь предложенного выше способа с дополнительным справочником:

СсылкаРубль = Справочник.ОченьПредопределнныеЭлементы.Рубль.Значение;


В таком виде проблем с обновлением вообще никаких нет. Создали и забыли.

+
132. ShantinTD 91 17.06.14 10:13 Сейчас в теме
Про случай изменения кода: звонок
- Здравствуйте. Нам нужно для Рубля поменять код. У нас 643, нам нужен другой.
- Можно и поменять. Но разве не такой должен быть?
- НАМ НУЖНО ДРУГОЙ КОД ДЛЯ РУБЛЯ!!!

Помню только, что вместо 643 кода они попросили поставить им совершенно другой. Даже не старый 810. =)

Переименовать из "рубль" в "руб." видимо смогли сами, а вот код поменять - не догадались куда нажимать.
Как теперь найти рубль? По коду или по наименованию?
for_sale; Bukaska; +2
133. Bukaska 140 17.06.14 10:23 Сейчас в теме
(132) ShantinTD, Спасибо)) Посмешил)))
Отвечу.. Выковыривать по уникальному идентификатору(х.з. его маму знает что за элемент)
Но другого варианта я не вижу)))
+
134. zqzq 23 18.06.14 08:42 Сейчас в теме
(132) ShantinTD, лучше искать через константу ВалютаРегламентированногоУчета ;)

Советы использовать уникальный идентификатор это вообще без комментариев, перечитайте статью и комменты выше.

Вообще мой вывод:
1) Для конфигурации с поддержкой - ПВХ(предопределенные элементы, с иерархией групп)+РС как в статье для минимизации изменений и простоты обновлений. При начале работы системы можно проверять на заполненность и выдавать предупреждения / заполнять по умолчанию.
2) Для нетленки предопределенные элементы, т.к. всё-таки проще работа с ними. Константы менее удобны в плане поиска, но более гибкое решение (та же ВалютаРеглУчета может быть и не рубль).
for_sale; Bukaska; for-elenak; +3
135. for-elenak 11 18.06.14 09:47 Сейчас в теме
(134) zqzq, Я бы все же не стала "влезать" в процедурку "При начале работы системы". Обычно просто добавляю общий модуль, который как раз ищет и создает если нужно. А обращение к нему уже прописываю в нужных местах.
+
136. for-elenak 11 18.06.14 09:48 Сейчас в теме
(134) zqzq, С п.2 солидарна на 100%
+
137. lrs 27 07.07.14 16:41 Сейчас в теме
Я использую регистр сведений ЗначенияПеременных. Изменения Имя (Строка), Значение (ЛюбаяСсылка)

В модуле менеджера пишем функцию:
//  Имя - в формате Спрвочник.[Имя справочника].[Имя предопределенного элемента]
Функция ЗначениеПеременной(Имя) Экспорт
	СтрокаМассив = СтрЗаменить(Имя, ".", Символы.ПС);
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	ЗначенияПеременных.Значение
	|ИЗ
	|	РегистрСведений.ЗначенияПеременных КАК ЗначенияПеременных
	|ГДЕ
	|	ЗначенияПеременных.Значение Ссылка " + СтрПолучитьСтроку(СтрокаМассив, 1) + "." + СтрПолучитьСтроку(СтрокаМассив, 2) + " И ЗначенияПеременных.Имя = &Имя";
	Запрос.УстановитьПараметр("Имя", СтрПолучитьСтроку(СтрокаМассив, 3));
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() тогда
		Возврат Выборка.Значение;
	Иначе
		Возврат Неопределено;
	КонецЕсли;
КонецФункции
Показать


В регистре делаем запись Измерение = "Рубль", Значение = Рубль

Обращение:
РегистрыСведений.ЗначенияПеременных.ЗначениеПеременной("Справочник.Валюты.Рубль")


Примечание. Вместо Справочник можно использовать любой тип метаданных Документ, БизнсПроцесс, в том виде как он используется в синтаксисе запроса ("ЗначенияПеременных.Значение Ссылка Документ.РеализацияТоваровУслуг").

Преимущества перед Справочником и ПВХ с регистром: 1. Элементы можно добавлять на лету не влезая в конфигуратор.
2. Так же элементы различных типов могут иметь одинаковое имя, и не надо выдумывать идентификаторы типа Контрагенты_Основной, Банки_Основной и пр.
3. Строка обращения по смыслу сходна к обращению к предопределенному элементу: "Справочники.Валюты.Рубль" почти то же что "Справочник.Валюты.Рубль".
+
138. for_sale 971 07.07.14 19:52 Сейчас в теме
(137) lrs, супер! чтобы избавиться от строк мы одни строки меняем на другие строки! :) а потом с чистой совестью и чувством выполненного долга идём на хабр удивляться, почему одинэсников за программистов не считают!
+
139. lrs 27 08.07.14 09:51 Сейчас в теме
(138) for_sale. Уточните к какой части моего сообщения у Вас возникла претензия? Либо Вы не разобрались, либо раскройте суть Вашего сообщения...
+
140. 1cmax 152 03.08.14 09:29 Сейчас в теме
Зачастую, когда нужно сделать существующий элемент справочника фиксированным для конфигурации и защититься от изменения кода и наименования создавал константы (которым и присваивается значение этого элемента справочника) проблем не возникало никогда, конечно с пвх более универсально, но к константам быстрее в коде обратиться и позволяет делать изменения не затрагивая справочник :)
+
142. for_sale 971 03.08.14 21:23 Сейчас в теме
(140) 1cmax, если написать функцию по получению значения, то в коде тоже можно будет быстро обращаться.
А справочник всё равно не типовой, так что его изменения ни на что не влияют, даже реструктуризация будет в обоих случаях, что с константой, что со справочником.
+
141. validat 1 03.08.14 13:28 Сейчас в теме
Половины я тут не понял, но из практики много раз сталкивался, что какая-нибудь обработка,
не находит какой-то параметр и выводит ошибку Параметр не заполнен или что-то
не обнаружено (здесь, например, http://forum.infostart.ru/forum42/topic98824/) или
вот ещё в стандартной конфигурации, непонятно почему, поиск с сохранением настроек,
эти настройки поиска сбрасываются при перезапуске (http://forum.infostart.ru/forum42/topic114599/).
Если не в тему, извиняюсь.
+
143. leasing 5 09.08.14 23:42 Сейчас в теме
Если необходимо поддержать неизменность значения записи справочника, и нет возможности завести предопределенный элемент, то надо использовать ограничение прав доступа к данным, включая RLS. И код не откажет.
+
144. for_sale 971 10.08.14 11:16 Сейчас в теме
(143) leasing, это если вы предполагаете, что код или наименование никогда не изменится по объективным причинам. Но бывает, что код и наименование действительно нужно изменить. Что-нибудь вроде добавления префикса "(не использовать)" или "старый" да мало ли какие ещё бывают причины, это только те, которые я лично встречал в базах.

Вообще, после почти 150 комментариев вижу, что действительно предложенный мною вариант действенный и подходит на все случаи жизни - сколько уже всяких предложений и причин выдвигалось на тему того "что за хрень ты пишешь", но ещё ни одной, которая была бы не оторвана от жизни, или была также универсальна, или покрывала плюсами минусы.
+
145. leasing 5 10.08.14 14:25 Сейчас в теме
(144) for_sale, уважаемый автор, я не возражаю против вашего подхода к программированию и вашего предложения по обходу проблемы некачественного кодирования. Поэтому не будем ломать копья.

Я лишь хотел высказать мнение, что от использования НайтиПоНаименованию() и НайтиПоКоду() в уже работающих наполненных базах при дальнейшей разработке отказываться вовсе не обязательно. Если, при этом, одновременно установить защиту от НЕСАНКЦИОНИРОВАННОГО изменения записи. Санкционированные же изменения, о которых вы упоминаете, не приводят к тем плачевным последствиям, что вы описали во вводной части статьи. Ибо производятся "кругом ограниченных людей" с пониманием последствий.
Возможно, кому-то, помимо вас, мое замечание покажется уместным. Так что не сетуйте.
+
146. for_sale 971 10.08.14 16:25 Сейчас в теме
(145) leasing, не согласен вот с этим:

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

Главбух или финдир вполне себе входят в "круг ограниченных людей" и вполне себе меняют наименования и коды в хвост и в гриву (сейчас работаю с базой, в которой статьи оборотов недавно пополнились целым списком элементов, а у старых поизменяли коды и наименования), при этом они совершенно не обязаны знать и иметь в виду то, что у вас там где-то висят на волоске целые механизмы, привязанные к НайтиПо().

Это не в качестве ломания копий, а относительно конкретного случая.
+
147. leasing 5 10.08.14 22:34 Сейчас в теме
(146) for_sale, прошу прощения- хотел сострить, да не получилось.
""Кругом ограниченных людей" с пониманием последствий" надо понимать БУКВАЛЬНО.
Если не понимают последствий, как в вашем примере главбух и финдир, то им нельзя доступ дать. Я вам больше скажу, иногда полезнее вообще не подпускать к учету отдельных гл. бухов и финдиров. Вы наверняка, как и я, сталкивались с такими особями.
Короче, под "кругом ограниченных людей с пониманием последствий", я имел в виду нас- программистов.
+
148. leasing 5 11.08.14 18:22 Сейчас в теме
(146) for_sale, еще одну ремарочку, если позволите.

Некогда, на 7-ке, предохранитель от описанных вами неприятностей, я делал вот так.
СпрСтат= СоздатьОбъект ("Справочник.СтатьиРасходовУслуг"); 
Если  СпрСтат.НайтиПоНаименованию ("Оформление тура",0,1) = 0 Тогда 
     Сообщить ("В справочнике Статьи расходов  по услугам  пропала запись Оформление тура. Восстановите ее!");   
     Возврат;
КонецЕсли;  
СпрТА = СоздатьОбъект("Справочник.Турагенты");
Если СпрТА.НайтиПоНаименованию("Прочие",0,1) = 0 Тогда 
      Сообщить ("В справочнике Турагенты пропала запись Прочие. Восстановите ее!");
      Возврат;
КонецЕсли;
Показать


+
149. for_sale 971 11.08.14 17:36 Сейчас в теме
(148) leasing, эта ремарочка полностью вписывается в концепцию использования зашитых в код строк. И статья как раз о том, как избежать такого использования и, попутно, всяких таких ремарочек и прочих костыликов.

Т.е. у меня претензия не к самой ремарочке, а к самому её существованию, к вызвавшему её из небытия хардкодингу.
+
151. sigmov 29.08.16 11:02 Сейчас в теме
Спасибо! Хорошая статья.
Встречал и более экзотические случаи а-ля
Если ВРег(Лев(ПолучитьЗаголовокСистемы(), 6)) = "СИНТАН" Тогда ... 


Вот только регистр сведений на мой взгляд лишним является.
Потому как измерение регистра у вас всего одно, а периодичными значения не являются.
И желательно еще кешировать значения.
+
152. for_sale 971 09.09.16 14:53 Сейчас в теме
(151) sigmov, насчёт регистра спорить не буду, потому что не обладаю замерами на разных вариантах, поэтому вполне возможно, что есть более оптимальные варианты.
Про кэширование - что именно вы имеете в виду?
+
153. Shrike 6 16.09.16 11:13 Сейчас в теме
Можно просто завести регистр сведений, например "Значения_Констант". Изменение - Имя(строка), ресурс - Значение(составной тип) .
В модуль менеджера
Функция ПолучитьЗначениеКонстанты(ИмяКонстанты) Экспорт

Отбор = Новый Структура;
Отбор.Вставить("ИмяКонстанты", ИмяКонстанты);
СтруктураЗначений = РегистрыСведений.Значения_Констант.Получить(Отбор);

пРезультат =?(ЗначениеЗаполнено(СтруктураЗначений.Значение), СтруктураЗначений.Значение, Неопределено);

Возврат пРезультат;

КонецФункции
И Значение = РегистрыСведений.Значения_Констант.ПолучитьЗначениеКонстанты("ИмяЗначения");
154. for_sale 971 01.10.16 10:20 Сейчас в теме
(153) Shrike, почитайте вначале про примитивные типы данных в измерениях регистра сведений. И про приколы с правами при использовании [РегСведений].Получить(Отбор)

Читая большинство комментариев, иногда создаётся впечатление, что попал на соревнование "Изобрети СВОЙ велосипед или умри"))
+
155. Lancelot-2M 115 23.04.19 10:56 Сейчас в теме
156. unichkin 1563 16.10.20 20:42 Сейчас в теме
При поиске по РегистрСведений.ЗначенияСлужебныхПеременных следует учесть, что значение может быть и не задано. В этом случае удобно использовать получение пустой ссылки нужного типа от элемента ПВХ. Для той-же валюты например - если элемент не задан, то код из статьи вернет неопределено. И если далее надо получать реквизиты этой валюты, 1С логично уйдет в исключение.
На коленке -
Если РезультатЗапроса.Пустой() Тогда
Результат = Переменная.ТипЗначения.ПривестиЗначение();
КонецЕсли;

Не на коленке - получать тип значения ПВХ в запросе.
+
157. Anesk 17 14.12.21 13:32 Сейчас в теме
Вот мне интересно, готов ли заказчик платить за использование Плана видов характеристик и регистра сведений
или готов ли заказчик платить за перекидку некоторых ссылок в предопределенные значения.
Мне кажется нет.

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

Из опыта могу сказать
НайтиПоНаименованию лучше не использовать, скорее всего пользователи по незнанию поменяют.
НайтиПоКоду - вариант по лучше, не встречал чтобы пользователи его меняли, а если и меняли то крайне редко.
ПолучитьСсылку(УникальныйИдентификатор) - надежно

Еще бы я посоветовал опираться на быстродействие кода, что гораздо важнее его читабельности и принципа разработки.
Если есть спецы по оптимизации, было бы интересно послушать, что работает быстрее
unknown181538; +1 1
158. пользователь 14.12.21 17:30
Сообщение было скрыто модератором.
...
Внимание! Тема сдана в архив