Как убрать проверку на отсутствие присоединенных файлов при печати в 1С

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

В процессе работы с печатными формами в системе 1С, особенно в специализированных отраслевых решениях (например, для фармацевтической промышленности с префиксами СТ_ХФ), разработчики часто сталкиваются с жесткими алгоритмами контроля. Одним из таких механизмов является обязательная проверка наличия присоединенных файлов (сертификатов, паспортов качества) перед выводом формы на печать. Если файл отсутствует, система прерывает процесс и выводит уведомление пользователю.

Рассмотрим ситуацию, когда бизнес-процесс требует возможности печати без обязательного наличия файла, а простое комментирование кода нежелательно из-за требований к чистоте разработки или архитектурных особенностей ГНК (Групп Номенклатуры Каталога). Проанализируем, как можно грамотно «погасить» это сообщение, сохранив при этом работоспособность функции.

Анализ исходного кода функции

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


Функция ПрисоединенныйФайл(ВидПрисоединенногоФайла, ВладелецФайла = Неопределено)
    Результат = Неопределено;
    Если ВладелецФайла = Неопределено Тогда
        ТекСтрока = ТаблицаПрисоединенныхФайлов.Найти(Справочники.СТ_ХФ_ВидыПрисоединенныхФайлов[ВидПрисоединенногоФайла], "ВидПрисоединенногоФайла");
        Если Не ТекСтрока = Неопределено Тогда
            Результат = ТекСтрока.Ссылка;
        КонецЕсли;
    Иначе
        ТекСтроки = ТаблицаПрисоединенныхФайлов.НайтиСтроки(Новый Структура("ВидПрисоединенногоФайла,ВладелецФайла", Справочники.СТ_ХФ_ВидыПрисоединенныхФайлов[ВидПрисоединенногоФайла], ВладелецФайла));
        Если ТекСтроки.Количество() > 0 Тогда
            Результат = ТекСтроки[0].Ссылка;
        КонецЕсли;
    КонецЕсли;

    Если НЕ ЗначениеЗаполнено(Результат) Тогда
        Массив_ОшибкиЗаполнения.Добавить("Отсутствует присоединенный файл вида " + ?(ВладелецФайла = Неопределено, "", ". Владелец - " + ВладелецФайла));
    КонецЕсли;

    Возврат Результат;
КонецФункции

Основная проблема заключается в блоке Если НЕ ЗначениеЗаполнено(Результат) Тогда. Если поиск не дал результатов, переменная Результат остается пустой, и система безусловно добавляет сообщение в массив ошибок, который затем выводится пользователю.

Вариант 1. Использование дополнительного фильтра по виду файла

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


// В блоке проверки заполненности результата
Если НЕ ЗначениеЗаполнено(Результат) Тогда
    // Проверяем, нужно ли вообще выводить ошибку для данного вида
    Если Справочники.СТ_ХФ_ВидыПрисоединенныхФайлов[ВидПрисоединенногоФайла] <> "" Тогда
         Массив_ОшибкиЗаполнения.Добавить("Отсутствует присоединенный файл вида " + ?(ВладелецФайла = Неопределено, "", ". Владелец - " + ВладелецФайла));
    КонецЕсли;
КонецЕсли;

Этот подход позволяет избежать вывода сообщения, если система обращается к справочнику видов файлов, который по каким-то причинам не определен или помечен как необязательный.

Вариант 2. Исправление логической типизации (Best Practice)

Проанализируем технический нюанс, упомянутый в обсуждении: использование конструкции Если ТекСтроки.Количество Тогда. В платформе 1С:Предприятие 8.3 числовое значение 0 приводится к значению Ложь, а любое положительное число — к Истина. Однако для повышения читаемости кода и исключения ошибок при работе в разных режимах исполнения (сервер/клиент), рекомендуется использовать явное сравнение:


// Вместо: Если ТекСтроки.Количество Тогда
Если ТекСтроки.Количество() > 0 Тогда
    Результат = ТекСтроки[0].Ссылка;
КонецЕсли;

Хотя само по себе это изменение не «гасит» сообщение, оно делает инициализацию переменной Результат более прозрачной для отладчика.

Вариант 3. Архитектурное решение через настройки НСИ

Если мы работаем с «Паспортом по ГНК» (Группы Номенклатуры Каталога), правильнее будет не менять код функции, а добавить механизм управления проверками в саму систему. Выясним причину, почему пользователь хочет убрать сообщение: возможно, для данной группы товаров наличие файла действительно не обязательно.

Рекомендуемый алгоритм действий:

  1. Добавим в справочник ВидыПрисоединенныхФайлов или в регистр сведений, отвечающий за настройки ГНК, новый реквизит типа Булево — ОбязателенПриПечати.
  2. В функции ПрисоединенныйФайл добавим получение этого реквизита.
  3. Выполним проверку: если флаг обязательности не установлен, мы просто не добавляем запись в Массив_ОшибкиЗаполнения.

Посмотрим, как изменится код при таком подходе:


// Предположим, мы получили признак обязательности
ОбязательностьФайла = Справочники.СТ_ХФ_ВидыПрисоединенныхФайлов[ВидПрисоединенногоФайла].ОбязателенПриПечати;

Если НЕ ЗначениеЗаполнено(Результат) И ОбязательностьФайла Тогда
    Массив_ОшибкиЗаполнения.Добавить("Внимание: для печати формы необходим файл!");
КонецЕсли;

Как найти причину, если сообщение все равно выводится

Если вы внесли изменения в функцию, но сообщение все равно появляется, проанализируем ситуацию глубже. В сложных конфигурациях проверка может дублироваться. Для поиска «виновника» выполним следующие шаги:

  1. Запустим конфигуратор и перейдем в режим отладки.
  2. Используем инструмент «Замер производительности». Запустите замер непосредственно перед нажатием кнопки печати и остановите сразу после появления окна с ошибкой.
  3. В результатах замера найдем строки, содержащие текст Массив_ОшибкиЗаполнения.Добавить.
  4. Выясним, в каких еще общих модулях или модулях менеджера объекта вызывается подобная логика. Часто проверка может быть вынесена в подписки на события или специализированные процедуры контроля качества (валидации).

Важный момент: использование конструкции Если Справочники...[...] = "" (как в Сообщении 19) является не самым надежным способом, так как обращение по индексу к менеджеру справочника возвращает пустую ссылку, а не пустую строку. Правильнее использовать метод Пустая() или проверять ЗначениеЗаполнено() для самого вида файла.

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

← На главную