Как запретить или отследить изменение документов в 1С после отправки в ЭДО?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация Бухгалтерский учет IT и автоматизация бизнеса
← На главную

Внедрение электронного документооборота (ЭДО) в конфигурациях, таких как 1С:Комплексная Автоматизация 2.5 (КА) или 1С:ERP, часто ставит перед пользователями и администраторами вопрос: как гарантировать, что документ в базе данных останется неизменным после того, как он был подписан электронной подписью и отправлен контрагенту? Ведь в отличие от бумажного документа, который «ушел и забыт», электронный документ связан с объектом в базе, и случайное редактирование суммы или номенклатуры может привести к расхождениям.

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

Штатный функционал: философия 1С и «мягкий» контроль

Сразу отметим важный момент: в типовых конфигурациях 1С (будь то КА, ERP или УТ) «из коробки» нет жесткой блокировки объекта только по факту отправки через ЭДО. Логика разработчиков платформы строится на том, что электронный документ (XML-файл) и учетный документ в базе — это сущности связанные, но разные.

Если документ подписан электронной подписью (ЭП), изменить сам отправленный файл уже нельзя (это нарушит криптографическую подпись). Однако учетный документ в 1С изменить можно. Рассмотрим, какие штатные инструменты помогают контролировать этот процесс без программирования.

  1. Визуализация статусов и расхождений.

    Библиотека электронных документов (БЭД), встроенная в типовые конфигурации, отслеживает состояние документа. Если после отправки вы измените данные в реализации (например, цену), система изменит статус ЭДО на «Требуется перезаполнение» или подсветит расхождение. Отслеживание состояния документов ЭДО в типовых базах позволяет вовремя заметить проблему. Это сигнал пользователю, но не запрет.

  2. Дата запрета изменения данных.

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

  3. Версионирование объектов.

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

Вариант 1: Пост-контроль через версионирование (для аналитиков)

Если мы не хотим жестко блокировать работу пользователей, но хотим знать "героев", изменивших документ после отправки, разберем алгоритм настройки контроля через версионирование. Альтернативное управление доступом к формам также помогает ограничить нежелательные действия.

Суть метода заключается в сравнении времени отправки документа по ЭДО и времени появления новых версий объекта.

Для реализации нам потребуется сопоставить данные двух регистров:

Мы можем создать отчет (или использовать универсальный отчет), который работает по следующей логике:

  1. Выбираем документы, у которых есть статус ЭДО "Отправлен".
  2. Получаем дату и время этого события.
  3. Ищем в регистре версий записи по этому документу, сделанные позже времени отправки.
  4. Если такие записи есть — выводим документ в список "Подозрительные".

Это позволит руководителю отдела или главбуху раз в неделю просматривать список и задавать вопросы ответственным.

Вариант 2: Программная блокировка (для программистов)

Если требуется жесткое решение "нельзя и точка", необходимо прибегнуть к программированию. Наиболее правильный путь в современной архитектуре 1С — использование Расширения конфигурации и механизма Подписок на события. Это позволит не снимать конфигурацию с поддержки.

Разберем по шагам, как это реализовать.

Шаг 1. Определение момента проверки

Нам необходимо перехватить попытку записи документа пользователем. Для этого идеально подходит событие ПередЗаписью.

Шаг 2. Получение статуса ЭДО

В коде подписки нам нужно узнать, в каком состоянии находится документ. Данные хранятся в регистрах сведений. Для актуальных версий БЭД (Библиотека Электронных Документов) основным регистром является СостоянияПоОбъектамУчетаЭДО.

Рассмотрим примерный алгоритм кода, который должен быть помещен в обработчик подписки:


Процедура ПередЗаписьюДокументаЭДО(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
    
    // 1. Пропускаем, если идет обмен данными или загрузка
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

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

    Если ЗапрещенныеСтатусы.Найти(ТекСтатус) <> Неопределено Тогда
        
        // 4. Блокируем запись
        Отказ = Истина;
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Редактирование запрещено! Документ уже отправлен по ЭДО.";
        Сообщение.Сообщить();
        
    КонецЕсли;

КонецПроцедуры

Важное замечание: Функция ПолучитьСтатусЭДОДокумента в примере условная. В реальной конфигурации вам нужно обратиться к общему модулю подсистемы ЭДО. Обычно это модули вроде ЭлектронныйДокументооборот или СостоянияЭД. Рекомендуется использовать экспортные функции БЭД, чтобы решение работало после обновлений.

Особенности работы со СБИС (Saby)

Автор темы упоминает использование оператора СБИС. Здесь есть нюанс: интеграция СБИС часто выполняется через внешнюю обработку, которая работает "сбоку" от типовой БЭД 1С. Однако, современные обработки СБИС умеют писать статусы в типовые регистры 1С.

Если вы используете внешнюю обработку СБИС, учтите следующее:

  1. Убедитесь, что в настройках обработки СБИС включена синхронизация статусов с 1С. Без этого ваш код в подписке на событие не узнает, что документ отправлен.
  2. Если синхронизация не используется, вам придется в коде ПередЗаписью вызывать методы внешней компоненты или API СБИС, что может замедлить запись документов.

Вариант 3: Блокировка формы (User Experience)

Блокировка при записи (Вариант 2) эффективна, но раздражает пользователей: они могут полчаса менять документ, а при нажатии "Записать" получат ошибку. Более дружелюбный подход — блокировать форму при открытии.

Для этого создается расширение для формы документа (например, ФормаДокумента реализации):


&НаСервере
Процедура Расш_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    Если Объект.Ссылка.Пустая() Тогда
        Возврат;
    КонецЕсли;

    // Проверяем статус (аналогично примеру выше)
    Если ДокументОтправленПоЭДО(Объект.Ссылка) Тогда
        // Переводим элементы формы в режим "Только просмотр"
        ЭтаФорма.ТолькоПросмотр = Истина;
        // Можно вывести информационную надпись
        Элементы.ГруппаИнформацииЭДО.Заголовок = "ВНИМАНИЕ: Редактирование закрыто (ЭДО)";
    КонецЕсли;

КонецПроцедуры

Подводные камни: Корректировки и Аннулирование

Реализуя любой запрет, мы должны помнить о жизненном цикле документов. Что делать, если в отправленном документе все-таки обнаружилась ошибка?

В ЭДО существуют процессы:

Ваша система защиты должна учитывать эти сценарии. Если документ аннулирован, статус ЭДО меняется, и блокировка должна сниматься (или, наоборот, документ должен помечаться на удаление). Если выставляется корректировка, то меняется не исходный документ, а создается новый (Корректировка реализации), поэтому блокировка исходного документа даже полезна.

Выводы

Подводя итог, можно сказать, что решение задачи контроля зависит от строгости требований:

  1. Минимальный контроль: Используем типовую дату запрета редактирования и надеемся на внимательность пользователей (статусы БЭД).
  2. Аудит: Настраиваем отчет на базе версионирования для поиска нарушителей.
  3. Строгий контроль: Реализуем расширение с подпиской на событие ПередЗаписью, проверяющее регистры статусов ЭДО.

Для СБИС критически важно настроить корректную трансляцию статусов документов из обработки оператора в учетную систему 1С.

← На главную