Механизм хранения дополнительных констант

Программирование - Практика программирования

20
Данная разработка - достаточно удобный велосипед, призванный решить извечный вопрос о том, как одновременно сохранить и какие-то конкретные данные для какой-то конкретной обработки и свою честь разработчика от использования "НайтиПоНаименованию".

Преамбула

В топ 5 правил гигиены корпоративной разработки входит "Не используй НайтиПоНаименованию. И НайтиПоКоду тоже не стоит." Это хорошее правило, но возникло оно не просто так. Необходимость-то есть. Не в использовании этих конкретных покрытых позором богомерзких методов, а в том, для чего они используются - получить в коде какое-то вполне конкретное значение, слишком специфичное или слишком временное, для того чтобы выделять под него константу. Сюда же относятся случаи так называемых "магических чисел" и "магических строк", когда прямо в коде где-то посреди процедуры вдруг ДнейОтсрочки = 15, или СтрокаComПодкюченияКБазе = "Srvr=...".

Что же делать? Одного универсального ответа нет - иногда стоит завести какое-то дополнительное правило, добавить категорию, организовать, таки, константу или заставить выбирать значение вручную в конце концов. Но иногда вариантов особо нет - надо где-то хранить какую-то папку очень особенных контрагентов, дату, с которой запускается какая-то дополнительная проверка или что-то типа того.

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

Реализация

Организовано все достаточно просто - справочник с табличной частью. Элементы справочника представляют что-то типа групп констант, а имена и значения констант хранятся в табличных частях. К этому прикручен программный API, чтобы к значениям можно было обращаться через точку: "ИмяГруппы.ИмяКонстанты". Имя группы уникально в пределах справочника, имя константы в пределах группы.

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

СерверБух = Справочники.ДопКонстанты.ПолучитьЗначениеКонстанты("ПодключениеКБухгалтерии.ИмяСервера");

Плюс иногда надо сохранить программно что-то, что нельзя выбрать руками - какую-нибудь структуру, массив, или картинку, например. Делаем примерно так:

Справочники.ДопКонстанты.УстановитьЗначениеКонстанты("Алкоголь.ЛоготипНаПивныеЭтикетки", ВыбраннаяКартинка);

Механизм сам поймет, что тип не примитивный и не ссылочный и запакует в ХранилищеЗначения.

Описание API

Два основных метода - сеттер и геттер - УстановитьЗначениеКонстанты и ПолучитьЗначениеКонстанты соответственно. Определяются в модуле менеджера справочника.

Процедура УстановитьЗначениеКонстанты(ПутьККонстанте, Значение, 
				СоздаватьГруппуПриОтсутствии=Ложь, СоздаватьКонстантуПриОстутствии=Ложь,
				ДопускатьСменуТипаСуществующейКонстанты=Ложь,
				КакХранилище=Ложь, СтепеньСжатияХранилища=0) Экспорт

Записывает указанное значение по указанному пути.

  • ПутьККонстанте (Обязательный) - путь к константе в формате "ИмяГруппы.ИмяКонстанты". Допускаются любые строки. Единственное требование - ровно одна точка, разделяющая имя группы и имя константы.
  • Значение (Обязательный) - значение, которое будет записано по переданному пути. Допускаются любые примитивные типы (включая строку неограниченной длины), любые ссылки и любые типы которые упаковываются в хранилище значения (в описании типа должно быть "Сериализуется")
  • СоздаватьГруппуПриОтутствии (Необязательный) - указывает на то, будет ли создана группа констант с переданным именем, если ее не существует. Если указана Ложь и группы с требуемым именем не существует, будет вызвано соответствующее исключение.
  • СоздаватьКонстантуПриОстутствии (Необязательный) - указывает на то, будет ли создана константа с переданным именем, если ее не существует в указанной группе. Если указана Ложь и константа с требуемым именем в указанной группе не существует, будет вызвано соответствующее исключение. При параметре СоздаватьГруппуПриОтутствии установленном в Истину автоматически переводится в Истину, так как в новой группе точно нет никаких констант и если создаем группу, то надо создавать и константу.
  • ДопускатьСменуТипаСуществующейКонстанты (Необязательный) - указывает на то, допускается ли для уже существующей константы установка значения типа, отличного от типа уже установленного значения. Если передана Истина и значение, отличающееся от типа значения уже существующей переменной по заданному пути, то будет вызвано соответствующее исключение.
  • КакХранилище (Необязательный) - указывает на необходимость сохранения переданного значения как ХранилищеЗначения. Если установлено в Ложь, то значения примитивных и ссылочных типов будут сохранены как есть, а все остальные будут сохранены как ХранилищеЗначения. Если установить в Истину, то любое переданное значение будет сохранено как ХранилищеЗначения.
  • СтепеньСжатияХранилища (Необязательный) - число от 0 до 9 - определяет степень сжатия данных при формировании ХранилищаЗначения.
Функция ПолучитьЗначениеКонстанты(ПутьККонстанте, КонтролироватьСуществование=Ложь, 
                                  ОткрытьХранилище=Ложь) Экспорт

Возвращает значение, которое хранится по указанному пути.

  • ПутьККонстанте (Обязательный) - путь к константе в формате "ИмяГруппы.ИмяКонстанты". Допускаются любые строки. Единственное требование - ровно одна точка, разделяющая имя группы и имя константы.
  • КонтролироватьСуществование (Необязательный) - признак того, надо ли вызывать исключение, если константы по указанному пути не существует. Если указана Ложь, то в случае отсутствия константы будет возвращено Неопределено.
  • ОткрытьХранилище (Необязательный) - признак того, надо ли возвращать объект ХранилищеЗначения, или то, что лежит в хранилище значения. Если указана Истина и у получаемого значения тип ХранилищеЗначения, то функция вернет результат функции ХранилищеЗначения.Получить(). В противном случае вернется само ХранилищеЗначения.

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

