Контекст любого объекта конструкцией #Если Фамилия Тогда

14.10.22

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

Делаем инициализацию переменной в "своей" инструкции препроцессора, для получения контекстной подсказки объекта через точку. В дальнейшем в компилированном коде сама инициализация игнорируется, т.к. "своя" инструкция препроцессора НИКОГДА не выполняется.

При разработке часто приходиться вызывать методы из общих модулей и передавать в них параметры типа Ссылка или Объект, или часто приходиться делать подписки на события объектов метаданных и работать в них с Источником подписки.

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

Примечание: Сама Контекстная подсказка,  позволяет в процессе ввода текста или при нажатии (Ctr+Пробел) получать список, позволяющий  выбирать нужное свойство, метод, функцию и т.д., что позволяет быстро и правильно набирать тексты модулей. Цветовые выделения в контекстной подсказке свойство, метод, функции …. (Красный – Текущий модуль, Зеленый  – Локальный контекст, Темный   - Глобальный контекст). Также можно донастроить контекстную подсказку в конфигураторе Сервис – Параметры – Модули – Контекстная подсказка.

Этот грустный момент можно поправить инициализировав переменную объекта через несуществующую инструкцию препроцессора. Ниже пример как можно применить в подписке на событие перед записью документа:

Рис.1 Пишем фиктивный блок кода #Если Малышев Тогда ... и получаем возможность через "." точку получить контекст Источника

Такую фиктивную инициализацию можно делать и в других модулях и местах, где при передаче объекта между методами теряется (но нужен!) контекст объекта получаемый через "." точку.

Дальше при реальном выполнении кода решения блок игнорируется, так как инструкция препроцессора не существует (т.е. при разработке/отладки конфигурации можно по умолчанию не удалять при каждом запуске, но для чистоты кода из продуктива всё-таки убирайте, т.к. 1С может внезапно изменить алгоритм компиляции неподдерживаемых дирректив препроцессора, хотя я пользуюсь более 5 лет таким приемом и пока не менялось ничего).

#Если ЛюбоеНеПредопределенноеСловоВЯзыке1С Тогда

   Источник = Документ.РеализацияТоваровУслуг.СоздатьОбъект();

#КонецЕсли

Я ставлю свою фамилию "Малышев" в своём коде, точно зная что её нет в словаре языка 1С, и для удобства дальнейшего поиска в коде. Договоримся на берегу, что дальше каждый в своём коде ставит свою фамилию или ЛюбоеНеПредопределенноеСловоВЯзыке1С... но не мою =)))

Для справки вот информация по использованию директив компиляции и инструкций препроцессора с сайта its.1c.

Снегопат, не прокатил так как он 32х, а сейчас все на 64х клиентах работают.

Можно в 1С:EDT но она требует мощных ресурсов компьютера и пользуются ей сейчас 1-2% разработчиков 1С.

Также другие примеры получения контекстной подсказки:

#Если Сервер И Не Сервер Тогда

   Источник = Документ.РеализацияТоваровУслуг.СоздатьОбъект();

#КонецЕсли

 

Если 1 = 0 Тогда

   Источник = Документ.РеализацияТоваровУслуг.СоздатьОбъект();

КонецЕсли
 
 Другие публикации автора

Ссылка на компетенции по 1С:ERP - команда со знаниями, умениями и успешными проектами

См. также

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

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

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

11.03.2024    3635    dsdred    48    

66

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

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

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

24.01.2024    5045    YA_418728146    25    

62

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

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

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

11.12.2023    6174    dsdred    36    

110

1С-ная магия

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

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

06.10.2023    18205    SeiOkami    46    

116

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

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

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

14.09.2023    11780    human_new    27    

72

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

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

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

28.08.2023    8567    YA_418728146    6    

139

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

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

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

20.08.2023    6207    sebekerga    54    

93

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

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

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

