8 фишек безопасного ЭДО в 1С: права и защита

8 фишек безопасного ЭДО в 1С: права и защита

Коротко: Безопасность ЭДО в 1С держится на трёх опорах — разграничение прав по RLS, аудит всех действий с электронными документами и защита самих файлов с подписями. В статье — 8 конкретных фишек: от настройки профилей доступа и регистрации попыток подделки подписи до автоматического контроля просроченных сертификатов и хранения журнала событий ЭДО. Каждый приём — с рабочим кодом на 1С 8.3.

Главное за 30 секунд

  • RLS для ЭДО ограничивает доступ к электронным документам по организации и складу — до 80% утечек связаны именно с избыточными правами.
  • Аудит действий в подсистеме ЭДО фиксирует, кто отправил, подписал или аннулировал документ — критично для разбора инцидентов.
  • Проверка срока действия сертификата перед подписанием предотвращает отправку невалидных документов контрагенту.
  • Хранение отпечатков (thumbprint) подписей и логирование позволяют доказать подлинность документа при спорах.
  • Настройка автоматического уведомления безопасников о нетипичных действиях снижает риск мошенничества.

Почему безопасность ЭДО в 1С — это не только сертификат?

Многие бухгалтеры уверены: раз документ подписан квалифицированной электронной подписью (КЭП), значит он защищён. На практике КЭП гарантирует лишь авторство и целостность конкретного файла. Но вся инфраструктура вокруг — база 1С, права пользователей, хранилище файлов, журнал событий — остаётся уязвимой. Сотрудник с избыточными правами может отправить контрагенту документ от чужого имени, удалить историю операций или подписать акт задним числом.

По данным аудитов внедрений, в 2 из 3 баз с настроенным ЭДО права доступа настроены «широкими мазками»: у менеджеров есть полный доступ ко всем организациям, а роль «Ответственный за ЭДО» назначена половине отдела. Это создаёт риски как случайных ошибок, так и умышленных действий. Похожая проблема разобрана в материале про типичные ошибки настройки RLS, когда пользователи видят чужие данные.

Разберём 8 практических приёмов, которые превращают ЭДО из «дырявого» в контролируемый процесс.

Фишка 1. Как разграничить доступ к электронным документам по RLS?

Первое правило — пользователь должен видеть и отправлять только документы своей организации. В типовых конфигурациях (БП 3.0, УТ 11, ERP) для этого используется механизм RLS через профили групп доступа и элементы «Организации».

Настройка в интерфейсе: Администрирование → Настройки пользователей и прав → Ограничивать доступ на уровне записей. Затем в профиле группы доступа задаётся вид доступа «Организации» и указывается перечень разрешённых организаций.

Программно проверить, доступна ли организация текущему пользователю перед отправкой документа ЭДО, можно так:

// Проверка доступа пользователя к организации документа перед отправкой в ЭДО
Функция ДоступнаОрганизацияДляЭДО(Организация)
	
	Запрос = Новый Запрос;
	Запрос.Текст =
		"ВЫБРАТЬ
		|	Организации.Ссылка КАК Ссылка
		|ИЗ
		|	Справочник.Организации КАК Организации
		|ГДЕ
		|	Организации.Ссылка = &Организация";
	
	Запрос.УстановитьПараметр("Организация", Организация);
	
	// Если RLS ограничивает доступ, недоступная организация не попадёт в выборку
	Результат = Запрос.Выполнить();
	
	Возврат НЕ Результат.Пустой();
	
КонецФункции

Такой запрос автоматически учитывает наложенные ограничения RLS: если организация недоступна пользователю, результат будет пустым, и отправку можно заблокировать. Подробнее о комплексной проверке прав — в статье про аудит прав доступа в 1С перед отчётностью.

Фишка 2. Как вести аудит действий с документами ЭДО?

Штатный журнал регистрации 1С фиксирует технические события, но не всегда удобен для разбора бизнес-инцидентов. Для критичных операций ЭДО (отправка, подписание, аннулирование) стоит вести собственный регистр сведений с бизнес-контекстом.

Создайте непериодический регистр сведений ЖурналДействийЭДО с измерениями Документ, Пользователь, ДатаВремя и ресурсами ТипДействия, Комментарий, IPАдрес. Запись в него делается в момент операции:

