Внимание! Тема закрыта. Добавлять сообщения в закрытую тему запрещено.
Доброго времени суток.
Хотелось бы узнать, кто как обходит ограничение платформы: отсутствие констант в языке 1С. Например, в языке Java, можно объявить переменную как final, после этого она становить неизменяемой. Когда мне нужно сделать, что-то подобное в 1С я делаю что-то типа:
Таким способом получается убрать из кода "магические числа".
Интересно, кто как решает эту проблему и вообще может это не является проблемой в 1С?
Хотелось бы узнать, кто как обходит ограничение платформы: отсутствие констант в языке 1С. Например, в языке Java, можно объявить переменную как final, после этого она становить неизменяемой. Когда мне нужно сделать, что-то подобное в 1С я делаю что-то типа:
#Область Константы
Функция РАЗДЕЛИТЕЛЬ_СТРОК()
Возврат " -"
КонецФункции;
#КонецОбласти
Строка = Строка + РАЗДЕЛИТЕЛЬ_СТРОК() + ДругаяСтрока;
Таким способом получается убрать из кода "магические числа".
Интересно, кто как решает эту проблему и вообще может это не является проблемой в 1С?
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) нормальный вариант.
Еще можно использовать фиксированную структуру.
Но, нужно учитывать, что глобальные переменные могут быть только на клиенте.
И такую переменную в принципе можно переопределить.
Вариант с функцией, можно ее поместить в общий модуль КлиентСервер и Повт.Использованием. Это самый простой и надежный вариант.
Еще можно использовать фиксированную структуру.
глКонстанты = Новый ФиксированнаяСтруктура("РАЗДЕЛИТЕЛЬ_СТРОК", " -");
Строка = Строка + глКонстанты.РАЗДЕЛИТЕЛЬ_СТРОК + ДругаяСтрока;
Но, нужно учитывать, что глобальные переменные могут быть только на клиенте.
И такую переменную в принципе можно переопределить.
Вариант с функцией, можно ее поместить в общий модуль КлиентСервер и Повт.Использованием. Это самый простой и надежный вариант.
(3) в пояснении варианта функции в общем модуле с Повт.Исп., все зависит от вариантов использования таких константных значений.
Примеры таких "константных" значений можно рассматривать ПараметрыКлиентаНаСервере в Параметрах сеанса.
И получение, к примеру, ЭтоВебКлиент() как вариант таких значений. Один раз устанавливается и далее только получается.
Примеры таких "константных" значений можно рассматривать ПараметрыКлиентаНаСервере в Параметрах сеанса.
И получение, к примеру, ЭтоВебКлиент() как вариант таких значений. Один раз устанавливается и далее только получается.
(5)Нельзя спутать то чего нет. В 1С нет констант, объект конфигурации Константа это не то о чем я говорю.
Константа - способ адресации данных, изменение которых рассматриваемой программой не предполагается или запрещается. Использование именованных констант — приём, повышающий надёжность и безошибочность программ, позволяя избегать использования «магических чисел».
Константа - способ адресации данных, изменение которых рассматриваемой программой не предполагается или запрещается. Использование именованных констант — приём, повышающий надёжность и безошибочность программ, позволяя избегать использования «магических чисел».
(11) Это я минуснул )
для автора: - Думаю, это не ограничение платформы, а вариант нормы для скриптового языка.
Если пофантазировать...
Если реализуется что-то сложное, где можно запутаться в "магических числах", то это нужно выносить в подпрограммы - внешние обработки. Там есть свой набор табличных частей и они высвечиваются в контекстной подсказке в модуле обработки, это поможет к ним обращаться как к ключевым словам.
например, создадим табличные части: Константа1, Константа2.
Но защитить от перезаписи значение переменной "кеш" вроде бы уже никак.
для автора: - Думаю, это не ограничение платформы, а вариант нормы для скриптового языка.
Если пофантазировать...
Если реализуется что-то сложное, где можно запутаться в "магических числах", то это нужно выносить в подпрограммы - внешние обработки. Там есть свой набор табличных частей и они высвечиваются в контекстной подсказке в модуле обработки, это поможет к ним обращаться как к ключевым словам.
например, создадим табличные части: Константа1, Константа2.
Функция КонстантыМодуля(КлючКонстанты, кеш = неопределено)
Если ТипЗнч(кеш) <> Тип("ФиксированноеСоответствие") Тогда//Инициализация
кеш = Новый Соответствие();
кеш.Вставить(ТипЗнч(Константа1), "1");
кеш.Вставить(ТипЗнч(Константа2), "2");
кеш = новый ФиксированноеСоответствие(кеш);
КонецЕсли;
Возврат кеш[ТипЗнч(КлючКонстанты)];
КонецФункции
....
Сообщить(КонстантыМодуля[Константа1]);//Выдаст 1
Сообщить(КонстантыМодуля[Константа2]);//Выдаст 2
Константа2 = 8;//присвоение вызовет ошибку
ПоказатьНо защитить от перезаписи значение переменной "кеш" вроде бы уже никак.
(10)Мой вопрос это не про прикладную область, а про упрощение понимания кода.
Кстати о прикладном смысле
Первый пример:
Второй пример:
С точки зрения прикладного смысла , код делает одно и тоже, но для понимания второй пример понятнее ну и производительнее (правда, насчет производительности это о прикладном смысле или нет).
Со стороны прикладного смысла, вообще всё равно есть ли в коде константы или нет. Пишется ли код с отступами или без, выделяются ли части кода в отдельные процедуры или просто копипаститься, программа работает одинаково.
Попробуй почитать какие-нибудь книги по программированию, может поймёшь все сам.
Кстати о прикладном смысле
Первый пример:
Если НЕ ПустаяСтрока(ТекСтрока.ЕдиницаИзмерения.ЕдиницаПоКлассификатору.МеждународноеСокращение) Тогда
лUNIT = СокрЛП(ТекСтрока.ЕдиницаИзмерения.ЕдиницаПоКлассификатору.МеждународноеСокращение);
КонецЕсли;
Второй пример:
лЕдИзмENG = ТекСтрока.ЕдиницаИзмерения.ЕдиницаПоКлассификатору.МеждународноеСокращение;
Если НЕ ПустаяСтрока(лЕдИзмENG) Тогда
лUNIT = СокрЛП(лЕдИзмENG);
КонецЕсли;
С точки зрения прикладного смысла , код делает одно и тоже, но для понимания второй пример понятнее ну и производительнее (правда, насчет производительности это о прикладном смысле или нет).
Со стороны прикладного смысла, вообще всё равно есть ли в коде константы или нет. Пишется ли код с отступами или без, выделяются ли части кода в отдельные процедуры или просто копипаститься, программа работает одинаково.
Попробуй почитать какие-нибудь книги по программированию, может поймёшь все сам.
(14)
для понимания второй пример понятнее ну и производительнее
Чой-та ржу.
Сокращение = МеждународноеСокращение(ТекСтрока.ЕдиницаИзмерения);
Если Не ПустаяСтрока(Сокращение) Тогда
Модуль = СокрЛП(Сокращение);
КонецЕсли;
Функция МеждународноеСокращение(ЕдиницаИзмерения)
Сокращение = ОбщегоНазначения.ЗначениеСвойстваОбъекта(ЕдиницаИзмерения, "ЕдиницаПоКлассификатору.МеждународноеСокращение");
Результат = Строка(Сокращение);
Возврат Результат;
КонецФункции
Показать
(20)
Начал с "констант", потом через "попробуй почитать какие-нибудь книги по программированию" внезапно оказалось, что это про "про упрощение понимания кода" и в конце неопредолимым препятствием стало отсутствие где-то там БСП.
А ты хорош.
так как там нет БСП
Итого.
Начал с "констант", потом через "попробуй почитать какие-нибудь книги по программированию" внезапно оказалось, что это про "про упрощение понимания кода" и в конце неопредолимым препятствием стало отсутствие где-то там БСП.
А ты хорош.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот