Почему параметры из запроса не заполняются в печатной форме 1С, а переданные с формы отображаются?

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет
← На главную

При разработке внешних печатных форм в 1С:Предприятии 8.3 программисты часто сталкиваются с ситуацией, когда некоторые параметры шаблона заполняются корректно (например, те, что передаются напрямую из формы), а другие, которые должны подтягиваться из запроса, остаются пустыми. Давайте разберем эту проблему на примере и выясним, как ее эффективно диагностировать и устранить.

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

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

Прежде всего, давайте внимательно рассмотрим код, предоставленный автором, чтобы понять, как устроена печатная форма и где могут возникать ошибки.

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


// Это код модуля объекта:
функция ПечатьОпринятииОС(МассивОбъектов)
    табдок = новый табличныйдокумент; 

    запрос = новый запрос ; 
    запрос.текст = 
        "ВЫБРАТЬ 
        | ПринятиеКУчетуОС.Номер КАК Номер, 
        | ПринятиеКУчетуОС.Дата КАК Дата, 
        | ПринятиеКУчетуОС.МОЛБУ КАК МОЛБУ, 
        | ПринятиеКУчетуОС.СрокПолезногоИспользованияБУ КАК СрокПолезногоИспользованияБУ, 
        | ПринятиеКУчетуОС.ПодразделениеОрганизации КАК ПодразделениеОрганизации, 
        | ПринятиеКУчетуОСОС.ОсновноеСредство КАК ОсновноеСредство, 
        | ПринятиеКУчетуОСОС.ИнвентарныйНомер КАК ИнвентарныйНомер, 
        | ПринятиеКУчетуОСОС.Ссылка.ДоговорКонтрагента КАК ДоговорКонтрагента1, 
        | ПринятиеКУчетуОСОС.ОсновноеСредство.ГруппаОС КАК ОсновноеСредствоГруппаОС, 
        | ПринятиеКУчетуОСОС.ОсновноеСредство.КодПоОКОФ КАК ОсновноеСредствоКодПоОКОФ, 
        | ПринятиеКУчетуОС.МестонахождениеОС КАК МестонахождениеОС 
        |ИЗ 
        | Документ.ПринятиеКУчетуОС.ОС КАК ПринятиеКУчетуОСОС 
        | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПринятиеКУчетуОС КАК ПринятиеКУчетуОС 
        | ПО ПринятиеКУчетуОСОС.Ссылка = ПринятиеКУчетуОС.Ссылка 
        |ГДЕ 
        | ПринятиеКУчетуОС.Ссылка В(&МассивОбъектов)" ; 
    Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
    // !!!! ОШИБКА: Должно быть Выборка = Запрос.Выполнить().Выбрать();
    запрос = запрос.Выполнить; 
    выборка = запрос.Выбрать; 
    выборка.Следующий; // !!!! ОШИБКА: Обработка только одной строки

    макет = получитьмакет("Макет");
    Секцияшапка = макет.ПолучитьОбласть("Шапка");
    Секциятело = макет.ПолучитьОбласть("тело");
    Секцияподвал = макет.ПолучитьОбласть("подвал");

    // Заполнение Шапки
    Секцияшапка.Параметры.датадок = формат(выборка.дата,"ДФ=dd.MM.yyyy") ;
    секцияшапка.Параметры.номердог = прав(выборка.номер, 6);
    секцияшапка.параметры.основныесредства = выборка.ОсновноеСредство;
    секцияшапка.параметры.инвномер = Прав(выборка.ИнвентарныйНомер, 6);
    секцияшапка.Параметры.номердоговор = выборка.ДоговорКонтрагента1;
    табдок.Вывести(Секцияшапка);

    // Заполнение Тела
    Секциятело.Параметры.оснсредства = выборка.ОсновноеСредство;
    Секциятело.параметры.датадок = формат(выборка.дата,"ДФ=dd.MM.yyyy");
    секциятело.параметры.группаос = выборка.ОсновноеСредствоГруппаОС;
    Секциятело.параметры.кодокоф = выборка.ОсновноеСредствоКодПоОКОФ;
    Секциятело.Параметры.срокос = выборка.срокполезногоиспользованиябу;
    Секциятело.Параметры.оснсредства = выборка.ОсновноеСредство;
    Секциятело.параметры.инвномер = прав(выборка.ИнвентарныйНомер,6);
    Секциятело.Параметры.матответственный = выборка.молбу;
    Секциятело.параметры.местоэксплуатации = выборка.подразделениеорганизации;
    Секциятело.Параметры.местонахожденияос = выборка.МестонахождениеОС;
    табдок.Вывести(секциятело);

    // Заполнение Подвала
    Секцияподвал.Параметры.Сотрудник1 = Сотрудник1; // !!!! ОШИБКА: Параметры Сотрудник1, Сотрудник2 и т.д.
    Секцияподвал.Параметры.сотрудник2 = Сотрудник2; // не переданы в функцию ПечатьОпринятииОС.
    Секцияподвал.Параметры.сотрудник3 = Сотрудник3;
    Секцияподвал.Параметры.Должность1 = должность1;
    Секцияподвал.Параметры.Должность2 = должность2;
    Секцияподвал.Параметры.Должность3 = должность3;
    Табдок.Вывести(Секцияподвал);
    
    возврат табдок;
конецфункции

// ... остальной код регистрации и вызова печати ...

// Это код в самой форме
&НаКлиенте
Процедура Печать(Команда)
    КоллекцияПечатныхФорм = ПечатьНаСервере("макет");
    Для Каждого Стр из КоллекцияПечатныхФорм Цикл
        Стр.ТабличныйДокумент.Показать;
    КонецЦикла;
КонецПроцедуры

&НаСервере
Функция ПечатьНаСервере(КомандаПечати)
    МассивОбъектов = Новый Массив;
    МассивОбъектов.Добавить(Объект.СсылканаОбъект);
    КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(КомандаПечати);
    ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода;
    ОбъектыПечати = Новый СписокЗначений;
    ОбъектВЗначении = РеквизитФормыВЗначение("Объект");
    // !!!! ОШИБКА: Вызов метода Печать() внешнего объекта, а не ПечатьОпринятииОС()
    ОбъектВЗначении.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
    Возврат ОбщегоНазначения.ТаблицаЗначенийВМассив(КоллекцияПечатныхФорм);
КонецФункции

После анализа кода мы выявили несколько критических моментов, которые могли привести к описанной проблеме:

  1. Некорректный вызов выполнения запроса: Строка запрос = запрос.Выполнить; является синтаксической ошибкой. Правильный вызов должен быть Выборка = Запрос.Выполнить().Выбрать();. Без скобок метод Выполнить не вызывается, и переменная запрос получает ссылку на сам метод, а не на результат его выполнения. Это приводит к тому, что выборка = запрос.Выбрать; будет пытаться вызвать метод Выбрать у самого объекта "Запрос", а не у объекта "РезультатЗапроса", что, скорее всего, вызовет ошибку или вернет пустую выборку.
  2. Обработка только одной строки выборки: Даже если бы запрос выполнялся корректно, строка выборка.Следующий; (опять же, без скобок, но здесь это метод объекта "Выборка") вызовет метод Следующий() только один раз. Если запрос возвращает несколько строк (например, если в документе "ПринятиеКУчетуОС" несколько основных средств в табличной части "ОС"), то будет обработана только первая строка, а остальные будут проигнорированы. Для обработки всех строк необходимо использовать цикл Пока Выборка.Следующий() Цикл ... КонецЦикла;.
  3. Непередача параметров "Сотрудник" и "Должность": Параметры Сотрудник1, Сотрудник2, Должность1 и т.д., используемые в секции "Подвал", не передаются в функцию ПечатьОпринятииОС(). Эти переменные должны быть либо получены из других источников внутри функции (что маловероятно), либо явно переданы в нее из формы. Если они должны приходить с формы, то необходимо обеспечить их передачу.
  4. Возможно, пустой МассивОбъектов или некорректный тип ссылки: Это самая частая причина, почему запрос возвращает пустой результат. Если МассивОбъектов, переданный в запрос, пуст или содержит ссылки на объекты, которые не удовлетворяют условиям запроса (например, не являются ссылками на документы "ПринятиеКУчетуОС"), то запрос, естественно, ничего не вернет.
  5. Некорректный вызов метода печати из формы: В серверной функции ПечатьНаСервере(), вместо прямого вызова ОбъектВЗначении.ПечатьОпринятииОС(МассивОбъектов);, мы видим вызов ОбъектВЗначении.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);. Этот вызов предназначен для механизма подсистемы "УправлениеПечатью", которая в свою очередь вызывает экспортную процедуру Печать() в модуле объекта внешней обработки. Внутри этой процедуры уже происходит вызов ПечатьОпринятииОС(). Этот косвенный вызов сам по себе не является ошибкой, если он корректно передает параметры, но его нужно учитывать при отладке.

Шаги по диагностике и устранению проблемы

Давайте пошагово разберем, как мы можем найти и исправить ошибку, опираясь на опыт, полученный на форуме.

1. Проверяем результат выполнения запроса

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

  1. Откройте модуль объекта вашей внешней обработки.
  2. Найдите функцию ПечатьОпринятииОС().
  3. Исправьте ошибочную строку вызова запроса и добавьте проверку на пустоту выборки.

функция ПечатьОпринятииОС(МассивОбъектов)
    табдок = новый табличныйдокумент; 

    запрос = новый запрос ; 
    запрос.текст = 
        "ВЫБРАТЬ 
        | ПринятиеКУчетуОС.Номер КАК Номер, 
        | ПринятиеКУчетуОС.Дата КАК Дата, 
        | ПринятиеКУчетуОС.МОЛБУ КАК МОЛБУ, 
        | ПринятиеКУчетуОС.СрокПолезногоИспользованияБУ КАК СрокПолезногоИспользованияБУ, 
        | ПринятиеКУЧетуОС.ПодразделениеОрганизации КАК ПодразделениеОрганизации, 
        | ПринятиеКУЧетуОСОС.ОсновноеСредство КАК ОсновноеСредство, 
        | ПринятиеКУЧетуОСОС.ИнвентарныйНомер КАК ИнвентарныйНомер, 
        | ПринятиеКУЧетуОСОС.Ссылка.ДоговорКонтрагента КАК ДоговорКонтрагента1, 
        | ПринятиеКУЧетуОСОС.ОсновноеСредство.ГруппаОС КАК ОсновноеСредствоГруппаОС, 
        | ПринятиеКУЧетуОСОС.ОсновноеСредство.КодПоОКОФ КАК ОсновноеСредствоКодПоОКОФ, 
        | ПринятиеКУЧетуОС.МестонахождениеОС КАК МестонахождениеОС 
        |ИЗ 
        | Документ.ПринятиеКУчетуОС.ОС КАК ПринятиеКУЧетуОСОС 
        | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПринятиеКУЧетуОС КАК ПринятиеКУЧетуОС 
        | ПО ПринятиеКУЧетуОСОС.Ссылка = ПринятиеКУЧетуОС.Ссылка 
        |ГДЕ 
        | ПринятиеКУЧетуОС.Ссылка В(&МассивОбъектов)" ; 
    Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
    
    // Корректное выполнение запроса и получение выборки
    РезультатЗапроса = Запрос.Выполнить(); 
    выборка = РезультатЗапроса.Выбрать(); 

    // Добавляем проверку на пустоту выборки
    Если выборка.Пустой() Тогда 
        Сообщить("Запрос вернул пустой результат. Проверьте передаваемые ссылки и условия запроса.");
        // Можем вернуть пустой табличный документ или сгенерировать ошибку
        Возврат табдок; 
    КонецЕсли;

    // Далее ваш код по заполнению макета, но внутри цикла
    // ...