А вот хранить допустимое количество дней отсрочки платежа, которое коммерческий директор любит менять по два раза в месяц - самое то. Или, например, дату, с которой надо начинать особенным образом обрабатывать реализации товаров, которые проходят через Меркурий, чтобы раньше времени всех не пугать. Или ссылку на какую-то конкретную внешнюю обработку, которая содержит нужные куски логики (или саму ее в виде двоичных данных, хотя, наверно, лучше не стоит). Или логотипы разные на все случаи жизни. Или строки подключения ко всем базам из вашего зоопарка. Да мало ли еще что.

Остальное

Разработано на версии платформы 8.3.8.1652 (из чувствительного к версиям используется СтрНайти - поменять на Найти несложно). Весь механизм уложен в рамки одного справочника - ДопКонстанты. Есть как управляемые так и обычные формы. Программный API (в модуле менеджера) обложен тестами и стабилен, хотя, честно признаюсь, в боевых условиях испытывал не все дополнительные параметры. Тесты можно позапускать с формы списка. 

Занимательный факт

В коде конфигурации четырежды используется НайтиПоНаименованию :)

20

Скачать файлы

Наименование Файл Версия Размер
Механизм хранения дополнительных констант:
.cf 36,58Kb
18.07.18
7
.cf 1.0.0 36,58Kb 7 Скачать

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. Идальго 93 18.07.18 22:30 Сейчас в теме
Даже представить не могу, чтобы мне для таких целей регистра сведений не хватило. Хех, я уж про константу - строку неограниченной длины даже молчу =))
Irwin; AlexO; AlexGroovy; 9-pm; +4 Ответить
2. 9-pm 41 19.07.18 03:24 Сейчас в теме
(1) Ну, я сам долго с регистром жил. Решающим для перехода для меня стало жгучее желание как-то всё это безобразие группировать. А про строку неограниченной длины - разные случаи бывают. Гимн компании, например, хранить ))
54. AlexO 125 21.07.18 15:14 Сейчас в теме
(2)
А про строку неограниченной длины - разные случаи бывают
Вот именно. И в так заинтересовавшем Вас случае "константы через запрос" Вы свою любимую строку неограниченной длины не получите в принципе.
Так что гимн вам придется напевать самому ))
60. 9-pm 41 21.07.18 15:46 Сейчас в теме
(54) в смысле, получение запросом комментариев, например, из документов какую-то лицензию нарушает? Они обычно неограниченной длины бывают.
63. AlexO 125 21.07.18 15:50 Сейчас в теме
(60)
получение запросом комментариев, например, из документов какую-то лицензию нарушает? Они обычно неограниченной длины бывают.
в том смысле, что 1С - штука настолько сырая, что куда ни приткнись - везде либо костыль, либо дыра.
В частности, в запросах нет преобразования типов. Поэтому все "неограниченные строки" и прочие "ништяки-объекты" нужно явно приводить к какому-то типу данных.
65. 9-pm 41 21.07.18 16:00 Сейчас в теме
(63) ну, тут сложно поспорить. Про приводить данные к нужному типу. Про костыли и дыры сложный философский вопрос ) но приводить-то надо после того как получишь )
68. AlexO 125 21.07.18 16:56 Сейчас в теме
(65)
но приводить-то надо после того как получишь
так вы их в принципе не получите, если заранее не объявите тип данных ))
Вот думаете, что такое описание полей в запросе? Это вы их тип платформе сообщаете. Явно.
Вот так же явно и строку "неограниченной" длины приходится ограничивать в запросе, и превращать её в строку весьма ограниченной длины )
75. DrAku1a 1290 22.07.18 15:27 Сейчас в теме
(68) Если я просто получаю "ВЫБРАТЬ Комментарий ИЗ Документ.*** ГДЕ Ссылка=***" мне нигде не надо типы приводить. Надо приводить - если, например, делается поиск по комментарию. И то не факт (при поиске по подобию - приведение типов также не требуется).
85. Sashares 1 23.07.18 18:24 Сейчас в теме
(68)Только если по этой строке есть группировка/отбор/сортировка/соединение.
Для простой выборки не нужно ничего.
ivanovdv; +1 Ответить
76. DrAku1a 1290 22.07.18 15:34 Сейчас в теме
(1) Справочник, как уже сказали - позволяет структурировать настройки. Кроме того, удалить элемент справочника сложнее, да и это будет отражено в журнале регистрации (без каких-либо доработок).
На практике - использую похожий велосипед. Только добавил в него возможность вносить список значений, а потом и таблицу значений, соответствие и структуру.
Для получения значения - использую функцию из своего общего модуля. При этом, в функции есть необязательные параметры "ОжидаемыйТипЗначения" и "ЗначениеПриОтсутствии". Поиск в справочнике производится по наименованию, но т.к. это специфичный справочник - то это нормально.
Еще - рекомендую в справочнике добавить поле "Комментарий" или "Описание" - и в данном поле указывать где и для чего эта константа используется.
77. 9-pm 41 22.07.18 16:58 Сейчас в теме
(76) Ну, у меня и список значений и таблицу и структуру и соответствие тоже можно - для этого как раз реквизит с типом ХранилищеЗначения. Единственное неудобство - сохранять такие дела только программно можно. Но думаю запилить интерфейс чтобы как раз самые необходимые типы (массивы, таблицы и структуры) можно было руками накидывать. А описание - да, хорошая идея. Я, конечно, пока не сталкивался с тем чтобы совсем забыл, зачем у меня константа, но все равно добавлю. И параметр с ожидаемым типом значения тоже надо бы. Благодарю )
91. DrAku1a 1290 24.07.18 18:06 Сейчас в теме
(77) Скинуть наработки с интерфейсами для редактирования таблицы значений (структуры и соответствия соответственно)?
92. 9-pm 41 24.07.18 18:13 Сейчас в теме
(91) был бы весьма признателен )
3. PowerBoy 2847 19.07.18 06:31 Сейчас в теме
Использую подобный механизм, но у меня еще есть возврат группы констант.
ПолучитьЗначениеКонстанты("ГруппыНоменклатуры") вернет массив значений.
4. 9-pm 41 19.07.18 07:59 Сейчас в теме
(3) О, вариант. Не могу, правда, придумать, зачем бы оно, но надо будет добавить.
5. AlX0id 19.07.18 10:52 Сейчас в теме
В какой-то из отраслевых видел подобный механизм, реализованный на ПВХ )
Bassgood; +1 Ответить
6. Bassgood 807 19.07.18 11:00 Сейчас в теме
(0) Я встречал реализацию такого механизма практически всегда на двух объектах - ПВХ и РС, и в своей конфе собственно именно такой же подход использую
zqzq; buganov; +2 Ответить
7. 9-pm 41 19.07.18 11:31 Сейчас в теме
(6)
(5) Думал тоже через ПВХ сделать. Но это два объекта, а не один плюс настройка несколько сложнее. А каких-то явных преимуществ реализации через виды характеристик я не нашел. Если не прав, подскажите.
8. AlX0id 19.07.18 11:52 Сейчас в теме
(7)
Количество объектов при правильно сделанной обвязке особого влияния на процесс кодирования не окажет - все равно вы будете писать что-то типа "УстановиКонстанту(Наименование, Значение)".
Плюс, собственно, в том, что в регистре будет храниться индивидуально типизированное значение - то есть, ожидая в коде увидеть СправочникСсылка, вы не получите там строку али еще чего.
user774630; Bassgood; 9-pm; +3 Ответить
11. 9-pm 41 19.07.18 12:25 Сейчас в теме
(8) Если конфигурация своя, то да, а если клиенту встроить куда-нибудь, то чем меньше объектов тем лучше. Низкая связанность же ) Про жестко типизированное значение я думал (даже дополнительный параметр в сеттер ввел), но пока желание простоты и компактности во мне возобладало.
zhenyat; kote; +2 Ответить
13. AlX0id 19.07.18 12:35 Сейчас в теме
(11)
а если клиенту встроить куда-нибудь, то чем меньше объектов тем лучше.

