Часто разработчики и администраторы 1С сталкиваются с ошибкой «Ошибка при вызове метода контекста (ПолучитьОбъект): Элемент не выбран!» при попытке программно найти документ и обратиться к его свойствам. Разберем эту проблему по шагам, проанализируем ситуацию и выясним причину, а также рассмотрим, как правильно формировать и сохранять печатные формы (в том числе с факсимиле) в формат PDF.
Рассмотрим подробнее код, который чаще всего приводит к такой проблеме:
Об = Документы.СчетНаОплатуПокупателю.НайтиПоНомеру("СП000008664");
ПР = Об.ПолучитьОбъект(); // Здесь возникает исключение
Ошибка возникает из-за того, что метод НайтиПоНомеру не нашел нужный документ в базе данных и вернул пустую ссылку. Применение метода ПолучитьОбъект() к пустой ссылке всегда завершается критической ошибкой системы. Выясним причину, почему документ мог быть не найден:
Чтобы избежать падения кода, всегда проверяйте полученную ссылку на заполненность с помощью метода Пустая(). Также, если документ имеет периодическую нумерацию, обязательно передавайте дату для поиска:
// Передаем дату, принадлежащую нужному периоду
Об = Документы.СчетНаОплатуПокупателю.НайтиПоНомеру("СП000008664", ТекущаяДата());
Если Не Об.Пустая() Тогда
ПР = Об.ПолучитьОбъект();
Сообщить(ПР);
Иначе
Сообщить("Документ не найден! Проверьте номер или дату.");
КонецЕсли;
Посмотрим на пример использования запроса. Запрос работает надежнее, так как позволяет использовать оператор ПОДОБНО (если вы не уверены в префиксах) и легко сортировать результаты, если нашлось несколько дублей:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| СчетНаОплатуПокупателю.Ссылка КАК Ссылка
|ИЗ
| Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
|ГДЕ
| СчетНаОплатуПокупателю.Номер ПОДОБНО &Номер
|УПОРЯДОЧИТЬ ПО
| СчетНаОплатуПокупателю.Дата УБЫВ";
Запрос.УстановитьПараметр("Номер", "%СП000008664%");
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Если РезультатЗапроса.Следующий() Тогда
Док = РезультатЗапроса.Ссылка.ПолучитьОбъект();
// Дальнейшие действия
Иначе
Док = Неопределено;
Сообщить("Документ с таким номером отсутствует.");
КонецЕсли;
Начиная с современных версий платформы 1С:Предприятие (8.2 и выше), система умеет сохранять табличные документы в формат PDF встроенными средствами. Использовать сторонние PDF-принтеры больше не требуется. Для этого нужно получить сформированный ТабличныйДокумент и вызвать у него метод Записать.
Рассмотрим пример формирования макета и его выгрузки в файл:
Если РезультатЗапроса.Следующий() Тогда
СсылкаНаДокумент = РезультатЗапроса.Ссылка;
// Получаем сформированный табличный документ из экспортной процедуры менеджера или общего модуля
ТабДокумент = ОбщийМодульПечати.ПечатьСчета(СсылкаНаДокумент, "СчетСС");
// Сохраняем в PDF
ПутьКФайлу = "C:\РабочийСтол\Счет_" + СсылкаНаДокумент.Номер + ".pdf";
ТабДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
Сообщить("Файл успешно сохранен: " + ПутьКФайлу);
КонецЕсли;
Часто возникает необходимость программно напечатать и сохранить счет с уже наложенной печатью и подписью (факсимиле). Проанализируем ситуацию: попытки обратиться к элементам формы напрямую (например, через Док.ПолучитьФорму("ФормаДокумента").ЭлементыФормы.фПечатьФаксимиле = Истина) — это устаревший и некорректный подход. Он не будет работать в фоновых заданиях или на сервере, так как серверу недоступен визуальный интерфейс.
В современных типовых конфигурациях (на базе БСП, таких как «Бухгалтерия предприятия» или «Управление торговлей») механизм работает иначе:
Посмотрим на пример правильной передачи параметра факсимиле при формировании печатной формы:
// Создаем структуру с параметрами печати
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("ПечатьФаксимиле", Истина); // Флажок вывода печати и подписи
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаДокумент);
// Вызываем общую процедуру печати (зависит от конкретной конфигурации)
// Система автоматически найдет картинки организации и наложит их на макет
ТабДокумент = Документы.СчетНаОплатуПокупателю.СформироватьПечатнуюФорму(МассивОбъектов, ПараметрыПечати);
Если ТабДокумент <> Неопределено Тогда
ТабДокумент.Записать("C:\РабочийСтол\Счет_с_Факсимиле.pdf", ТипФайлаТабличногоДокумента.PDF);
КонецЕсли;
Используя эти методы, вы обезопасите код от непредвиденных падений при поиске элементов и сможете автоматизировать рутинные задачи по сохранению документов и счетов в PDF для последующей отправки клиентам.