27.06.2023    15546    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. malikov_pro 1288 17.08.20 09:42 Сейчас в теме
Почему не используете Если Ложь Тогда?

По идее нужно увязать с описанием перед функцией/процедурой по формату описания и озадачить разработчиков Snegopat и TurboConf.
Andreeei; olbu; mpudy; herfis; +4 Ответить
2. sapervodichka 6690 17.08.20 10:16 Сейчас в теме
(1) указываю фамилию чтобы искать по конфе и просто в коде красиво выглядит
3. malikov_pro 1288 17.08.20 10:35 Сейчас в теме
(2) Использую Снегопат, в нем реализовано через //:Перем = Справочник.Имя.ПустаяСсылка(), уточняю варианты использования.
На мой взгляд лучше двигаться в типизацию на уровне аннотаций чем делать "костыли", это потенциально приведет к более полному описанию функции, после более удобно работать с функцией.
По фиксации автора изменений: из моего опыта лучше смотреть в git, а через комментарий выделять правки типового кода, для упрощения разбора при обновлении.
herfis; ardn; sapervodichka; +3 Ответить
4. sapervodichka 6690 17.08.20 11:04 Сейчас в теме
(3) GitHub - хочу, EDT - хочу, Снегопат - хочу, Ноутбук с i7 b 16 Gb - хочу, много чего видел, много хочу, но не всегда получается, на том и так как хочу.
TreeDogNight; Aleksandr_Ch; +2 Ответить
11. sapervodichka 6690 17.08.20 22:06 Сейчас в теме
(4) Кстати в Снегопат есть типизируемые параметры, основано на том же принципе (this is хорошо)
Прикрепленные файлы:
19. sapervodichka 6690 04.09.20 13:35 Сейчас в теме
(11) Снегопат, пока 32х, а все сейчас на клиентах 1С 64х, поэтому снег уже не катит (слышал они 64х готовят, тогда можно попробовать и снега)
5. ardn 620 17.08.20 11:38 Сейчас в теме
Простите, но это классический пример мусорного кода.
Повышение удобства работы - это очень круто, но удобно только вам и только в этом конкретном случае.
herfis; N_K_S; +2 1 Ответить
6. sapervodichka 6690 17.08.20 12:06 Сейчас в теме
(5) извиняться не стоит, вы просто не в теме
TreeDogNight; IgorS; user1408452; user1050599; rs; Aleksandr_Ch; duke-81; dmryzhkov; +8 2 Ответить
7. ardn 620 17.08.20 12:08 Сейчас в теме
8. sapervodichka 6690 17.08.20 12:11 Сейчас в теме
(7) спасибо кста за ссылку, в ней видно, что Сергей Старых вам ровно тоже само показывает #Если Сервер и Не Сервер Тогда (и на большинстве норм курсов по программированию, вам этот приём также покажут в качестве лайфхака получения подсказки #Если Фамилия Тогда )
Прикрепленные файлы:
axelerleo; user1050599; marylin; paa98; rs; Aleksandr_Ch; duke-81; dmryzhkov; +8 Ответить
9. VKislitsin 958 17.08.20 14:48 Сейчас в теме
(8) Дмитрий, я пожалуй, соглашусь и с полезностью метода и с тем, что этот код является мусорным. Мне думается, что лучше этот костыль удалить после написания всего кода, для которого требуется контекстная подсказка - ведь это только для удобства при написании. К чему вводить в ступор тех, кому это попадется в дальнейшем? По крайней мере, когда мне впервые попался такой образец в существующем коде, я не сразу сообразил для чего это.
rpgshnik; TreeDogNight; CyberCerber; +3 Ответить
10. sapervodichka 6690 17.08.20 14:57 Сейчас в теме
(9) Можно удалить в финальной реализации конфы. Словами не нужно удалять, я хотел отметить, что когда при разработке раз 50 нужно перезапустить конфигуратор, то кодеру не нужно заморачиватся и удалять код #Если ... Тогда каждый раз, т.к. этот блок кода всё равно исключается из выполнения и ни на что не влияет. А вот в финальном выпуске можно и удалить, чтобы избежать вопроса: "Фигасе чё это о_О?!".
VKislitsin; +1 Ответить
12. sapervodichka 6690 17.08.20 22:09 Сейчас в теме
(8) ну и в Снегопад, я выше картинку прикреплял, тот же принцип "классического мусорного кода" ))) Ужос получается, треш кругом...хотя если "подумать" то и не треш вовсе
13. Cyberhawk 135 20.08.20 15:27 Сейчас в теме
Фамилию писать в такой инструкции опасно, т.к. в любом очередном релизе платформы поддержка незначащих слов может быть убрана.
Кажется, уже был диапазон таких релизов около 8.3.8-8.3.9, но потом это дело, видимо, откатили взад: https://partners.v8.1c.ru/forum/t/1001471/m/1643694