На самом деле клиенту пофиг, сколько там объектов вы добавите - 1 или 2. Важно, насколько дороже станут обновления )
15. 9-pm 41 19.07.18 13:01 Сейчас в теме
(13) Это безусловно так - клиент не заметит даже если искать по наименованию ) Но я предпочитаю чтобы склонный к насилию психопат, знающий, где я живу, который будет сопровождать его после меня, разбирался с одним моим справочником, а не ПВХ, регистром, справочником (для допзначений - как в механизме свойств) и парой общих модулей )
42. AlexO 125 21.07.18 14:17 Сейчас в теме
(15)
разбирался с одним моим справочником, а не ПВХ, регистром, справочником (для допзначений - как в механизме свойств) и парой общих модулей )

эт конечно, со справочником и кучей строчек подключения к базам, перемежающимися днями отсрочки по договору и гимном фирмы, ему будет куда сподручней, чем с РС.
47. 9-pm 41 21.07.18 14:35 Сейчас в теме
(42) ну, если РС пустой будет, то с ним сподручнее, конечно )
51. AlexO 125 21.07.18 15:01 Сейчас в теме
(47)РС - это минимальная "таблица" в 1С, т.е. наиболее быстрый контейнер для хранения данных в 1С.
И пустой он не будет никогда, минимум - структура и описание полей )
56. 9-pm 41 21.07.18 15:36 Сейчас в теме
(51) "и кучей строчек подключения к базам, перемежающимися днями отсрочки по договору и гимном фирмы" я в основном про это ) если РС оставить пустым, то с ним разбираться проще, да )
64. AlexO 125 21.07.18 15:55 Сейчас в теме
(56) РС используется исключительно из-за скорости обработки данных. А не "потому что он крутой" )
Ну, плюсом, бывает и из-за функционала - того же как "периодический независимый", вот это тоже заменить нечем.
А в плане скорости и обработки Справочник - один из самых громоздких объектов в 1С, они с Документом это почетное место никак не поделят )
66. 9-pm 41 21.07.18 16:08 Сейчас в теме
(64) это да. Но не все пишут хайлоад. А для реального бизнеса часто скорость разработки бывает важнее скорости работы (в разумных пределах, конечно). Но, как я и говорил - РС - вполне рабочий вариант, сам его долго использовал.
67. AlexO 125 21.07.18 16:51 Сейчас в теме
(66) вы поймите (а лучше - напишите в пояснениях), что в реалиях 1С подобное "художество" в справочниках - это не то, что велосипед, а экзотика с очень специфичным уклоном. Которая может грозить даже весьма ощутимыми проблемами.
Рисовать - рисуйте, что угодно, но и ответственность понимайте: такая реализация - не более, чем красивая погремушка, а у вас уже пошло-поехало "о, я знаю чем заменить НайтиПоКоду и НайтиПоНаименованию!"
Да ничем их не надо заменять.
А вот знать, что в справочнике 1С НЕ НАДО хранить фото, видео, блобы и прочий "не родной" для 1С контент - это нужно. Обязательно.
Чтобы очередная фирма не искала нового программиста с задачей "срочно реанимируйте, у нас база колом встала!", потому что прежний натворил дым коромыслом, но зато сверху бантик. И уволился с формулировкой "ну не шмогла я, не шмогла, не повлиял бантик на создание конфетки".
mickey.1cx; +1 Ответить
69. 9-pm 41 21.07.18 17:07 Сейчас в теме
(67) а я делюсь практикой. Этот механизм работает у меня в боевой базе в боевом режиме. Колом база не встаёт (в смысле, встаёт, конечно, иногда, но по другим поводам). Понятно, что во всем надо сохранять трезвую голову, не устраивать свалок и не лениться проектировать. Но потребность в подобных механизмах есть, о чем косвенно свидетельствует количество вариантов, которых сюда накидали. Так вот, я делюсь тем, что вот такой вариант тоже рабочий, опробованный в бою и достаточно удобный )
PowerBoy; +1 Ответить
9. vadim1011985 46 19.07.18 12:08 Сейчас в теме
А если константа периодическая ?
10. 9-pm 41 19.07.18 12:21 Сейчас в теме
(9) Периодическая константа - несколько оксюморон, не находите? ) Пока не встречались мне в практике. Был бы благодарен за пример.
user774630; +1 Ответить
12. vadim1011985 46 19.07.18 12:31 Сейчас в теме
(10) Да пожалуйста , процент по кредиту или займу в середине месяца изменилась ставка рефинансирования из=-за этого изменился процент , сам процент хранится как константа, проценты начисляются в конце месяца , и часть месяца должна посчитаться по старой ставке а часть по новой
16. 9-pm 41 19.07.18 13:10 Сейчас в теме
(12)
(14) Хмм. Сходу ответил бы, что таким вещам место в специально отведенных для этого регистрах, но вы заставили задуматься, спасибо.
86. Sashares 1 23.07.18 18:28 Сейчас в теме
(16)В БСП контактная информация хранится в ТЧ и может быть периодической.
14. Bassgood 807 19.07.18 12:37 Сейчас в теме
(10) Имеется в виду уже более не константа, а некая условно постоянная информация, допустим используемая для подстановки в печатные формы документов - до 2018 года выводилось одно значение, начиная с 2018 года необходимо выводить другое.
Подобный же механизм (на основе ПВХ и РС) используется также и в старых редакциях типовых конфигураций для дополинтельных настроек пользователей (в основном для подстановки в объекты значений по умолчанию) и дополнительных прав пользователей
53. AlexO 125 21.07.18 15:10 Сейчас в теме
(14)
для подстановки в печатные формы документов - до 2018 года выводилось одно значение, начиная с 2018 года необходимо выводить другое.
Как раз это - не изменяемая информация, и в типовых прописывается прямо в коде - через получение и проверку текущей даты.
Вы же не меняете "вчера до 2018 года у нас было одно значение, а сегодня до 2018 - другое!".
71. Bassgood 807 22.07.18 01:28 Сейчас в теме
(53) Что значит неизменяемая информация, если она зависит от периода (до 2018 года ставка налога была одна, в 2019 другой и т.д.)?
Как это реализовано в типовых конфигурациях это одно, как это возможно сделать в типовой конфигурации, не затрагивая саму конфигурацию, это другое (зато в типовых конфигурациях имеются такие константы типа "Дата начала применения такого то закона", хотя почему бы эта дату не "зашить" в саму конфу). В любом случае все это зависит от специфики решаемой задачи и универсального решения не существует.
p.s. Я привел этот случай только в качестве примера, который первым пришел в голову.
52. AlexO 125 21.07.18 15:07 Сейчас в теме
(10)
Периодическая константа - несколько оксюморон, не находите
Это не "оксюморон", а периодический реквизит в 7.7, который в 8 был заменен на периодический независимый РС.
И используется как "периодическая константа" в вашей терминологии в любой типовой - РС "Валюты" (сейчас это "КурсыВалют", чтобы проще искать Вам было), всякие "Гражданство" и прочие.
user774630; +1 Ответить
17. pm74 127 19.07.18 13:21 Сейчас в теме
(0) у меня подобное сделано как
справочник (предопределенные элементы) + планвидовхарактеристик
18. 9-pm 41 19.07.18 13:30 Сейчас в теме
(17) С предопределенными элементами беда в том, что добавлять/изменять их через изменение конфигурации надо. А хочется чтобы можно было на лету с ними работать.
19. pm74 127 19.07.18 13:44 Сейчас в теме
(18)
С предопределенными элементами беда в том, что добавлять/изменять их через изменение конфигурации надо.

