Почему возникает ошибка "Элемент не выбран!" при поиске документа по номеру в 1С и как сохранить счет в PDF

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

Часто разработчики и администраторы 1С сталкиваются с ошибкой «Ошибка при вызове метода контекста (ПолучитьОбъект): Элемент не выбран!» при попытке программно найти документ и обратиться к его свойствам. Разберем эту проблему по шагам, проанализируем ситуацию и выясним причину, а также рассмотрим, как правильно формировать и сохранять печатные формы (в том числе с факсимиле) в формат PDF.

Причины ошибки "Элемент не выбран!"

Рассмотрим подробнее код, который чаще всего приводит к такой проблеме:


Об = Документы.СчетНаОплатуПокупателю.НайтиПоНомеру("СП000008664"); 
ПР = Об.ПолучитьОбъект(); // Здесь возникает исключение

Ошибка возникает из-за того, что метод НайтиПоНомеру не нашел нужный документ в базе данных и вернул пустую ссылку. Применение метода ПолучитьОбъект() к пустой ссылке всегда завершается критической ошибкой системы. Выясним причину, почему документ мог быть не найден:

  1. Периодичность нумерации документов. Если в конфигураторе для данного документа установлена периодичность (например, «В пределах года»), то поиск по номеру обязательно требует передачи второго параметра — даты. Без указания даты платформа будет искать документ только в текущем периоде (в текущем году). Если документ прошлогодний, он не будет найден.
  2. Строгое соответствие формата. Метод выполняет точное посимвольное сравнение строки. Длина номера, наличие префиксов организации или базы, а также ведущие нули (например, "0000") должны совпадать со строгим форматом номера в системе.

Как правильно искать документ по номеру

Чтобы избежать падения кода, всегда проверяйте полученную ссылку на заполненность с помощью метода Пустая(). Также, если документ имеет периодическую нумерацию, обязательно передавайте дату для поиска:


// Передаем дату, принадлежащую нужному периоду
Об = Документы.СчетНаОплатуПокупателю.НайтиПоНомеру("СП000008664", ТекущаяДата());

Если Не Об.Пустая() Тогда
    ПР = Об.ПолучитьОбъект();
    Сообщить(ПР);
Иначе
    Сообщить("Документ не найден! Проверьте номер или дату.");
КонецЕсли;

Альтернативный способ: поиск документа запросом

Посмотрим на пример использования запроса. Запрос работает надежнее, так как позволяет использовать оператор ПОДОБНО (если вы не уверены в префиксах) и легко сортировать результаты, если нашлось несколько дублей:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |   СчетНаОплатуПокупателю.Ссылка КАК Ссылка
    |ИЗ
    |   Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
    |ГДЕ
    |   СчетНаОплатуПокупателю.Номер ПОДОБНО &Номер
    |УПОРЯДОЧИТЬ ПО
    |   СчетНаОплатуПокупателю.Дата УБЫВ";

Запрос.УстановитьПараметр("Номер", "%СП000008664%");
РезультатЗапроса = Запрос.Выполнить().Выбрать();

Если РезультатЗапроса.Следующий() Тогда
    Док = РезультатЗапроса.Ссылка.ПолучитьОбъект();
    // Дальнейшие действия
Иначе
    Док = Неопределено;
    Сообщить("Документ с таким номером отсутствует.");
КонецЕсли;

Как программно сохранить печатную форму в PDF

Начиная с современных версий платформы 1С:Предприятие (8.2 и выше), система умеет сохранять табличные документы в формат PDF встроенными средствами. Использовать сторонние PDF-принтеры больше не требуется. Для этого нужно получить сформированный ТабличныйДокумент и вызвать у него метод Записать.

Рассмотрим пример формирования макета и его выгрузки в файл:


Если РезультатЗапроса.Следующий() Тогда
    СсылкаНаДокумент = РезультатЗапроса.Ссылка;
    
    // Получаем сформированный табличный документ из экспортной процедуры менеджера или общего модуля
    ТабДокумент = ОбщийМодульПечати.ПечатьСчета(СсылкаНаДокумент, "СчетСС");
    
    // Сохраняем в PDF
    ПутьКФайлу = "C:\РабочийСтол\Счет_" + СсылкаНаДокумент.Номер + ".pdf";
    ТабДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
    
    Сообщить("Файл успешно сохранен: " + ПутьКФайлу);
КонецЕсли;

Программная печать документов с факсимиле (печатями и подписями)

Часто возникает необходимость программно напечатать и сохранить счет с уже наложенной печатью и подписью (факсимиле). Проанализируем ситуацию: попытки обратиться к элементам формы напрямую (например, через Док.ПолучитьФорму("ФормаДокумента").ЭлементыФормы.фПечатьФаксимиле = Истина) — это устаревший и некорректный подход. Он не будет работать в фоновых заданиях или на сервере, так как серверу недоступен визуальный интерфейс.

В современных типовых конфигурациях (на базе БСП, таких как «Бухгалтерия предприятия» или «Управление торговлей») механизм работает иначе:

  1. Изображения печатей предварительно сохраняются в карточке организации на вкладке «Логотип и печать».
  2. Для программного вывода используется передача специальных структур в качестве аргументов при вызове экспортных процедур печати.

Посмотрим на пример правильной передачи параметра факсимиле при формировании печатной формы:


// Создаем структуру с параметрами печати
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("ПечатьФаксимиле", Истина); // Флажок вывода печати и подписи

МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаДокумент);

// Вызываем общую процедуру печати (зависит от конкретной конфигурации)
// Система автоматически найдет картинки организации и наложит их на макет
ТабДокумент = Документы.СчетНаОплатуПокупателю.СформироватьПечатнуюФорму(МассивОбъектов, ПараметрыПечати);

Если ТабДокумент <> Неопределено Тогда
    ТабДокумент.Записать("C:\РабочийСтол\Счет_с_Факсимиле.pdf", ТипФайлаТабличногоДокумента.PDF);
КонецЕсли;

Используя эти методы, вы обезопасите код от непредвиденных падений при поиске элементов и сможете автоматизировать рутинные задачи по сохранению документов и счетов в PDF для последующей отправки клиентам.

← На главную