После этого запустите печать. Если вы увидите сообщение "Запрос вернул пустой результат...", значит, проблема действительно в том, что запрос ничего не находит. Это подтверждает диагностику, начатую в обсуждении.

2. Отлаживаем и проверяем МассивОбъектов

Теперь, когда мы знаем, что запрос пуст, наша следующая задача — выяснить, почему. Наиболее вероятная причина — некорректное содержимое параметра &МассивОбъектов. Для этого нам потребуется отладчик.

  1. Установите точку останова в функции ПечатьОпринятииОС() на строке Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);.
  2. Установите еще одну точку останова в серверной процедуре ПечатьНаСервере() на строке МассивОбъектов.Добавить(Объект.СсылканаОбъект);.
  3. Запустите 1С в режиме отладки и вызовите печать.
  4. Когда отладчик остановится в ПечатьНаСервере(), проверьте переменную Объект.СсылканаОбъект:
    • Какой тип у этой ссылки? Должен быть ДокументСсылка.ПринятиеКУчетуОС.
    • Является ли ссылка пустой (Неопределено) или она указывает на конкретный документ?
  5. Продолжите выполнение до точки останова в ПечатьОпринятииОС(). Проверьте содержимое переменной МассивОбъектов:
    • Содержит ли массив ссылки?
    • Если да, то сколько их?
    • Каков тип каждой ссылки?
    • Указывают ли эти ссылки на реально существующие в базе документы "ПринятиеКУчетуОС", которые содержат заполненные табличные части "ОС"?

Если МассивОбъектов пуст или содержит ссылки неверного типа (например, Неопределено), то проблема на стороне формы, где этот массив формируется. Если же массив содержит корректные ссылки, но запрос все равно пуст, то причина может быть в условиях запроса или в самих данных документа.

3. Корректируем формирование МассивОбъектов и передачу параметров

Предполагая, что МассивОбъектов был пустым или некорректным, давайте рассмотрим, как это исправить.

  1. Проверяем Объект.СсылканаОбъект: Убедитесь, что реквизит формы Объект, из которого берется СсылканаОбъект, действительно связан с текущим документом "ПринятиеКУчетуОС". Если форма внешней обработки открывается для конкретного документа, то реквизит формы с типом Документ.ПринятиеКУчетуОС обычно называется просто Объект.

    В серверной функции ПечатьНаСервере() мы получаем ссылку таким образом:

    
    &НаСервере
    Функция ПечатьНаСервере(КомандаПечати)
        МассивОбъектов = Новый Массив;
        // Убедитесь, что Объект.СсылканаОбъект содержит нужную ссылку
        МассивОбъектов.Добавить(Объект.СсылканаОбъект); 
        // ...
    КонецФункции
    

    Если внешняя обработка является печатной формой, привязанной к документу, то механизм подсистемы "УправлениеПечатью" передает ссылки на объекты в процедуру Печать(МассивОбъектов, КоллекцияПечатныхФорм, ...). В этом случае, возможно, нет необходимости формировать МассивОбъектов вручную в функции ПечатьНаСервере, а достаточно использовать тот МассивОбъектов, который уже передан в процедуру Печать модуля объекта.

  2. Передача параметров "Сотрудник" и "Должность": Эти параметры, если они берутся с формы, должны быть явно переданы в функцию ПечатьОпринятииОС(). Для этого необходимо:

    1. На форме, где находятся поля ввода для сотрудников и должностей, считать их значения.
    2. Передать эти значения в серверную функцию ПечатьНаСервере(). Это можно сделать, добавив их в качестве дополнительных параметров или упаковав в структуру.
    3. В серверной функции ПечатьНаСервере() передать эти значения далее в вызов функции печати.
    4. В функции ПечатьОпринятииОС() принять эти параметры и использовать их.

    Пример изменения кода для передачи дополнительных параметров:

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

    Этот подход позволяет гибко передавать любые дополнительные параметры из формы в функцию формирования печатной формы.

