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