При организации обмена данными между информационными базами 1С часто возникает задача контроля за составом выгружаемых объектов. Нередко пользователи или сторонние обработки вручную регистрируют документы прошлых периодов на узлах планов обмена, что при последующей загрузке в базу-приемник приводит к перепроведению закрытых периодов в обход установленных запретов. Разберем особенности работы механизма регистрации изменений и выясним, как правильно решить проблему несанкционированного изменения данных.
Проанализируем техническую сторону вопроса: когда пользователь регистрирует объект вручную с помощью обработки РегистрацияИзмененийДляОбменаДанными или в коде выполняется метод ПланыОбмена.ЗарегистрироватьИзменения(), платформа 1С выполняет прямую запись во внутреннюю служебную таблицу регистрации изменений СУБД. При этом:
ПередЗаписью или ПриЗаписи) не вызываются.ЗарегистрироватьИзменения и УдалитьРегистрациюИзменений платформенно не фиксируется.Таким образом, создать универсальную подписку на событие, которая логировала бы имя пользователя и момент ручной регистрации объекта на узле, невозможно на уровне платформы. Поэтому перейдем к устранению первопричины проблемы — защите закрытых периодов и контролю состава выгрузки.
Основная угроза ручной регистрации старых документов заключается в том, что стандартный процесс загрузки данных устанавливает признак ОбменДанными.Загрузка = Истина. При таком режиме стандартные проверки и проведение документов могут обходить интерактивные запреты. Разберем, как предотвратить изменение данных прошлых периодов на стороне приемника.
Создадим подписку на событие ПередЗаписью для необходимых документов и проверим дату документа относительно границы запрета изменений:
Процедура ЗащитаЗакрытогоПериодаПриЗагрузкеПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Проверяем, выполняется ли запись в режиме обмена данными
Если Не Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Проверяем границу запрета изменения данных
ГраницаЗапрета = ДатыЗапретаИзмененияСервер.ПолучитьДатуЗапрета(); // Или собственная функция проверки
Если ЗначениеЗаполнено(ГраницаЗапрета) И Источник.Дата <= ГраницаЗапрета Тогда
Отказ = Истина;
ТекстОшибки = СтрШаблон("Попытка изменения документа %1 из закрытого периода (%2) через обмен данными!",
Источник.Ссылка, Формат(ГраницаЗапрета, "ДФ=dd.MM.yyyy"));
ЗаписьЖурналаРегистрации("Обмен данными. Защита периода",
УровеньЖурналаРегистрации.Предупреждение,,, ТекстОшибки);
КонецЕсли;
КонецПроцедуры
Если в конфигурации используется Библиотека стандартных подсистем (БСП), рекомендуется настроить механизм «Даты запрета изменения» штатно. В разделе настройки дат запрета можно указать персональные границы не только для пользователей, но и непосредственно для узлов планов обмена. В этом случае подсистема самостоятельно заблокирует запись объектов закрытого периода.
Если необходимо пресекать отправку документов закрытого периода еще на стороне базы-источника, настроим регламентное задание, которое будет анализировать таблицу изменений перед запуском выгрузки.
Посмотрим на пример кода для проверки и отмены регистрации старых документов по конкретному узлу:
Процедура ПроверитьИОчиститьРегистрациюЗакрытогоПериода(УзелОбмена, ДатаЗапрета) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Изменения.Ссылка КАК Ссылка,
| Изменения.Ссылка.Дата КАК ДатаДокумента
|ИЗ
| Документ.РеализацияТоваровУслуг.Изменения КАК Изменения
|ГДЕ
| Изменения.Узел = &УзелОбмена
| И Изменения.Ссылка.Дата <= &ДатаЗапрета";
Запрос.УстановитьПараметр("УзелОбмена", УзелОбмена);
Запрос.УстановитьПараметр("ДатаЗапрета", ДатаЗапрета);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Снимаем объект с регистрации
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, Выборка.Ссылка);
// Логируем факт отмены регистрации
ТекстСообщения = СтрШаблон("Снята регистрация с документа %1 (дата: %2), так как он входит в закрытый период.",
Выборка.Ссылка, Выборка.ДатаДокумента);
ЗаписьЖурналаРегистрации("Обмен данными. Контроль регистрации",
УровеньЖурналаРегистрации.Информация,,, ТекстСообщения);
КонецЦикла;
КонецПроцедуры
Данный алгоритм позволяет гарантировать, что даже при ручной регистрации объектов обработкой выгрузка не передаст нежелательные данные в базу-приемник.
Чтобы исключить несанкционированное использование обработок регистрации и прямое вмешательство в состав обмена, применим комплекс административных настроек:
Интерактивное открытие внешних обработок. Запуск дополнительных инструментов должен производиться строго через справочник Дополнительные отчеты и обработки с разграничением прав доступа.Сочетание проверки дат запрета на стороне приемника и фильтрации изменений на стороне источника обеспечивает надежную защиту закрытых периодов от случайных или умышленных изменений.