во вторых - динамически использовать константу это как ? через внешние обработки ?
во первых - для 8.3 вроде как не актуально

зы. не считайте придирками , все что повышает удобство работы имеет право на жизнь , к слову нечто подобное (варииант с хранилищем) тоже использую , только для других целей
20. 9-pm 41 19.07.18 14:18 Сейчас в теме
(19) Во-вторых, почему бы и не так ) Надо мне, например, как-то печатной формой управлять. Добавляю константу, пилю внешнюю печатную форму, конфигурацию не трогаю. Или роботами разными управлять, которые тоже по сути - внешние обработки, которые по регламенту запускаются.

Во-первых, это да. Но не у всех, к сожалению, до сих пор 8.3 и это боль.

Никаких придирок, конструктивная критика - наше всё )
41. AlexO 125 21.07.18 14:15 Сейчас в теме
(20)
Во-вторых, почему бы и не так ) Надо мне, например, как-то печатной формой управлять. Добавляю константу, пилю внешнюю печатную форму, конфигурацию не трогаю. Или роботами разными управлять, которые тоже по сути - внешние обработки, которые по регламенту запускаются.

Ну, то есть, я так понял - изначально сам справочник "дополнительных констант" тоже создается без изменения конфигурации, просто положил его, книжицей, рядом с базой - и вот, пожалуйста, можно из обработок любую страничку прочитать.
48. 9-pm 41 21.07.18 14:37 Сейчас в теме
(41) конечно. Ещё с релиза 8.3.5.1473 можно из обработок к аналоговому блокноту обращаться. Только надо не далее 3х метров от сервера положить и чтобы корешок на юг был направлен )
50. AlexO 125 21.07.18 15:00 Сейчас в теме
(48)
к аналоговому блокноту обращаться
на китайском сайте брали? Стиль ретро соблюден? Размер диагонали? ))
57. 9-pm 41 21.07.18 15:38 Сейчас в теме
(50) ненене, какие китайские сайты - только жёлтые фирменные блокноты на пружинке от франчей )
62. AlexO 125 21.07.18 15:47 Сейчас в теме
(57)тут я пас, такое хранилище - самое надежное )
21. herfis 261 19.07.18 14:27 Сейчас в теме
Нууу, не знаю даже. Эдакая свалка ленивых предопределенных элементов со всей конфы получается. При этом конфа без справочника становится неработоспособной. Слабый аргумент, но метаданные (по сути) вынесенные в данные - все равно не сахар.
Я обычно так делаю, если понадобилось найти по коду прям срочно:
1) делаю через поиск по коду, но сразу забрасываю в хранилище на будущее структурное изменение предопределенный элемент
2) потом как структурные зальются - перебрасываю "ИмяПредопределенного" на существующий элемент, а новый убиваю
3) рефакторю поиск по коду на обращение к предопределенному элементу.
kote; yelloo; +2 Ответить
22. pm74 127 19.07.18 14:39 Сейчас в теме
(21)
При этом конфа без справочника становится неработоспособной

