Простейший механизм «Дополнительных настроек» или почему хранить пароли, ключи API и другие параметры в коде — плохо?

23.06.25

Администрирование - Информационная безопасность

Представьте ситуацию: вы пишете обработку для отправки email-уведомлений клиентам. Чтобы подключиться к серверу почты, вам нужны: логин, пароль, SMTP-адрес. Что делает большинство программистов?

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
(только для физ. лиц)
Расширение "ДополнительныеНастройки"
.cfe 12,42Kb
1 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Просто пишут:

Логин = "admin@example.com";
Пароль = "secret123";
SMTPАдрес = "smtp.example.com";

Звучит разумно?

На первый взгляд — да.

Но на самом деле — это как оставить ключ от квартиры на видном месте.

 

Что может пойти не так?

  1. Изменение одного параметра требует правки кода

Представь, что нужно сменить пароль от почты или адрес SMS-сервиса.

Что ты делаешь?

Входишь в конфигуратор → ищешь нужный модуль → меняешь строку → сохраняешь → перезаливаешь обработку.

Если таких мест несколько (а они есть!), то приходится:

  • искать по всем модулям,
  • бояться сломать что-то ещё,
  • тестировать после каждой замены.
  1. Такие параметры часто дублируются в разных местах

Вот типичная ситуация:

В одном модуле используется SMTPАдрес = "smtp.example.com";

Во втором — СерверПочты = "smtp.example.com";

В третьем — "mail.example.com"

Один и тот же параметр, но написан по-разному и в разных местах.

И если сервер меняется… начинается кошмар поддержки.

  1. Это опасно с точки зрения безопасности

Когда ты хранишь:

  • пароли,
  • токены API,
  • логины,

прямо в коде, ты рискуешь:

  • Утечкой данных : коллега, партнёр или даже бывший сотрудник получает доступ.
  • Юридическими последствиями : особенно если вы работаете с персональными данными или платёжными системами.

 

Пример из жизни

Ситуация:

Вы интегрируете 1С с SMS-сервисом. Пишете:

APIКлюч = "abc123xyz";

Проходит полгода. Ключ утек. Или просто истёк. Нужно поменять.

Что происходит?

Вы открываете конфигурацию.

Ищете все места, где встречается APIКлюч.

Меняете значение.

Тестируете каждую точку, чтобы ничего не сломалось.

А если этот ключ использовался:

  • в внешней обработке,
  • в расширении,

— тогда вы потратите часы, чтобы всё найти и исправить и протестировать.

 

А теперь представь, как можно было сделать правильно

Вместо этого:

APIКлюч = "abc123xyz";

Сделай так:

APIКлюч = Настройки.ЗначениеНастройки("КлючАПИ");

Где ЗначениеНастройки () берёт данные из таблицы с общими настройками, список которых можно расширять в пользовательском режиме:

Теперь, чтобы изменить ключ — достаточно обновить одну точку.

Никаких поисков, никакого редактирования кода.

 

Ещё примеры из реальной жизни

Ссылки на элементы справочников или документы

НужныйКонтрагент = Справочник.Контрагенты.НайтиПоКоду("001");
Молоко = Справочник.Номенклатура.НайтиПоНаименованию("Молоко");
ЭталонныйДокумент = Документ.РеализацияТоваров.НайтиПоНомеру("1001");

Хороший вариант:

НужныйКонтрагент = Настройки.ЗначениеНастройки("НужныйКонтрагент");
Молоко = Настройки.ЗначениеНастройки("Молоко");
ЭталонныйДокумент = Настройки.ЗначениеНастройки("ЭталонныйДокумент");

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

Тестирование проводилось на релизах: 8.3.25.1501 (X32/x64), Управление торговлей, редакция 11 (11.5.12.167). Однако должно работать на любой конфигурации, возможно нужно будет исправить режим совместимости, в случае использования более старых версий конфигураций. 

Проверено на следующих конфигурациях и релизах:

  • Управление торговлей, редакция 11, релизы 11.5.12.167

