Как исправить ошибку «ЗаписьПодписанаЭВПВрача: Превышение числа подписей врача» при работе с ЭЛН в 1С:Медицина?

Программист 1С v8.3 (Управляемые формы) Сфера услуг, туризм и социальный сектор
← На главную

При оформлении и отправке электронных листков нетрудоспособности (ЭЛН) в медицинских организациях пользователи программных продуктов «1С:Медицина. Поликлиника» или «1С:Медицина. Больница» могут столкнуться с неприятной ошибкой контроля формата СФР (ранее — ФСС): «ЗаписьПодписанаЭВПВрача: Превышение числа подписей врача». Эта ошибка блокирует дальнейшую работу с документом, не позволяя ни отправить его на шлюз фонда, ни корректно отредактировать в интерфейсе программы.

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

Почему возникает ошибка превышения числа подписей?

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

Но почему дубликаты появляются в самой базе 1С? Рассмотрим основные технические причины:

  1. Интерфейсный «двойной клик». Из-за задержки отклика интерфейса при обращении к криптопровайдеру (например, КриптоПро CSP) или токену (Рутокен, JaCarta) врач может нажать кнопку «Подписать» дважды. Если в этот момент кнопка подписания программно не заблокировалась, система успевает инициировать процедуру записи подписи два раза с минимальным интервалом времени (обычно разница составляет 2–5 секунд).
  2. Сбои в работе сети или криптосервера. При нестабильном соединении с локальной или серверной службой криптографии транзакция создания подписи может зависнуть. Программа повторно отправляет запрос на генерацию подписи, в результате чего в базу записываются обе успешно созданные подписи.

Проанализируем структуру хранения данных в конфигурациях линейки «1С:Медицина». Документ ЛистокНетрудоспособности не делает привычных движений по регистрам сведений для хранения бинарных данных подписей. Вся информация о сформированных электронных подписях записывается непосредственно внутрь самого документа — в его специализированную табличную часть. В зависимости от версии конфигурации эта табличная часть может называться Подписи, ЭлектронныеПодписи или ТаблицаПодписей. Так как данные находятся внутри документа, стандартный просмотр через регистры ничего не даст, а сама форма документа при открытии может намертво зависать или выдавать ошибку контроля уникальности.


Способ 1. Исправление ошибки с помощью групповой обработки реквизитов

Это самый быстрый и надежный способ исправить ошибку, если у вас есть права администратора системы или доступ к режиму разработчика. Мы воспользуемся стандартной обработкой «Групповое изменение реквизитов», которая присутствует во всех современных конфигурациях на базе БСП (Библиотеки стандартных подсистем).

Разберем этот процесс по шагам:

  1. Перейдем в раздел Администрирование, далее выберем пункт Обслуживание, найдем подраздел Корректировка данных и откроем обработку Групповое изменение реквизитов.
  2. В поле «Выбирать элементы» укажем наш объект метаданных: документ Листок нетрудоспособности.
  3. Важно! Обязательно настроим отбор. Нажмем на ссылку «Все элементы» и добавим условие отбора: например, Ссылка Равно [Искомый_Больничный_Лист] или отбор по конкретному номеру ЭЛН. Если этого не сделать, алгоритм очистит подписи во всей базе данных, что приведет к катастрофическим последствиям.
  4. В правом верхнем углу формы обработки нажмем кнопку Дополнительные параметры (или кнопку настройки) и установим флажок Показывать служебные реквизиты и Разрешить выполнение произвольного алгоритма.
  5. В форме появится вкладка или поле ввода для написания программного кода на встроенном языке 1С.

Напишем безопасный алгоритм, который проанализирует табличную часть подписей в выбранном документе, определит наличие дубликатов, аккуратно удалит все лишние подписи начиная с конца коллекции, оставив только самую первую (оригинальную), и запишет объект в базу данных.

Посмотрим на пример кода, который необходимо вставить в поле выполнения произвольного алгоритма:


// В обработке объект передается под именем Объект
// Имя табличной части подписей в актуальных версиях обычно "Подписи"
Если Объект.Подписи.Количество() > 1 Тогда
    
    // Получаем индекс последнего элемента коллекции подписей
    Индекс = Объект.Подписи.Количество() - 1;
    
    // Запускаем цикл удаления. Индекс 0 (первую подпись) мы не трогаем,
    // удаляя поочередно элементы с индексами от максимального до 1 включительно.
    Пока Индекс > 0 Цикл
        Объект.Подписи.Удалить(Индекс);
        Индекс = Индекс - 1;
    КонецЦикла;
    
    // Записываем документ без проведения, чтобы не вызывать лишних проверок проведения
    Объект.Записать(РежимЗаписиДокумента.Запись);
    