это, я так понял , в мой огород камень :) ,
в справочнике естественно есть защита от "дурака" , но так сделано было больше для
того чтобы иметь таблицы в запросах
для всякой быстрой фигни и регламентов использую это (не сочтите рекламой)
26. 9-pm 41 19.07.18 15:20 Сейчас в теме
(22) Это камень в огород всех подобных хранилищ. Убираешь хранилище - конфигурация ломается в тех местах, где было обращение к хранилищу. Поэтому коллега выступает за максимальное предопределение элементов.
28. pm74 127 19.07.18 15:29 Сейчас в теме
(26) тогда неправильно понял , я то как раз из этих соображений не стал связываться с хранилищем данных и предпочел справочник
23. 9-pm 41 19.07.18 14:41 Сейчас в теме
(21) Это образец отличной дисциплины и вообще правильное решение ) Для ссылок. И для своей конфы. А создавать кучу предопределенных элементов в базах клиентов, если, например, распространяешь свое решение и тебе надо хранить его настройки, не очень удобно. Ну, и в таком варианте можно хранить вообще все что угодно, а не только то, что можно сделать предопределенным элементом. Но вообще да - тенденция превратить это хранилище в свалку наблюдается и с ней надо бороться. Но это уже на совести разработчика )
24. herfis 261 19.07.18 14:51 Сейчас в теме
(23) Ну, разговор же был про поиск по коду. Понятно, что константы могут этим не ограничиваться.
Если распространяешь свою подсистему, то инкапсулировать служебные ссылки в отдельном объекте метаданных конечно удобно.
Но что мешает сделать в том же служебном справочнике для констант своей подсистемы предопределенные элементы? :)
25. 9-pm 41 19.07.18 15:08 Сейчас в теме
(24) На самом деле не только поиск по коду - даты, числа, строки сплошь и рядом определяются в коде - отсрочки, минимальные/максимальные суммы, проценты, время завершения проведения документов или работы пользователей, куча всего.

А, в смысле, предопределенный элемент справочника констант, в котором будет содержаться изменяемое значение. Это да, хорошая идея для распространяемых подсистем )
27. 9-pm 41 19.07.18 15:28 Сейчас в теме
(24) А, ну и еще аргумент против предопределенных элементов - если мне конкретно нужна определенная папка с определенной номенклатурой то да, предопределенный элемент - то, что надо. А если мне, например, нужна папка с номенклатурой, на которую не должны распространяться никакие скидки при продаже (дурацкий, конечно, пример, но тем не менее). Мне сказали, что это вот эта конкретная папка. Я предопределил элемент, прописал везде, где надо исключения и все заработало. А через месяц мне сказали, что теперь это не эта папка, а другая. Согласитесь, перебрасывать "ИмяПредопределенного" на новую папку в таких случаях - не лучшее решение. Или придется предопределять и новую папку и переписывать все места, где есть обращения к той. А в такого рода хранилищах можно просто перевыбрать значение специально выделенной константы.
29. herfis 261 19.07.18 17:09 Сейчас в теме
(27) Вы привели либо пример ошибки проектирования (когда надо было использовать атрибут), либо пример классической константы. Естественно, предопределенные элементы - не замена констант. Мы это уже затрагивали выше. Соответственно нужно либо добавлять классическую константу, либо если уже "скидывать" свои константы в отдельный справочник, то элементы этого справочника должны быть предопределенными (а в них уже ссылки на пользовательские объекты). Я думал, мы это уже обсудили и достигли консенсуса.
31. 9-pm 41 19.07.18 17:24 Сейчас в теме
(29) Прошу прощения, я немного сам с собой подискутировал на самом деле. Я, просто, сначала решил, что основная причина, почему предопределенными элементами не обойтись - то, что часто сохраняемые данные - не ссылки, а что-то другое, а потом вспомнил, что и для ссылок тоже есть случаи, когда предопределенных элементов не хватит. Но да - консенсус достигнут )
30. BigClock 19.07.18 17:13 Сейчас в теме
получить в коде какое-то вполне конкретное значение, слишком специфичное или слишком временное, для того чтобы выделять под него константу. Сюда же относятся случаи так называемых "магических чисел" и "магических строк", когда прямо в коде где-то посреди процедуры вдруг ДнейОтсрочки = 15, или СтрокаComПодкюченияКБазе = "Srvr=..."


Для подобных случаев в типовых конфигурациях я использую процедуры "ХранилищеОбщихНастроекСохранить" и "ХранилищеОбщихНастроекЗагрузить" общего модуля "ОбщегоНазначения":

Процедура ХранилищеОбщихНастроекСохранить(КлючОбъекта, КлючНастроек, Настройки,
			ОписаниеНастроек = Неопределено,
			ИмяПользователя = Неопределено,
			ОбновитьПовторноИспользуемыеЗначения = Ложь)

Функция ХранилищеОбщихНастроекЗагрузить(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию = Неопределено, 
			ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено)
Показать


Зачастую также бывает полезно устанавливать для управляемой формы свойство "АвтоматическоеСохранениеДанныхВНастройках", после чего
отметить галочками поле "Сохранение" у соответствующих реквизитов формы.
32. 9-pm 41 19.07.18 17:31 Сейчас в теме
(30) Я в принципе целиком поддерживаю мысль хранить настройки форм в хранилищах настроек - это как раз пример того, что не стоит тянуть в справочник констант, так как для этого есть специальное удобное место ) Но с другой стороны, совать в хранилище настроек что-то помимо настроек мне кажется не лучшей идеей, хотя технически это и реализуемо. Как минимум, не получится без проблем по быстрому изменить какие-то значения.
33. PowerBoy 2847 20.07.18 06:37 Сейчас в теме
(30)(32) У хранилищ настроек есть большой минус - к ним нельзя обратится напрямую из запроса.
Irwin; pm74; +2 Ответить
34. pm74 127 20.07.18 09:28 Сейчас в теме
еще думал про вариант с быстрыми константами , который можно использовать в.т.ч в запросах :
есть справочник (константы) имеющий 3 реквизита (тип ПВХ) и табличную часть (характеристики )
в состав ПВХ включаем этот справочник , создаем в нем несколько предопределенных элементов к1,к2,к3,к4.. кn
тогда в тч справочника например из 3 колонок (кi,кj , КакаяТоКонстанта) получим количество размещений из кi,кj = n в квдрате , различных констант
на каринках - примерно то как это могло бы выглядеть ( колонки кi,кj - константа1 константа2)