4. Корректируем обработку выборки запроса для вывода всех данных

Как мы уже выяснили, текущий код обрабатывает только одну строку выборки. Если в документе "ПринятиеКУчетуОС" может быть несколько основных средств, то для вывода их всех необходимо использовать цикл. Обычно для табличной части печатают несколько секций "Тело".


функция ПечатьОпринятииОС(МассивОбъектов, ДополнительныеПараметры = Неопределено)
    табдок = новый табличныйдокумент; 

    // ... ваш код запроса и установки параметра ...

    РезультатЗапроса = Запрос.Выполнить(); 
    выборка = РезультатЗапроса.Выбрать(); 

    Если выборка.Пустой() Тогда 
        Сообщить("Запрос вернул пустой результат. Проверьте передаваемые ссылки и условия запроса.");
        Возврат табдок; 
    КонецЕсли;

    макет = получитьмакет("Макет");
    Секцияшапка = макет.ПолучитьОбласть("Шапка");
    Секциятело = макет.ПолучитьОбласть("тело");
    Секцияподвал = макет.ПолучитьОбласть("подвал");

    // Выводим шапку один раз, перед циклом
    // Перемещаем выборка.Следующий() внутрь цикла или используем ее для шапки, если она должна быть по первой строке
    Если выборка.Следующий() Тогда // Переходим на первую строку для шапки
        Секцияшапка.Параметры.датадок = формат(выборка.дата,"ДФ=dd.MM.yyyy") ;
        секцияшапка.Параметры.номердог = прав(выборка.номер, 6);
        секцияшапка.параметры.основныесредства = выборка.ОсновноеСредство;
        секцияшапка.параметры.инвномер = Прав(выборка.ИнвентарныйНомер, 6);
        секцияшапка.Параметры.номердоговор = выборка.ДоговорКонтрагента1;
        табдок.Вывести(Секцияшапка);

        // Теперь выводим тело в цикле
        // Здесь мы уже стоим на первой строке, поэтому нет необходимости снова вызывать выборка.Следующий()
        // для первого прохода цикла, если мы уже использовали ее для шапки.
        // Более универсальный подход - сделать выборку еще раз или не вызывать Следующий() для шапки, 
        // а сразу идти в цикл. Или, если шапка берет данные из первой строки, а тело из всех:
        
        // Перейдем в начало выборки, чтобы начать с первой строки для тела, 
        // если шапка уже использовала выборка.Следующий()
        выборка.Сбросить(); 
        Пока выборка.Следующий() Цикл // Проходим по всем строкам выборки
            Секциятело.Параметры.оснсредства = выборка.ОсновноеСредство;
            Секциятело.параметры.датадок = формат(выборка.дата,"ДФ=dd.MM.yyyy");
            секциятело.параметры.группаос = выборка.ОсновноеСредствоГруппаОС;
            Секциятело.параметры.кодокоф = выборка.ОсновноеСредствоКодПоОКОФ;
            Секциятело.Параметры.срокос = выборка.срокполезногоиспользованиябу;
            Секциятело.Параметры.оснсредства = выборка.ОсновноеСредство;
            Секциятело.параметры.инвномер = прав(выборка.ИнвентарныйНомер,6);
            Секциятело.Параметры.матответственный = выборка.молбу;
            Секциятело.параметры.местоэксплуатации = выборка.подразделениеорганизации;
            Секциятело.Параметры.местонахожденияос = выборка.МестонахождениеОС;
            табдок.Вывести(секциятело);
        КонецЦикла;
    КонецЕсли; // Завершение условия Если выборка.Следующий() для шапки

    // Выводим подвал после цикла
    Если ДополнительныеПараметры <> Неопределено Тогда
        Секцияподвал.Параметры.Сотрудник1 = ДополнительныеПараметры.Сотрудник1;
        Секцияподвал.Параметры.сотрудник2 = ДополнительныеПараметры.Сотрудник2;
        Секцияподвал.Параметры.сотрудник3 = ДополнительныеПараметры.Сотрудник3;
        Секцияподвал.Параметры.Должность1 = ДополнительныеПараметры.Должность1;
        Секцияподвал.Параметры.Должность2 = ДополнительныеПараметры.Должность2;
        Секцияподвал.Параметры.Должность3 = ДополнительныеПараметры.Должность3;
    КонецЕсли;
    Табдок.Вывести(Секцияподвал);
    
    возврат табдок;
