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