зы. но это так , фантазии , сам не пользуюсь ))
Прикрепленные файлы:
35. 9-pm 41 20.07.18 10:26 Сейчас в теме
(34) Что-то запутался, честно говоря ) А в запросах и мой вариант можно использовать: в запросе к табличной части справочника констант "ГДЕ Ссылка.Наименование = "ИмяГруппыКонстант" И ИмяКонстанты = "ИмяКонстанты"" и все. Хотя, чаще всего проще параметром передать )
36. pm74 127 20.07.18 10:36 Сейчас в теме
(35)
ничего сложного на самом деле
"выбрать тч.константа из Справочник.константы.ТЧ как тч где тч.к1 = значение(ki) и тч.к1 = значение(kj) "
даже параметров не нужно

главное не запутаться в нумерации ))

но , как говорил , сам так не делаю , просто создаю предопределенный эл. справочника
настраиваю структуру и закрываю для изменения
тогда
"выбрать * из Справочник.константы.ТЧ как тч где тч.ссылка = значение(ПредопределенныйЭлемент) "
37. 9-pm 41 20.07.18 11:25 Сейчас в теме
(36) А, так да - несколько неудобно. Или обвязку какую-то писать и соответствия между нумерацией и содержанием где-то хранить. Да и незачем, когда через предопределенные элементы можно )
38. pm74 127 20.07.18 11:28 Сейчас в теме
(37) к тому же такой справочник помимо констант выполняет функцию настраиваемого мини регистра сведений
55. AlexO 125 21.07.18 15:32 Сейчас в теме
(38)
выполняет функцию настраиваемого мини регистра сведений
простите, функцию какого такого "мини регистра сведений"? Если что, справочник в 1С - сам себе "регистр" с кучей дополнительных таблиц.
И "настраиваемого" - это как? Минуточку, небольшой экскурс.
В программировании "настраиваемый объект" - это, минимум, изменение/добавление полей и типов содержащихся в них данных. "Настраиваемый" как стандарт - это добавление/изменение свойств и методов объекта. Дальше - только изменение и влияние через этот объект на структуры/свойства/данные других объектов.
И как же "такой справочник помимо констант выполняет функцию настраиваемого мини регистра сведений"?
58. pm74 127 21.07.18 15:38 Сейчас в теме
(55) AlexO вы там желчью не захлебнитесь
61. AlexO 125 21.07.18 15:47 Сейчас в теме
(58) по конфигурированию в 1С можете что-то сказать? Или у вас все возражения - только по вопросу желчи, которую, видимо, вокруг вас постоянно "разливают".
К счастью, с процессом не знаком, тонкости не подскажу.
44. AlexO 125 21.07.18 14:22 Сейчас в теме
(34)
еще думал про вариант с быстрыми константами
например, чтобы гимн запросом получить? Не, а почему бы и нет... вот хочется и все)
есть справочник (константы) имеющий 3 реквизита (тип ПВХ) и табличную часть (характеристики )
ну, т.е., вы представляете, сколько такая конструкция вызовет соединений при использовании в запросе...
39. yelloo 4 21.07.18 09:32 Сейчас в теме
Кажется, я нашёл, чем заменить все вызовы НайтиПоКоду/Наименованию. Спасибо, возьму на вооружение!
40. AlexO 125 21.07.18 14:14 Сейчас в теме
(39)
Кажется, я нашёл, чем заменить все вызовы НайтиПоКоду/Наименованию. Спасибо, возьму на вооружение!

Да уж, при избавлении от таких излишеств ваш уровень программиста просто взлетит вверх.
И не забудьте в типовых, какие там у вас есть - БП, ЗУП, - тоже все "НайтиПоКоду/Наименованию" заменить. Ибо нефиг, а то расслабились типовописатели...
72. Bassgood 807 22.07.18 01:43 Сейчас в теме
(40) Ну да, методы "НайтиПоКоду/НайтиПоНаименованию" куда лучше, чем использование каких-либо механизмов, спору нет, спасибо мастер ;)
46. 9-pm 41 21.07.18 14:32 Сейчас в теме
43. AlexO 125 21.07.18 14:18 Сейчас в теме
Давно не на попадалось головокружения "от мощи 1С" и фантазий на тему обработки данных в 1С, оформленного не просто в виде статьи или пустого коммента "да я, да мы, да все смогем, там делов-то на копейку, вот план и диаграмма успеха", а в "практика программирования".
"В топ 5 правил гигиены корпоративной разработки входит "Не используй НайтиПоНаименованию. И НайтиПоКоду тоже не стоит."

Ага, понятно. Т.е. в список инструкций 1С - эти включены специально с хитрой целью выявления и отлова нечистоплотных программистов.
Используешь - получи запрет на программирование.
"Сюда же относятся случаи так называемых "магических чисел" и "магических строк", когда прямо в коде где-то посреди процедуры вдруг ДнейОтсрочки = 15"

А совсем магическое "Если Перем=0 Тогда..." не смущает? Ведь конкретная цифра, да еще и ноль, а после "Тогда..." и вообще чушь какая - алогичное ветвление с неединственным, можно сказать - непредсказуемым, результатом...
"К тому же регистр - достаточно хрупкое образование - одна неловкая строчка и регистр пуст."

Да, справочник намного крепче - он железный, ну, или на крайняк, бумажный. Не то, что какие-то цифровые регистры.
"Плюс интерфейс по хорошему бы переписать, чтобы запись ненароком непосредственно не удалить."
Запрет на изменение, подтверждение удаления, с особыми правами? И то верно, зачем... нужно сразу интерфейс переписать, а если влом - то справочником заменить. Ведь в справочнике просто так ничего не удалишь, да и хранит он вечно все, что в него попало.
"Плюс когда констант станет больше ста, остро возникнет желание как-то разложить их по папочкам"