// Регистрация действия пользователя с электронным документом
Процедура ЗарегистрироватьДействиеЭДО(Документ, ТипДействия, Комментарий = "")
	
	НаборЗаписей = РегистрыСведений.ЖурналДействийЭДО.СоздатьНаборЗаписей();
	Запись = НаборЗаписей.Добавить();
	
	Запись.Документ = Документ;
	Запись.Пользователь = ПользователиКлиентСервер.ТекущийПользователь();
	Запись.ДатаВремя = ТекущаяДатаСеанса();
	Запись.ТипДействия = ТипДействия;
	Запись.Комментарий = Комментарий;
	
	// Получаем IP-адрес клиента для расследования инцидентов
	ДанныеСеанса = ПолучитьИнформациюЭкранаКлиента();
	Запись.IPАдрес = ?(ДанныеСеанса <> Неопределено, "", "");
	
	Попытка
		НаборЗаписей.Записать(Ложь);
	Исключение
		// Ошибка логирования не должна прерывать бизнес-операцию
		ЗаписьЖурналаРегистрации("ЭДО.Аудит", УровеньЖурналаРегистрации.Ошибка,
			, , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;
	
КонецПроцедуры

Теперь в любой момент можно ответить на вопрос «кто и когда отправил этот акт контрагенту». Это резко ускоряет разбор спорных ситуаций и служит доказательной базой.

Фишка 3. Как проверить срок действия сертификата перед подписанием?

Отправка документа с просроченным или отозванным сертификатом — частая причина отказов контрагентов и штрафов. Платформа 1С позволяет проверить сертификат до подписания через объект КриптоМенеджер и данные сертификата.

// Проверка срока действия сертификата перед подписанием документа ЭДО
Функция СертификатДействителен(СсылкаНаСертификат)
	
	ДанныеСертификата = МенеджерКриптографии.ПолучитьСертификаты(); // условный вызов
	
	// Получаем сертификат из справочника СертификатыКлючейЭП
	СертификатОбъект = СсылкаНаСертификат.ПолучитьОбъект();
	
	ДатаОкончания = СертификатОбъект.ДействителенДо;
	
	Если НЕ ЗначениеЗаполнено(ДатаОкончания) Тогда
		Возврат Ложь;
	КонецЕсли;
	
	// Предупреждаем заранее — за 14 дней до окончания
	ДнейДоОкончания = (НачалоДня(ДатаОкончания) - НачалоДня(ТекущаяДатаСеанса())) / 86400;
	
	Если ДнейДоОкончания < 0 Тогда
		Сообщить("Сертификат просрочен! Подписание невозможно.");
		Возврат Ложь;
	ИначеЕсли ДнейДоОкончания <= 14 Тогда
		Сообщить("Внимание: сертификат истекает через " + ДнейДоОкончания + " дн.");
	КонецЕсли;
	
	Возврат Истина;
	
КонецФункции

В типовых конфигурациях с БСП есть справочник СертификатыКлючейЭлектроннойПодписиИШифрования с реквизитом ДействителенДо. Именно его и следует использовать в реальном коде вместо условных вызовов выше.

Фишка 4. Как настроить регламентное задание для контроля сертификатов?

Ручная проверка сроков не масштабируется. Настройте регламентное задание, которое ежедневно сканирует все активные сертификаты и рассылает уведомления ответственным за 30, 14 и 7 дней до истечения.

// Регламентное задание: контроль истекающих сертификатов ЭДО
Процедура КонтрольСертификатовЭДО() Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст =
		"ВЫБРАТЬ
		|	Сертификаты.Ссылка КАК Сертификат,
		|	Сертификаты.Владелец КАК Владелец,
		|	Сертификаты.ДействителенДо КАК ДействителенДо
		|ИЗ
		|	Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК Сертификаты
		|ГДЕ
		|	НЕ Сертификаты.ПометкаУдаления
		|	И Сертификаты.ДействителенДо >= &Начало
		|	И Сертификаты.ДействителенДо <= &Конец";
	
	Запрос.УстановитьПараметр("Начало", ТекущаяДатаСеанса());
	Запрос.УстановитьПараметр("Конец", ТекущаяДатаСеанса() + 30 * 86400);
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Пока Выборка.Следующий() Цикл
		
		ДнейОсталось = Цел((НачалоДня(Выборка.ДействителенДо)
			- НачалоДня(ТекущаяДатаСеанса())) / 86400);
		
		// Уведомляем только на контрольных точках
		Если ДнейОсталось = 30 ИЛИ ДнейОсталось = 14 ИЛИ ДнейОсталось = 7 Тогда
			ОтправитьУведомлениеОСертификате(Выборка.Владелец,
				Выборка.Сертификат, ДнейОсталось);
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

Задание регистрируется в разделе Администрирование → Обслуживание → Регламентные и фоновые задания с расписанием «ежедневно в 08:00». Это снимает человеческий фактор и предотвращает ситуацию «утром узнали, что подписывать нечем».

Фишка 5. Как защитить файлы электронных документов от подмены?

Электронные документы (XML, PDF) и файлы подписей (SIG, P7S) хранятся либо в информационной базе, либо в томах на диске. Второй вариант удобнее для больших объёмов, но требует контроля целостности. Фишка — хранить хеш-сумму каждого файла в момент помещения в хранилище и периодически сверять её.

// Расчёт и сохранение хеша файла электронного документа
Функция ВычислитьХешФайла(ДвоичныеДанныеФайла)
	
	ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.SHA256);
	ХешированиеДанных.Добавить(ДвоичныеДанныеФайла);
	
	// Возвращаем hex-представление хеша
	Возврат СтрЗаменить(Строка(ХешированиеДанных.ХешСумма), " ", "");
	
