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

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к")

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

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

См. также

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

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

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

11.03.2024    4434    dsdred    53    

70

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

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

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

24.01.2024    5272    YA_418728146    25    

62

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

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

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

11.12.2023    6389    dsdred    36    

111

1С-ная магия

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

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

06.10.2023    18464    SeiOkami    46    

118

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

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

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

14.09.2023    12074    human_new    27    

74

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

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

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

28.08.2023    8799    YA_418728146    6    

141

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

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

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

20.08.2023    6271    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

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

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15961    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
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 1403 05.05.14 10:50 Сейчас в теме
(76) puzakov, это тот же вариант с УИДом только в профиль.
for_sale; +1 Ответить
78. meier8th 05.05.14 14:08 Сейчас в теме
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 Сейчас в теме
Всем, кто радел за способ ПолучитьСсылку() и рассказывал сказки про комментирование - посвящается!
Щас вот буквально столкнулся с конфигурацией, где повсеместно используется этот способ. Конечно же, нигде ни одного комментария нет, везде в коде

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

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

Повторяю, Г-код вообще и хардкодинг в частности - это всегда дёшево и сиюминутно.
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 1559 16.10.20 20:42 Сейчас в теме
При поиске по РегистрСведений.ЗначенияСлужебныхПеременных следует учесть, что значение может быть и не задано. В этом случае удобно использовать получение пустой ссылки нужного типа от элемента ПВХ. Для той-же валюты например - если элемент не задан, то код из статьи вернет неопределено. И если далее надо получать реквизиты этой валюты, 1С логично уйдет в исключение.
На коленке -
Если РезультатЗапроса.Пустой() Тогда
Результат = Переменная.ТипЗначения.ПривестиЗначение();
КонецЕсли;

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

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

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

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