Каждый специалист, работающий с системой 1С:Предприятие, хотя бы раз сталкивался с ситуацией, когда при попытке распечатать стандартный документ (например, товарную накладную ТОРГ-12, транспортную накладную ТТН или акт об оказании услуг) система внезапно прерывает работу. На экране появляется критическое сообщение вида: «Ошибка при вызове метода контекста (ПроверитьВывод)».
Особенно загадочно выглядит ситуация, когда аналогичные документы или другие печатные формы (например, Счет-фактура) выводятся без каких-либо нареканий, а сбой происходит только на одном конкретном рабочем месте, у определенного пользователя или вовсе на единственном документе реализации. Давайте подробно разберем природу этого поведения платформы 1С и изучим все возможные способы решения проблемы — от простых пользовательских манипуляций до системного администрирования и доработки кода программных модулей.
Прежде чем переходить к устранению неполадок, выясним причину такого поведения платформы. Метод ПроверитьВывод() принадлежит объекту ТабличныйДокумент. Он используется разработчиками конфигураций для того, чтобы определить, поместится ли очередная порция данных (например, строка табличной части ТОРГ-12 с итогами или подписями) на текущий лист бумаги при печати.
Для того чтобы выполнить этот расчет, платформа 1С обращается к операционной системе Windows и запрашивает параметры текущего принтера, установленного по умолчанию. 1С анализирует физические границы печати, размер полей, ориентацию страницы и текущий масштаб. Если в операционной системе нет ни одного принтера, или драйвер принтера не отвечает, или настройки масштабирования передают некорректные параметры, метод ПроверитьВывод() завершается аварийной ошибкой, полностью блокируя формирование печатной формы.
Рассмотрим подробнее основные причины возникновения этой ошибки и пошаговые инструкции по их устранению.
---
Это самая распространенная причина сбоя. Если на компьютере пользователя физически отсутствуют установленные принтеры (или все сетевые принтеры были удалены), метод ПроверитьВывод() гарантированно выдаст ошибку.
Выполним следующие действия для исправления ситуации:
---
Бывают ситуации, когда принтер по умолчанию установлен и исправно работает, но при расчете вывода страницы 1С сталкивается с логической ошибкой масштабирования. Чаще всего это происходит, если в параметрах страницы табличного документа установлено свойство масштаба «По ширине страницы».
Разберем по шагам, как устранить этот сбой напрямую из режима «1С:Предприятие»:
Этот простой цикл переключения принудительно перезаписывает сохраненные в системе геометрические параметры печати для текущей сессии пользователя, устраняя накопленную ошибку округления полей.
---
Часто пользователи жалуются, что ошибка воспроизводится только под конкретной учетной записью 1С, в то время как другие сотрудники на том же компьютере или сервере печатают ТОРГ-12 без проблем. Причина кроется в механизме работы платформы под названием «Ключ параметров печати» (в коде это свойство КлючПараметровПечати или ИмяПараметровПечати).
Платформа 1С сохраняет индивидуальные настройки печати (поля, ориентацию, выбранный принтер) для каждой печатной формы персонально для каждого пользователя. Эти настройки записываются в системный кэш профиля пользователя (в файлы настроек формата .cfg или базу данных). Если когда-то пользователь распечатал документ на сетевой принтер, который впоследствии был удален или переименован, 1С продолжит пытаться применить сохраненные старые параметры к несуществующему принтеру, вызывая сбой метода ПроверитьВывод().
Чтобы сбросить эти настройки, необходимо очистить кэш пользователя. Выполните следующие действия:
%APPDATA%\1C\1Cv8\ (для роумингового профиля) и %LOCALAPPDATA%\1C\1Cv8\ (для локального кэша).12345678-abcd-1234-...).---
Если ваша база 1С развернута на сервере терминалов, а пользователи подключаются по RDP, источником проблемы часто становится технология перенаправления принтеров Windows Easy Print. Этот драйвер эмулирует принтеры клиента на сервере, но периодически передает некорректные физические границы печати в сессию 1С, из-за чего функция ПроверитьВывод() аварийно прерывает выполнение кода.
Для системных администраторов решением в данном случае будет:
---
Если вы являетесь разработчиком или имеете доступ к изменению конфигурации 1С (база находится не на поддержке или печатная форма Торг-12 вынесена во внешнюю обработку), крайне рекомендуется сделать вызов метода ПроверитьВывод() безопасным.
Рассмотрим первый способ — использование стандартной конструкции Попытка — Исключение. Мы можем обернуть потенциально опасный участок кода в защищенный блок. Если у пользователя не окажется принтера или возникнет сбой настроек масштабирования, программа не аварийно завершит работу, а просто продолжит вывод данных на экран:
// Оригинальный фрагмент кода:
// Если Ном <> 1 И НЕ ТабДокумент.ПроверитьВывод(МассивВыводимыхОбластей) Тогда
// Безопасный вариант с перехватом исключения:
ПроверкаВыводаПройдена = Истина;
Попытка
Если Ном <> 1 Тогда
ПроверкаВыводаПройдена = ТабДокумент.ПроверитьВывод(МассивВыводимыхОбластей);
КонецЕсли;
Исключение
// В случае ошибки записываем предупреждение в Журнал регистрации и разрешаем вывод
ЗаписьЖурналаРегистрации("Печать.Предупреждение",
УровеньЖурналаРегистрации.Предупреждение, , ,
"Не удалось проверить вывод области табличного документа: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
ПроверкаВыводаПройдена = Истина;
КонецПопытки;
Если НЕ ПроверкаВыводаПройдена Тогда
// Выполняем алгоритм переноса данных на новую страницу (выводим разделитель страниц)
ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
// ... дальнейшая логика заполнения шапки новой страницы
КонецЕсли;
Рассмотрим второй способ. Если вы используете современные конфигурации на управляемых формах, в состав которых входит Библиотека стандартных подсистем (БСП), рекомендуется вызывать аналогичные проверки через стандартные безопасные методы общего назначения. Обратите внимание на функцию:
ОбщегоНазначения.ПроверитьВыводТабличногоДокумента(ТабДокумент, ВыводимыеОбласти)
Данный метод БСП уже "под капотом" содержит обработку всех возможных исключительных ситуаций с доступностью принтера и гарантирует стабильную работу программы без аварийных завершений сеанса пользователя.
Рассмотрим третий способ. Если перед вызовом печати требуется гарантированно убедиться в наличии установленных принтеров в операционной системе Windows, мы можем использовать обращение к службе WMI через COM-соединение. Создадим вспомогательную функцию для проверки доступности принтеров:
Функция ПроверитьНаличиеПринтеровВСистеме() Экспорт
РезультатПроверки = Ложь;
Попытка
Принтеры = Новый COMОбъект("WScript.Network");
СписокПринтеров = Принтеры.EnumPrinterConnections();
// Метод EnumPrinterConnections возвращает коллекцию, где элементы чередуются:
// четные индексы - порт, нечетные - сетевое имя принтера.
Если СписокПринтеров.Count() > 0 Тогда
РезультатПроверки = Истина;
КонецЕсли;
Исключение
// Если COM-объект недоступен (например, под Linux-клиентом),
// по умолчанию считаем, что принтеры могут быть доступны через CUPS
РезультатПроверки = Истина;
КонецПопытки;
Возврат РезультатПроверки;
КонецФункции
Эту функцию мы можем вызывать в модуле формирования печатной формы непосредственно перед заполнением табличного документа. Если принтеры в системе отсутствуют, мы можем своевременно вывести понятное предупреждение для пользователя:
Если Не ПроверитьНаличиеПринтеровВСистеме() Тогда
ПоказатьПредупреждение(, "В операционной системе не обнаружено ни одного установленного принтера!
|Для корректного формирования печатной формы ТОРГ-12 установите принтер по умолчанию.");
Возврат;
КонецЕсли;
---
Еще одна неочевидная причина падения метода ПроверитьВывод() — некорректный состав передаваемого массива областей. В качестве параметра методу должен передаваться массив, содержащий только валидные заполненные области табличного документа типа ОбластьЯчеекТабличногоДокумента.
Проанализируем ситуацию, когда из-за программной ошибки или некорректной доработки макета одна из областей возвращает пустое значение:
МассивВыводимыхОбластей = Новый Массив;
ОбластьСтроки = Макет.ПолучитьОбласть("СтрокаТаблицы");
ОбластьПодвала = Макет.ПолучитьОбласть("НесуществующаяОбластьВМакете"); // Вернет Неопределено
МассивВыводимыхОбластей.Добавить(ОбластьСтроки);
МассивВыводимыхОбластей.Добавить(ОбластьПодвала); // Добавили Неопределено
// Вызов этого метода приведет к падению платформы с ошибкой контекста:
ТабДокумент.ПроверитьВывод(МассивВыводимыхОбластей);
Для предотвращения подобных ошибок всегда проверяйте возвращаемые области макета на равенство значению Неопределено перед добавлением их в массив для проверки вывода.