Имя: Пароль:
1C
1С v8
8.2, Хранение констант, не изменяемых пользователем
,
0 Humandra
 
26.02.12
13:43
1. Просто метод в модуле 100% (3)
2. Константа с кэшированием 0% (0)
3. Другое 0% (0)
Всего мнений: 3

Добрый день!
А скажите-ка, как вы храните, и, главное, получаете константы - не в терминах 1С, а редкоизменяемые значения?

Например, где-то в программном коде используется строка "Разделитель строки адреса" = ", ".

Очевидно, что плохим тоном будет прямо так и писать в коде: Улица + ", " + Дом + ", " + итп, ибо в теории таки может потребоваться изменить разделитель, и искать его по всему коду - замучаешься.

Можно просто в каком-то модуле определить метод: ПолучитьРазделительСтрокиАдреса(), тогда эта проблема не актуальна.

Но я смотрю, многие для таких вещей таки заводят константы в понятии 1С.
Вопрос: это оправдано? Зачем так делают? Ведь, как я поняла, константа 1С хранится в БД, при ее получении ее придется либо кэшировать, либо тратиться на обращение к БД, либо надеяться, что 1С ее сама закэширует (а она это делает?).
1 Rie
 
26.02.12
13:45
(0) Многие - это кто?
2 Мизантроп
 
26.02.12
13:45
> Ведь, как я поняла, константа 1С хранится в БД, при ее получении ее придется либо кэшировать, либо тратиться на обращение к БД, либо надеяться, что 1С ее сама закэширует (а она это делает?).

живите проще, не думайте о таких вещах
3 PVV65
 
26.02.12
13:46
(0) Однозначно

Просто метод в модуле
4 golden-pack
 
26.02.12
13:48
Разве это узкое место ?

Просто метод в модуле
5 acsent
 
26.02.12
13:49
ПолучитьРазделительСтрокиАдреса() - бессмысленная универсализация
6 Humandra
 
26.02.12
14:04
(5) Ну это для примера про адрес было. Почему бессмысленная? Предлагаете такие константы вообще прямо в коде встраивать и несколько раз повторять? Не, на такое я точно не согласна.
(1) В двух отраслевых встречала уже примеры такого. Вот и пытаюсь понять - это они странным занимаются, или я чего-то не понимаю
(2) Ага, а потом меня через полтора года будут хорошими словами поминать?
(4) Это не узкое место, это просто пример. А вот, скажем, что-то типа константы "Максимальный уровень иерархии" для ускорения выхода из зацикливания (в коде типа разворачивания рецептур, но не про рецептуры, предметка другая) - однозначно может стать узким местом.
7 Rie
 
26.02.12
14:16
(6) Это они таким странным занимаются. Разделитель полей в строке - это всё же часть алгоритмов и структур данных, а не сами данные. Равно как и ПолучитьРазделительСтрокиАдреса() - явное излишество. Причём, на мой взгляд, несуразное - "вовне" не нужно знать разделитель строки адреса, скорее, понадобятся методы РазобратьАдрес() и СобратьАдрес(), внутри которых спокойненько можно использовать литерал.
8 Humandra
 
26.02.12
15:07
(7) Ну не знаю.
Допустим, есть код типа "в цикле по иерархии собираем полное название адреса путем конкатенации с разделителем":
Для Каждого Из Цикл
ПолныйАдрес = ПолныйАдрес + Разделитель + ЧастьАдреса;
КонецЦикла

Потом надо вырезать первый, лишний, разделитель, т.е. в случае разделителя ", " - первые 2 символа.
Для этого можно писать в коде: "вырезать 2 первых символа" или "вырезать длину разделителя".
Если идти первым путем, то если разделитель таки придется заменить, например, на "запятая и два пробела" (а это не 100% исключено, так как в некоторых организациях у меня был такой в качестве разделителя адреса, чтобы потом при обмене с другой не 1С-базой не спутать части адреса с уточнениями типа "д.2, магазин "Березка", у первого столба), то есть можно забыть и не поменять "вырезать 2 первых символа" на "вырезать 3 первых символа".
По моему надежнее все же определять такие вещи в одном месте, а не в куче разных.
9 acsent
 
26.02.12
15:09
(6) приведи пример где данная универсализация не бессмысенна
10 Лефмихалыч
 
26.02.12
15:12
например

Функция ДатаНачалаИстории() Экспорт
  Возврат Дата(1986,04,26,01,24,00);

Просто метод в модуле
11 Rie
 
26.02.12
15:18
(8) Так а в чём сложность задачи-то? Ради чего копья ломать?
Не говоря уже о том, что можно и не резать ничего:
ПолныйАдрес = "";
Разделитель = "";
Для Каждого ХЗ Из ТЗ Цикл
   ПолныйАдрес = ПолныйАдрес+Разделитель+ХЗ.Адрес;
   Разделитель = ", ";
КонецЦикла;
// Захотелось вместо ", " использовать "а ещё, свет очей моих, " - изменяем всего одну строку.

Однако всё это - ну уж очень несерьёзно. А заводить ради этого метод - глупо. Ну а константу в базе создавать - вообще маразм.
12 Humandra
 
26.02.12
16:02
(11)
Все равно не в одном месте - как минимум еще в методе разбора.
Ваш вариант мне в голову не пришел. Внешне он красивей. Но   присваивание лишнее зато на каждой итерации.
13 Rie
 
26.02.12
16:09
(12) Итого - 2 метода. Далеко не смертельно. И, IMHO, не основание - добавлять к ним ещё и 3-й, название которого - ПолучитьРазделительСтрокиАдреса - при чтении очень легко спутать с НадоБыЗаглянутьЧтоЭтаФункцияДелаетНеМожетЖеБытьЧтобыЕеСоздалиРадиЗаменыОдногоЕдинственногоЛитерала.
Программист всегда исправляет последнюю ошибку.