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