КонецФункции

5. Проверяем тип Объект.СсылкаНаОбъект и правильность организации внешней обработки

Важно убедиться, что Объект.СсылкаНаОбъект действительно возвращает ссылку на документ "ПринятиеКУчетуОС". Если у вас внешняя печатная форма, которая должна вызываться из формы документа "ПринятиеКУчетуОС", то механизм подсистемы "УправлениеПечатью" передаст массив ссылок на эти документы. Если же это внешняя обработка, которая открывается из произвольного места, и вы в ней сами выбираете документ, то важно правильно сформировать МассивОбъектов.

Предположим, что внешняя форма используется как печатная форма для документа "ПринятиеКУчетуОС". Тогда в серверной функции ПечатьНаСервере(), когда мы получаем Объект.СсылканаОбъект, мы должны быть уверены, что Объект формы — это ссылка на документ "ПринятиеКУчетуОС".

Если вы хотите протестировать функцию ПечатьОпринятииОС() напрямую, минуя всю инфраструктуру "УправленияПечатью", можно временно изменить серверную функцию так (как было предложено в обсуждении):


&НаСервере
Функция ПечатьНаСервере(КомандаПечати, ДополнительныеПараметры = Неопределено) // Принимаем дополнительные параметры
    МассивОбъектов = Новый Массив;
    // Предполагаем, что Объект.СсылканаОбъект - это ссылка на текущий документ
    МассивОбъектов.Добавить(Объект.СсылканаОбъект); 
    
    ОбъектВЗначении = РеквизитФормыВЗначение("Объект");
    
    // Прямой вызов функции формирования печатной формы
    // Если функция ПечатьОпринятииОС() в модуле объекта сделана Экспортной
    ТабличныйДокументДляПечати = ОбъектВЗначении.ПечатьОпринятииОС(МассивОбъектов, ДополнительныеПараметры); 

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

    Возврат ОбщегоНазначения.ТаблицаЗначенийВМассив(КоллекцияПечатныхФорм);
КонецФункции

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

Резюме и рекомендации

Проблема незаполнения параметров из запроса в печатной форме 1С, когда другие параметры заполняются, почти всегда указывает на то, что запрос либо не выполняется корректно (синтаксические ошибки), либо возвращает пустой результат. Основные причины пустого результата запроса:

  1. Неправильная передача параметров в запрос: МассивОбъектов пуст или содержит ссылки не того типа, на которые рассчитан запрос.
  2. Некорректные условия запроса: Сам текст запроса или его условия ГДЕ не позволяют найти нужные данные по переданным ссылкам.
  3. Синтаксические ошибки при выполнении запроса или обходе выборки: Как было в нашем случае с запрос = запрос.Выполнить; и однократным выборка.Следующий;.

Всегда начинайте диагностику с проверки результата выполнения запроса на сервере, используя отладчик и временные сообщения. Убедитесь, что МассивОбъектов содержит именно те ссылки, которые вы ожидаете. Постепенно продвигайтесь от вызова функции печати на клиенте до выполнения запроса на сервере, проверяя значения всех ключевых переменных на каждом этапе.

Используя эти пошаговые методы отладки и понимая типовые ошибки, мы можем эффективно решать проблемы с заполнением печатных форм в 1С:Предприятии 8.3.

← На главную