Использовать
#Если Сервер И НЕ Сервер Тогда
кажется самым надежным вариантом.
axelerleo; Drivingblind; sm.artem; sogesti; SerVer1C; zqzq; tormozit; herfis; zarankony; serega9507585993; CSiER; NeviD; CyberCerber; IgorS; rabid_otter; YPermitin; sapervodichka; +17 Ответить
14. sapervodichka 6690 20.08.20 15:34 Сейчас в теме
(13) спасибо! Это лучший комментарий.
15. Cyberhawk 135 20.08.20 15:36 Сейчас в теме
(14) Думаю, лучшим все-таки является под номером (7) :) Я когда-то именно от автора ИР и взял эту конструкцию на вооружение (до этого пользовался нижним подчеркиванием)
16. sapervodichka 6690 20.08.20 15:39 Сейчас в теме
(15) нет он не лучший (он во первых мой), во вторых потому, что ты контрпример и обоснование привёл (всем и мне в том числе полезное и this is хорошо). Лучший твой ))
17. TreeDogNight 22 04.09.20 13:30 Сейчас в теме
Обычно пишу такое условие:
Если 1 = 2 Тогда


И когда полностью дописываю код, просто комментирую этот блок условия.
sapervodichka; +1 Ответить
18. sapervodichka 6690 04.09.20 13:33 Сейчас в теме
(17) получается все сталкиваются с проблемой контекста, хороший вариант
TreeDogNight; +1 Ответить
20. CyberCerber 851 07.09.20 15:26 Сейчас в теме
Проблема контекстной подсказки понятна, но это не то решение, которое следует оставлять в реальных базах, да еще и делать публикации на эту тему.
Раньше тоже иногда писал "Если Ложь Тогда", а дальше инициацию. Но после написания метода удалял этот блок.
А сейчас в ЕДТ правильные комменты к функциям дополняют контекстную подсказку.
Но если уж так хочется подобного в конфигураторе, то можно предложить Снегопат.
21. sapervodichka 6690 07.09.20 16:53 Сейчас в теме
(20) Снегопат как написано выше 32х, а на 32х сейчас никто не работает =( только на 64х
22. sapervodichka 6690 07.09.20 16:54 Сейчас в теме
(21) и 1C:EDT процентов 5 программистов используют
23. sapervodichka 6690 07.09.20 16:55 Сейчас в теме
(22) и о том что в продуктиве удалять тоже написано выше в комментариях =(
24. herfis 496 07.09.20 17:24 Сейчас в теме
Проблема очевидна, лекарство понятно и остроумно.
Только, ИМХО, это тот случай, когда лекарство не лучше болезни.
Лечить неочевидными финтами кода недостатки контекстной подсказки - так себе решение. Это ведь еще и сопровождать надо не забывать и поменяться это может в любой момент (например, перестанет компилироваться в очередном релизе) и WTF от тех, кто не в курсе подобных финтов обеспечены. Как временный фокус на этапе разработки еще могу понять, если сильно болит, но отправлять такое в продакшн я бы точно не стал. А руками комментировать/раскомментировать - теряется весь цимес. Так что увы.
25. sapervodichka 6690 07.09.20 17:43 Сейчас в теме
(24) да, странно, а у многих зашло и оч помогает ) #Если Сервер И Не Сервер Тогда, #Если Ложь Тогда, #Если Фамилия Тогда - короче не надо сожалений усё в абажуре )))
28. herfis 496 08.09.20 09:20 Сейчас в теме
(25) Многие с моим мнением согласны, раз упоминают что удаляют этот код при отправке в продакшн. Ну и вот да - если уж выбирать, то вариант с документированными директивами, явно указывающими на то что этот кусок никогда не компилируется - более надежен и понятен, чем с использованием недокументированной директивы.
29. sapervodichka 6690 08.09.20 10:05 Сейчас в теме
(28) очень смешно )) если не грусно, ведь из продакшена и я согласен удалять, читайте выше в комментах (но на время 500 перезапусков при отладке можно не удалять). Меня просто прикалывает мнение, которое пишут не читая мнение автора и не учитывая, то что автор вообщем-то с ними согласен =( и вообщем-то автор и не дурак раз 30 проектов ЕРП запустил
30. sapervodichka 6690 08.09.20 10:37 Сейчас в теме
(29) многие просто напросто пытаются с умничать, и не совсем по делу. По делу только Cyberhawk написал http://forum.infostart.ru/forum9/topic246242/message2491743/#message2491743
31. herfis 496 08.09.20 10:52 Сейчас в теме
(29) Из самой статьи этого вовсе не следует. Не воспринимайте критику статьи настолько лично. Просто поправьте статью, чтобы ни у кого не возникало вопросов насчет вашего мнения касательно области применимости этого приема - и всего делов-то. Ну или будьте готовы и всех будущих читателей вашей статьи отправлять за мнением автора в комментарии.
32. sapervodichka 6690 08.09.20 11:07 Сейчас в теме
33. sapervodichka 6690 08.09.20 11:09 Сейчас в теме
(32) что касается личного восприятия, то я не воспринимаю лично, я просто анализирую компетентные ли даются комментарии, или просто человеку я не понравился, а по существу у него нет аргументов
26. alexpvs 63 08.09.20 07:27 Сейчас в теме
Обычно использую для доступа к контекстной подсказке конструкцию вида:
Если 1 = 0 Тогда
Ссылка = Документы.Реализация.НайтиПоНомеру();
КонецЕсли;

Имхо пишется быстрее, чем конструкция #Если...

Ну и после завершения работы с этим куском, удаляю блоки по поиску "1 = 0"
sapervodichka; +1 Ответить
27. sapervodichka 6690 08.09.20 08:32 Сейчас в теме
(26) Тоже хороший вариант! =)))
34. tormozit 7133 19.09.20 21:13 Сейчас в теме
Контекстная подсказка - далеко не единственный помощник среды разработки, которому нужно знать тип выражения. В своей статье я показал и другие в разделе "Помощники опирающиеся на вычисление типа". А они уже используются не только для редактирования, как контекстная подсказка, но и для чтения и отладки кода, т.е. несут пользу в продуктивной среде. Кроме них еще и контекстная справка могла бы использовать информацию о типе выражения, но к сожалению это пожелание за 15 лет так и не было реализовано в конфигураторе.
rpgshnik; +1 Ответить
35. axelerleo 336 20.07.21 10:43 Сейчас в теме
Не вполне понятно за что заминусили статью. Годный вариант использования, особенно в варианте
#Если Сервер И Не Сервер Тогда

(34) Спасибо за ссылку на статью
sapervodichka; +1 Ответить
36. rpgshnik 3625 08.10.21 08:21 Сейчас в теме
(34) тоже думал видел же уже... и даже пробовал использовать
Оставьте свое сообщение