Вступайте в нашу телеграмм-группу Инфостарт

Стандарты 1С Чистый код рефакторинг хранение настроек пароли

См. также

Информационная безопасность Программист 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

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

2400 руб.

29.08.2016    30499    11    1    

12

Рефакторинг и качество кода Программист 1С v8.3 Россия Бесплатно (free)

Цель статьи: кратко показать инструмент и возможности Cursor IDE.

21.04.2025    13785    dimzfresh    41    

46

Рефакторинг и качество кода Программист Стажер Бесплатно (free)

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

21.04.2025    10628    RPGrigorev    31    

54

Нейросети Рефакторинг и качество кода Тестирование QA Программист 1С v8.3 Бесплатно (free)

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

11.03.2025    8391    mrXoxot    53    

56

Инструментарий разработчика Рефакторинг и качество кода Программист 1С v8.3 Бесплатно (free)

Расширяемый форматтер структуры модулей 1С. Умеет автоматически расставлять стандартные области и раскидывать по ним процедуры и функции модуля, оформлять стандартные комментарии к методам с помощью ИИ. Также умеет анализировать модуль - извлекать структуру вызовов, используемые поля и т.д. Реализован в виде расширения (.cfe). Можно использовать как платформу для обработки кода в своих задачах автоматизации разработки.

12.02.2025    9102    583    wonderboy    45    

133

Рефакторинг и качество кода Программист Стажер 1С v8.3 1C:Бухгалтерия Бесплатно (free)

В последнее время термин «чистый код» стал очень популярным. Появились даже курсы по данной тематике. Так что же это такое?

16.09.2024    19826    markbraer    66    

43

Рефакторинг и качество кода Программист Бесплатно (free)

SOLID – принципы проектирования программных структур (модулей). Акроним S.O.L.I.D. образован из первой буквы пяти принципов. Эти принципы делают код более гибким, упрощают разработку. Принято считать, что принципы SOLID применимы только в объектно-ориентированном программировании. Но их можно успешно использовать и в 1С. Расскажем о том, как разобраться в принципах SOLID и начать применять их при работе в 1С.

22.08.2024    14977    alex_sayan    41    

62

Рефакторинг и качество кода Программист 1С v8.3 Абонемент ($m)

В статье расскажу и покажу процесс проведения Code-review на примере обработки с GitHub.

1 стартмани

04.06.2024    8340    mrXoxot    55    

42
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 925 23.06.25 16:49 Сейчас в теме
В БСП давно придумали РС "БезопасноеХранилищеДанных".
Но как по мне - оно тоже не такое уж безопасное, как звучит из названия.
Я б сделал шифрованное хранилище, а ключ шифрования, например, хранил бы в файле, доступ к которому есть только у той учётки, от которой выполняется 1с
2. markbraer 93 23.06.25 16:50 Сейчас в теме
(1) это будет в следующей статье))
3. SerVer1C 925 23.06.25 17:17 Сейчас в теме
(2) вы решили из примитивного механизма сделать многосерийную "Санта-Барбару" ?
Alexwarsis; starik-2005; proonec; +3 Ответить
4. starik-2005 3180 23.06.25 19:12 Сейчас в теме
(3)
вы решили
Не, это ты идею подкинул. Осторожнее надо быть )))
ixijixi; SerVer1C; +2 Ответить
5. sanymust 51 24.06.25 01:10 Сейчас в теме
Как только у человека возникает мысль написать НайтиПоКоду(), я бы его к разработкам не допускал больше, это уровень школьника. Эти рекомендации больше к людям, кто никогда не учился на программиста.
6. user1832003 59 24.06.25 03:28 Сейчас в теме
(5) в типовой УХ и ERP УХ функционал согласования реализован на НайтиПоНаименованию(). В целом для технических и статических (условно статических) вещей нормальная тема. Типо когда у тебя есть универсальный механизм согласования по объектам, но набор этих объектов и заранее неизвестен и зависит от конфигурации (типо УХ и объединенный вариант ERP УХ с разными наборами объектов), но он при этом постоянен (условный справочник либо есть, либо нет и на этом все и заполнение обеспечивается обработчиками обновления\начального заполнения), то тогда нормальных подход.

