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

23.06.25

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

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

Скачать файл

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

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

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

Логин = "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    30455    11    1    

12

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

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

21.04.2025    9288    RPGrigorev    31    

54

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

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

11.03.2025    7802    mrXoxot    53    

56

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

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

12.02.2025    8804    556    wonderboy    45    

132

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

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

16.09.2024    19359    markbraer    66    

43

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

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

22.08.2024    14651    alex_sayan    41    

62

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

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

1 стартмани

04.06.2024    8117    mrXoxot    55    

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

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

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

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

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


А по простыне из поста ответ простой. Любой хардкод это дичь и за такое надо отрубать руки по самую голову. А в тексте речь именно про хардкод. А то что там пароли и логины вопрос десятый
Оставьте свое сообщение