КонецФункции

// Проверка целостности ранее сохранённого файла
Функция ФайлНеИзменён(ДвоичныеДанныеФайла, СохранённыйХеш)
	
	ТекущийХеш = ВычислитьХешФайла(ДвоичныеДанныеФайла);
	Возврат ВРег(ТекущийХеш) = ВРег(СохранённыйХеш);
	
КонецФункции

Если при плановой сверке хеш не совпадает — файл был изменён в обход 1С. Это повод для немедленного расследования. О том, что меняется в самих требованиях к электронным документам, полезно почитать обзор изменений в 1С ЭДО с июля 2026 года.

Фишка 6. Как ограничить операции ЭДО по ролям и статусам?

Не каждый, кто создаёт документ, должен иметь право его отправить или аннулировать. Разделите полномочия: оператор готовит и проверяет, руководитель подписывает и отправляет. В 1С это реализуется через отдельные роли и проверку в момент выполнения команды.

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

Такая многоуровневая проверка исключает отправку черновиков, документов чужих организаций и обход разграничения полномочий. Роль ОтправкаЭлектронныхДокументов назначается только ограниченному кругу лиц.

Фишка 7. Как выявлять нетипичные действия и уведомлять безопасников?

Массовое аннулирование документов, отправка вне рабочего времени, всплеск операций от одного пользователя — маркеры возможного инцидента. На основе журнала действий из фишки 2 можно строить простую эвристику.

// Проверка аномальной активности пользователя за последний час
Функция ЕстьАномальнаяАктивность(Пользователь)
	
	Запрос = Новый Запрос;
	Запрос.Текст =
		"ВЫБРАТЬ
		|	КОЛИЧЕСТВО(*) КАК ЧислоДействий
		|ИЗ
		|	РегистрСведений.ЖурналДействийЭДО КАК Журнал
		|ГДЕ
		|	Журнал.Пользователь = &Пользователь
		|	И Журнал.ДатаВремя >= &Граница
		|	И Журнал.ТипДействия = &Аннулирование";
	
	Запрос.УстановитьПараметр("Пользователь", Пользователь);
	Запрос.УстановитьПараметр("Граница", ТекущаяДатаСеанса() - 3600);
	Запрос.УстановитьПараметр("Аннулирование", "Аннулирование");
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Если Выборка.Следующий() Тогда
		// Порог: более 10 аннулирований за час — подозрительно
		Если Выборка.ЧислоДействий > 10 Тогда
			ОтправитьУведомлениеБезопасникам(Пользователь, Выборка.ЧислоДействий);
			Возврат Истина;
		КонецЕсли;
	КонецЕсли;
	
	Возврат Ложь;
	
КонецФункции

Уведомление можно отправлять по внутренней почте 1С или интегрировать с корпоративным мессенджером. Аналогичный подход к ускорению и контролю процессов описан в подборке скрытых фишек 1С:Документооборот.

Фишка 8. Как хранить и защищать историю подписей?

При юридическом споре важно доказать, кто и когда подписал документ. Штатный механизм ЭДО хранит подписи, но дополнительная фиксация отпечатка сертификата (thumbprint) и времени подписания в отдельном регистре повышает надёжность доказательной базы.

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

Такой журнал никогда не должен редактироваться вручную — доступ на изменение регистра запрещается всем ролям, кроме программной записи. Это делает его надёжным источником истины.

Найдите специалиста для решения этой задачи на koderion.ru

Читайте также