КонецЕсли;

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


Способ 2. Использование внешней обработки (если форма документа блокируется)

В некоторых случаях конфигурация содержит жесткие проверки уникальности подписей непосредственно в модуле формы документа (в обработчиках событий ПриОткрытии или ПередОткрытием). Из-за этого даже при попытке сопоставить или просто интерактивно выбрать документ в групповой обработке система может вызывать исключение и закрывать форму. В такой ситуации мы можем написать простейшую внешнюю обработку (файл с расширением .epf), которая найдет и исправит документ напрямую через менеджер запросов базы данных в обход интерфейсных механизмов.

Рассмотрим код модуля такой внешней обработки. Для реализации нам понадобятся реквизит формы с типом ДокументСсылка.ЛистокНетрудоспособности (назовем его ДокументСсылка) и кнопка, вызывающая серверную процедуру:


&НаСервере
Процедура ИсправитьОшибкуПодписейНаСервере()
    
    // Проверяем, заполнена ли ссылка на документ
    Если Не ЗначениеЗаполнено(ДокументСсылка) Тогда
        ВызватьИсключение "Не выбран документ для исправления!";
    КонецЕсли;
    
    // Получаем объект документа для изменения данных
    ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
    
    // Проверим, действительно ли в документе есть дублирующиеся подписи
    КоличествоПодписей = ДокументОбъект.Подписи.Количество();
    
    Если КоличествоПодписей > 1 Тогда
        
        // Будем удалять элементы с конца коллекции, чтобы не сбить индексы строк
        ТекущийИндекс = КоличествоПодписей - 1;
        
        Пока ТекущийИндекс > 0 Цикл
            // Извлекаем строку табличной части для анализа (опционально)
            СтрокаПодписи = ДокументОбъект.Подписи[ТекущийИндекс];
            
            // Запишем в журнал регистрации информацию об удаляемой дублирующей подписи
            ЗаписьЖурналаРегистрации(
                "ИсправлениеЭЛН",
                УровеньЖурналаРегистрации.Информация,
                ,
                ДокументОбъект.Ссылка,
                "Удалена дублирующая подпись врача: " + СтрокаПодписи.Врач + " за период " + СтрокаПодписи.Период
            );
            
            // Удаляем лишнюю строку подписи
            ДокументОбъект.Подписи.Remove(ТекущийИндекс);
            
            ТекущийИндекс = ТекущийИндекс - 1;
        КонецЦикла;
        
        // Отключаем на время записи проверки бизнес-логики обмена с СФР
        ДокументОбъект.ОбменДанными.Загрузка = Истина;
        
        Попытка
            ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
            Сообщить("Документ успешно исправлен. Лишние подписи удалены!");
        Исключение
            Сообщить("Не удалось записать изменения: " + ОписаниеОшибки(), СтатусСообщения.Важное);
        КонецПопытки;
        
    Иначе
        Сообщить("В документе содержится 1 или 0 подписей. Исправление не требуется.");
    КонецЕсли;
    
КонецПроцедуры

Обратите внимание на использование свойства ОбменДанными.Загрузка = Истина. Это крайне важный параметр: он сообщает платформе 1С, что запись объекта производится в режиме загрузки данных, что позволяет обойти принудительные проверки заполнения полей формы и модулей объекта, которые могут намертво заблокировать запись некорректного (с точки зрения конфигурации) документа.


Что делать, если ошибочный документ уже отправлен в СФР?

Если система по какой-то причине пропустила двойную подпись и документ был успешно выгружен на портал шлюза СФР, исправить его локально в базе 1С уже недостаточно. Изменить данные отправленного и зарегистрированного в реестре фонда больничного листа напрямую невозможно — сервер СФР вернет ошибку логического контроля при попытке последующей работы с ним.

В этом случае необходимо придерживаться следующего регламента:

  1. Перейдите в личный кабинет медицинской организации на портале СФР или воспользуйтесь подсистемой обмена 1С для изменения статуса документа.
  2. Переведите исходный проблемный ЭЛН в статус «Действия прекращены» (аннулируйте его), указав в качестве причины техническую ошибку формирования.
  3. На основании аннулированного документа создайте новый документ со статусом «Дубликат».
  4. Заполните все реквизиты дубликата заново, внимательно подпишите его электронной подписью врача (и, при необходимости, председателя врачебной комиссии) и отправьте на шлюз СФР. На этот раз строго следите за тем, чтобы кнопка отправки/подписания нажималась однократно.

Профилактика и предотвращение проблемы в будущем

Чтобы исключить повторение ситуации, когда врачи регулярно сталкиваются с блокировкой документов из-за превышения числа подписей, рекомендуется выполнить комплекс профилактических мер:

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

← На главную