А вот по части искать номенклатуру или документ по наименованию или коду это из разряда дичи.

типо вот пример

Функция ПеревестиЗаявкуВСостояниеУтверждена(ОбъектСсылка, ТолькоЗаполненные = Ложь, ДокументПроцесса = Неопределено, ИдентификаторФормыДляВыводаПротокола = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
	// Инициализация.
	ДополнительныеПараметры = МодульУправленияПроцессамиУХ.ИнициализироватьДополнительныеПараметрыСогласования(ДополнительныеПараметры);
	ИдентификаторСообщенияРабочий = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеПараметры, "ИдентификаторСообщения", "");
	ИдентификаторФормыДляВыводаПротокола = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеПараметры,
		"ИдентификаторФормыДляВыводаПротокола", Неопределено);
	
	Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ОбъектСсылка)) Тогда
		ТипОбъектаСогласования = Справочники.СправочникиБД.НайтиПоНаименованию(ОбъектСсылка.Метаданные().Имя,,,Справочники.ТипыБазДанных.ТекущаяИБ);
	Иначе
		ТипОбъектаСогласования = Справочники.ДокументыБД.НайтиПоНаименованию(ОбъектСсылка.Метаданные().Имя,,,Справочники.ТипыБазДанных.ТекущаяИБ);
	КонецЕсли;	
	Если Не ЗначениеЗаполнено(ТипОбъектаСогласования) Тогда
		Возврат Ложь;
	КонецЕсли;	
	
	СтатусУтвержден = ТипОбъектаСогласования.ЗначениеРеквизитаСостоянияУтвержден;
	Если НЕ ТолькоЗаполненные ИЛИ ЗначениеЗаполнено(СтатусУтвержден) Тогда
		РезультатПеревода = ПеревестиЗаявкуВПроизвольноеСостояние(ОбъектСсылка, СтатусУтвержден, , , , ДокументПроцесса, , , ИдентификаторФормыДляВыводаПротокола, ИдентификаторСообщенияРабочий);
		Если Не РезультатПеревода Тогда
			Возврат Ложь;
		КонецЕсли;
	Иначе
		// Новый статус пустой, и его установка не требуется.
	КонецЕсли;
	
	Если ТипЗнч(ОбъектСсылка) = Тип("СправочникСсылка.РеестрыСогласуемыхОбъектов") Тогда
		УстановитьСтатусыПодчиненныхОбъектов(ОбъектСсылка, "Утвержден");
	КонецЕсли;
	
	Возврат Истина;

КонецФункции		// ПеревестиЗаявкуВСостояниеУтверждена()
Показать


А по простыне из поста ответ простой. Любой хардкод это дичь и за такое надо отрубать руки по самую голову. А в тексте речь именно про хардкод. А то что там пароли и логины вопрос десятый
7. Cерый 28 30.06.25 21:44 Сейчас в теме
(5) Предлагаю открыть любую типовую конфигурацию и выполнить глобальный поиск "НайтиПоКоду", возможно, Вы согласитесь с правомерностью применения этой функции; кроме того, БД содержит индекс на код, это отработает быстрее всего, например, при импорте/экспорте между базами.
8. sanymust 51 01.07.25 01:03 Сейчас в теме
(7) Вы неверно трактуете мое сообщение, я допускаю "НайтиПоКоду()" как метод, но в специфичных случаях, когда код однозначно идентифицирует экземпляр объекта и не нарушит алгоритм в случае если код будет изменен руками и не будет зависеть от конкретной ИБ, а являться универсальным решением (в том числе в случаях некой синхронизации объектов по коду), я же говорил об использовании метода для справочников, где код для элемента является "переменной" и только актуален в конкретной базе (ну допустим есть индивидуумы которые организацию, склад, номенклатуру могут искать по коду или проверять его в условии на соответствие)
Cерый; +1 Ответить
Оставьте свое сообщение