Ну да, например, "мои первые сто констант". А на 101-ю - уже отдельную папочку, будьте добры.Тогда сразу - пишешь себе формочку с миллионом вкладок, и меняй все свои константы не таская, и не открывая туда-сюда целый справочник. Он же железный, так ведь?
"Организовано все достаточно просто - справочник с табличной частью. "

Да, это менее громоздкое и емкое сооружение по сравнению с регистром, который, практически - одна таблица.
"К этому прикручен программный API"

Что, простите, прикручено? Интерфейс управления приложением?! Вы где слов таких нахватались? Точно в УЦ? А он точно сертифицирован?
"То есть, для примера, хотим мы сохранить реквизиты для подключения по COM соединению к какой-то базе"

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

" - Что-то у нас база стала тормозить последнее время...
- А, это вспышки на солнце...
- Вон оно что... ну, тогда, давай еще раз мне гимн фирмы при открытии СФ, а потом, если месяц закроется - покажешь кино с прошлогоднего корпоратива"
"Механизм сам поймет, что тип не примитивный и не ссылочный и запакует в ХранилищеЗначения."
Это какой механизм так поймет? Ваш фантастичный API над 1С? А у нас в 1С все более прозаично и приземленно - если не пропишешь проверку всего и вся, да еще и с контролем всех сортов этого "всего", то сам "механизм" ничего не определит, разве что ошибку.
Два основных метода - сеттер и геттер

Сеттер - это порода собак, а "геттер" - это газопоглотитель, вещество такое; и если в Ява подобный шлак хотя бы оправдан - там этот метод сам по себе объект, то у Вас - это фамилия немецкая какая-то?
Но это точно не из области и методов ни ООП-программирования, ни 1С-конфигурирования, а, скорей, гик-программинга.
"А вот хранить допустимое количество дней отсрочки платежа, которое коммерческий директор любит менять по два раза в месяц"

У вас один договор на всех контрагентов? А параметры договора - хранятся кусками по всей конфигурации?
"Или, например, дату, с которой надо начинать особенным образом обрабатывать реализации товаров"

Что-что хранить? "Дату, с которой ... начинать особенным образом ..."?! Ну тогда сразу привяжите её еще и к дню взятия Бастилии. А то не комильфо получится - такой праздник, а у вас выгрузка в Меркурий...
А дальше примеры - один хлеще другуого:
"Или ссылку на какую-то конкретную внешнюю обработку, которая содержит нужные куски логики (или саму ее в виде двоичных данных)"

Внешняя (sic!) обработка содержит куски кода, которые используются в продакшен-базе?!
"Или логотипы разные на все случаи жизни"
А просмотр логотипов - сделал? Да? Хмм... А редактирование?! Нет? Нет редактора логотипов, этого наиважнейшей части всех типовых конф?? Вот я тебя и поймал!
"Или строки подключения ко всем базам из вашего зоопарка"
И то верно, ведь текстовый файл со всеми строками, да и с комментариями заодно - такая нелепость. А тут - константы, понимаешь, взял, обратился за строками, да как подключился ко всем базам одновременно! Лепота!
"из чувствительного к версиям используется СтрНайти - поменять на Найти несложно"

А свою "НайтиСтр" написать, чтобы не быть привязанным к нелепостям платформы? Заодно и в константы код можно кинуть... для чтобы потом в "Выполнить" - и лепота, выполняем код из константы, это не вам не тут!
"В коде конфигурации четырежды используется НайтиПоНаименованию"

Ну как так-то, а как же кодекс программиста и зарок не использовать "дурные" методы?
FlavusMons; Irwin; +2 2 Ответить
45. 9-pm 41 21.07.18 14:31 Сейчас в теме
49. AlexO 125 21.07.18 14:58 Сейчас в теме
(45)вас не кормят? Ну тогда немедленно поешьте, а то фантазии, с голода, они, обычно, жуткие )
FlavusMons; +1 2 Ответить
83. FlavusMons 23.07.18 17:53 Сейчас в теме
(43) Читал и плакал, показывал коллегам. Не понимаю, что вас минусят, все правильно пишете. Ветка вся посвещена костылям и велосипедам. Пишу под вашим камментом, чтобы выразить поддержку:).
Проще нужно быть и использовать объекты по назначению.
Хочешь хранить настройки подключения к ВНЕШНИМ БАЗАМ(или любым другим информационным ресурсам типа сайтов, микро-сервисов и т.д.), заведи справоник ВнешниеИнформационныеРесурсы и храни там строки подключения, ключи, и прочую инфу. Только грамотно спроектируй.
Хочется накрутить настроек столько, что не прилично хранить в константах - вернись к старом проверенному РС+ПВХ, как было в типовых раньше. Нужны группировки связанных настроек - так и в ПВХ есть иерархия.
Боишься "случайного" удаления регистра - имей бекап или пропиши в модуле набора записей провереку, какую захошь. Но лучше не запускай сомнительный код на боевой. И т.д.
Подо все заявленные тут задачи для МЕГАУНИВЕРСАЛЬНОГО хранилища ВСЕГО есть свои простые и понятные решения, которые будут оптимальнее по произволительности и легче поддерживаться.
Я представляю, что прихожу на новую работу и в наследство мне достается Справочник мпЗначениеКонстант, который описан выше и полконфы завязано на его использоватние - да я бы или списля или уволися, разбираясь.
SlavaKron; +1 1 Ответить
84. 9-pm 41 23.07.18 18:15 Сейчас в теме
(83) Ну, минусят больше за стиль а не за содержание. А по делу - про РС+ПВХ тут много обсуждали уже. Нормальное, рабочее решение. Но помимо уверенности по поводу того, какого типа вернется значение (которая, кстати, вполне может быть достигнута и по-другому), никаких больше преимуществ не озвучивали. Ну, кроме "это в типовых, все так делают и ты не выёживайся" )

Про "простые и понятные решения" для задачи "МЕГАУНИВЕРСАЛЬНОГО хранилища ВСЕГО" хотелось бы подробнее. Серьезно. Без сарказма. Может, не только мне было бы полезно.

