Как в 1С:Документооборот настроить проверку наличия файлов и обязательных реквизитов перед запуском процесса?

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

В процессе автоматизации корпоративного документооборота часто возникает задача жесткого контроля заполнения карточки документа перед началом его согласования или отправки по иному маршруту. Типичные примеры: запретить отправку договора на согласование, если к карточке не прикреплен скан-образ оригинала, или заблокировать запуск процесса, если не заполнено поле Сумма. В рамках данной статьи мы подробно разберем, как решить эти задачи в конфигурации «1С:Документооборот» (как для редакции 2.1, так и для новой редакции 3.0), исправим популярные ошибки разработчиков и рассмотрим наиболее оптимальные методы работы с программным кодом БСП (Библиотеки Стандартных Подсистем).

Проверка наличия прикрепленных файлов в карточке документа

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

В процессе обсуждения на форуме был предложен следующий вариант программного кода для проверки файлов через вызов серверного метода общего модуля:


ПодчиненныеФайлы = РаботаСФайламиВызовСервера.ПолучитьВсеПодчиненныеФайлы(Предмет, Ложь);
Если ПодчиненныеФайлы.Количество() > 0 Тогда
    Результат = Истина;
Иначе
    Результат = Ложь;
КонецЕсли;

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

Для оптимизации этой операции на больших базах данных рекомендуется использовать легкий прямой запрос к таблице хранения файлов. Запрос не загружает сами объекты в память, а лишь проверяет физическое наличие записей в базе данных. Разберем более производительный вариант реализации условия маршрутизации:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |	Файлы.Ссылка КАК Ссылка
    |ИЗ
    |	Справочник.Файлы КАК Файлы
    |ГДЕ
    |	Файлы.ВладелецФайла = &ВладелецФайла
    |	И НЕ Файлы.ПометкаУдаления";

Запрос.УстановитьПараметр("ВладелецФайла", Предмет);
Результат = НЕ Запрос.Выполнить().Пустой();

Этот код работает значительно быстрее, так как СУБД прекращает поиск сразу после нахождения первой же записи (благодаря конструкции ВЫБРАТЬ ПЕРВЫЕ 1). Также мы обязательно накладываем фильтр на пометку удаления НЕ Файлы.ПометкаУдаления, чтобы система не учитывала файлы, которые пользователь уже удалил из карточки.

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

  1. Перейдем в настройки вида документа (например, «Договор аренды»).
  2. Откроем вкладку «Настройка обработки» и перейдем в раздел «Правила проверки».
  3. Добавим новое правило, где в качестве условия укажем обязательность заполнения файлов определенной роли (например, «Скан договора»).
  4. При попытке запустить обработку документа без прикрепленного файла система автоматически заблокирует старт и выведет пользователю понятное предупреждение.

Контроль заполнения реквизита «Сумма» и других обязательных полей

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

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

Рассмотрим, как правильно настроить обязательность заполнения полей в зависимости от состояния документа в 1С:Документооборот 2.1 с помощью механизма Настройки доступности по состоянию (НДПС):

  1. Откроем карточку нужного вида документа в режиме администрирования.
  2. Перейдем по гиперссылке «Настройки доступности по состоянию».
  3. Найдем состояние документа, в котором он находится перед отправкой на согласование (например, состояние «Проект»).
  4. В табличной части реквизитов найдем строку Сумма (или любой другой необходимый реквизит, например, Срок действия).
  5. В колонке для выбранного состояния установим значение «Обязательно для заполнения».

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

В 1С:Документооборот 3.0 этот механизм стал еще проще. Нам достаточно открыть вид документа, перейти на вкладку «Реквизиты», выделить нужный реквизит (системный или дополнительный) и установить для него признак обязательности. Там же можно гибко настроить условия, при которых реквизит становится обязательным (например, только для договоров с определенными контрагентами или при сумме свыше заданного лимита).

Ошибки при программной выгрузке двоичных данных файлов

Разберем детально техническую проблему, с которой столкнулся автор в сообщении 11. Пытаясь программно прочитать файлы для отправки во внешнее облачное хранилище, разработчик написал следующий код:


ПолныйПуть = СтрокаМ.ТекущаяВерсияПутьКФайлу;
ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПуть);
СтрокаBase64 = Base64Строка(ДвоичныеДанные);

Этот код приводит к ошибке, так как переменная пути к файлу оказывается пустой, а итоговый отправляемый файл имеет размер 0 байт. Выясним причину этой проблемы. В системе «1С:Документооборот» файлы практически никогда не хранятся по прямым статическим путям, доступным операционной системе клиента. Файлы могут быть записаны либо непосредственно в базу данных в виде двоичного представления СУБД, либо в специальные тома хранения файлов на сервере под зашифрованными уникальными именами (GUID).

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

Чтобы правильно и гарантированно получить двоичные данные прикрепленного файла независимо от того, где он физически хранится (в томах или в базе), мы должны использовать механизмы БСП. Посмотрим на правильный вариант реализации программного получения двоичных данных и их кодирования в Base64:


// Сначала получаем список подчиненных файлов
ПодчиненныеФайлы = РаботаСФайламиВызовСервера.ПолучитьВсеПодчиненныеФайлы(ДокументСсылка, Истина, Ложь);

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

Проанализируем преимущества этого подхода:

  1. Использование функции РаботаСФайлами.ДвоичныеДанныеФайла() абстрагирует разработчика от физического расположения файлов. Платформа сама определит, нужно ли читать данные из СУБД или считывать их из тома на сервере.
  2. Метод выполняется на стороне сервера, что исключает необходимость передачи тяжелых файлов по медленным клиент-серверным каналам связи перед их обработкой.
  3. Обязательное использование конструкции Попытка...Исключение защищает выполнение всего цикла выгрузки от прерывания, если один из файлов окажется заблокирован операционной системой или будет поврежден. Логирование ошибок производится в стандартный системный журнал регистрации с помощью метода ЗаписьЖурналаРегистрации.

Таким образом, мы рассмотрели комплексное решение задач проверки заполненности реквизитов и наличия файлов. Сочетание гибких настроек доступности по состоянию и оптимизированного программного кода БСП позволяет создавать надежные, быстродействующие алгоритмы контроля бизнес-процессов в «1С:Документооборот».

← На главную