А по поводу того, что полконфы завязано на использование - так на "РС+ПВХ" тоже можно полконфы завязать ) Я по этому поводу и в описании и в комментариях раз 5 уже написал - не надо превращать в свалку, держите себя в руках, анализируйте и проектируйте о того как что-то сделать. Поэтому либо позиция может быть против подобных хранилищ вообще, включая РС+ПВХ (тоже имеет право на жизнь такая позиция). Либо то, что на это неаккуратный разработчик может завязать больше чем стоило бы - не аргумент против какого-то одного способа организации хранилищ констант.
89. FlavusMons 24.07.18 09:19 Сейчас в теме
(84) Не, я как раз писал о том, что "МЕГАУНИВЕРСАЛЬНОЕ" обычно становится плохоподдерживаемым и порождает свалку. Поэтому вместо одного мехнизма на все, лучше несколько попроще, но специализированных и хорошо заточенных под выполняемую задачу. Как примеры привел решения задач которые здесь писали, каждая из которых просто решается своим отдельным подходом.
93. 9-pm 41 24.07.18 18:26 Сейчас в теме
(89) аа, видимо, не так понял. Ну, да. Собственно, мастерство во многом и заключается в выборе баланса между специализированностью и абстракцией. Естественно, если писать хайлоад, то вообще проще с бизнеса взять обещание не менять правила и все прописать прямо в коде - потому что ничего не может быть быстрее, чем "СтавкаНДС = 0.18;" Значение даже получать ниоткуда не надо. А что не примитивных типов, то в параметры сеанса - их получать быстрее всего. Но чаще такой оптимизации не требуется и тогда появляются разнообразные хранилища. Но я, собственно, никому и не навзываю )
59. AlexO 125 21.07.18 15:42 Сейчас в теме
В топ 5 правил гигиены корпоративной разработки

И да, огласите весь список, пожалуйста.
FlavusMons; +1 3 Ответить
70. kote 485 22.07.18 00:26 Сейчас в теме
Идея с предопределенными значениями мне категорически не нравится - много телодвижений.. с ПВХ тоже - особо большой пользы от этого не вижу..

Все же согласен с автором - чем решение проще и понятнее - тем лучше.

Если речь о константах, которые нужно "зашить" в код - возможно лучше будет сделать так: создать регистр сведений, с текстовым ключом- измерением, который прописываем в коде, и ресурсом-значением. Сделать экспортные функции для этого РС - возвращающую и устанавливающую эту "псевдоконстанту" по значению текстового ключа.

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

Но при записи нужно будет первое значение для любой псевдоконстанты писать на "начало времен" или как то по иному решать что делать для случаев, когда в старом периоде значение еще не было установлено (возвращать Неопределено, скажем..)
73. 9-pm 41 22.07.18 07:40 Сейчас в теме
(70) ну, собственно, вы описали очевидный вариант, с котрым практически в таком же виде я и жил года полтора. Но у регистра сведений есть несколько минусов, которые заставили меня придумать вот такой вариант со справочником. Основным для меня стало неудобство регистра в плане группировки этих констант )
74. yelloo 4 22.07.18 12:49 Сейчас в теме
(73) Согласен, удобнее. Мне нравится это решение, оно простое и удобное. Многие хаят, что РС оптимальнее, но разве удобнее?=) Да и насколько ничтожно слышать "с РС будет быстрее", насколько?) Уж если такие проблемы, то используйте модуль с повторным использованием возвращаемых значений, или вообще в параметры сеанса запилить самые часто вызываемые... да кому на что фантазии хватит!
Но это решение простое, оригинальное и удобное. Я всё сказал :)
78. 9-pm 41 22.07.18 17:00 Сейчас в теме
81. user774630 23.07.18 13:16 Сейчас в теме
(73)
Основным для меня стало неудобство регистра в плане группировки этих констант )

Я решил проблему с группировкой через реквизит Описание и настройку группировки. Дешево и сердито )
И храню, как многие, данные в регистре, но структура сделана так, чтобы можно было одному значению сопоставить другое. Т.е., какой-то признак для контрагента (например, секретный договор по умолчанию), а если общее значение - то использую организацию.

Спасибо за публикацию!
Прикрепленные файлы:
82. 9-pm 41 23.07.18 14:11 Сейчас в теме
(81) вот, кстати, да - надо будет интерфейс с деревом сделать ) благодарю за наводку )
87. kote 485 24.07.18 02:15 Сейчас в теме
(73) Сам ключ может нести информацию о группировках или иерархии - примерно вот так:

Ключ => Значение
"Группа.Предмет.Свойство1" => Значение1
"Группа.Предмет.Свойство2" => Значение2
"Группа.Предмет.Свойство3" => Значение3

Все это неплохо сортируется и достаточно легко превращается в деревья.
88. 9-pm 41 24.07.18 08:22 Сейчас в теме
(87) К чему-то подобному я пришел под конец использования регистра. Только сначала были префиксы чтобы по алфавиту удобно сортировалось все. А в деревья это, конечно, превращается, но, мне кажется, налагает достаточно много ответственности на интерфейс. То есть, чтобы показать это дело на форме надо распарсить ключи, чтобы создать новый ключ надо собрать всех родителей и "запарсить" всё обратно. В принципе, вариант, но мне показалось, что так проще.
79. buganov 49 23.07.18 05:20 Сейчас в теме
Мы у себя пользуемся ПВХ + РС + Модуль с повторным использованием. Сразу видно все константы в таблице, а не магические наименования справочника. Администрировать проще. Наиболее критичные значения ПВХ можно перенести в предопределенные значения и вероятность ошибки сводится к нулю
FlavusMons; Irwin; +2 Ответить
80. 9-pm 41 23.07.18 05:44 Сейчас в теме
(79) Ну, если учетную систему не для Хогвартса поддерживаешь, то наименования групп констант совсем не обязательно делать магическими ) Насчет администрирования - как раз неудобство того, что все свалено в одну таблицу меня изначально и навело на мысль реорганизовать то, как у меня хранились константы. Хотя, может, не у всех мания все раскладывать по папочкам и полочкам )
90. Zaxaron 24.07.18 14:52 Сейчас в теме
Да, я тут смотрю сказки пошли ...осталось теории выдвинуть и в путь с барабаном )))
Оставьте свое сообщение