При доработке внешней печатной формы УПД часто возникает задача корректного отображения строки 5а, которая должна содержать информацию о документе-основании, а также диапазон нумерации позиций (например, «1-17»). Рассмотрим, как реализовать этот функционал, если данные в шапке документа недоступны в момент вывода или структура конфигурации требует дополнительной настройки.
Проблема часто заключается в том, что в коде печатной формы расчет количества строк выполняется позже, чем формирование заголовка (шапки) документа. Чтобы исправить это, необходимо перенести логику расчета количества товарных позиций выше вызова процедуры вывода шапки.
Рассмотрим пошаговое изменение кода:
тбТовары или аналогичная переменная).КоличествоСтрок до вызова процедуры ЗаполнитьРеквизитыШапкиСчетФактура.КоличествоСтрок в качестве параметра в вызываемую процедуру.Пример реализации:
// Код перед циклом обработки строк
СтруктураПоиска = Новый Структура("Ссылка", ДанныеПечати.Ссылка);
тбТовары = СвернутьТовары(ВыборкаПоДокументам.Скопировать(ВыборкаПоДокументам.НайтиСтроки(СтруктураПоиска)), ДанныеПечати.СверткаСтрок);
КоличествоСтрок = тбТовары.Количество();
// Выводим общие реквизиты шапки с передачей нового параметра
ЗаполнитьРеквизитыШапкиСчетФактура(ДанныеПечати, Макет, ТабличныйДокумент, КоличествоСтрок);
// Далее идет основной цикл
Для Каждого СтрокаТовары из тбТовары Цикл
// ...
КонецЦикла;
В актуальных версиях типовых конфигураций 1С, таких как 1С:Комплексная автоматизация или 1С:Управление торговлей, часто уже реализован механизм заполнения строки 5а через специальный реквизит. Если ваша конфигурация поддерживает это, нет необходимости «изобретать велосипед».
Проверьте наличие реквизита ПредставлениеСтроки5а в объекте ДанныеПечати. Если он есть, используйте стандартный код, который обычно берется из модуля менеджера типового документа:
ПоДокументуОтгрузки = ?(ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ДанныеПечати, "ПредставлениеСтроки5а")
И ЗначениеЗаполнено(ДанныеПечати.ПредставлениеСтроки5а),
ДанныеПечати.ПредставлениеСтроки5а,
НСтр("ru='-- от --'"));
ПараметрыШапки.Вставить("ПоДокументуОтгрузки", ПоДокументуОтгрузки);
Если обновление конфигурации невозможно, а реквизит отсутствует, мы можем сформировать строку вручную, используя данные из документа-основания. Для этого мы берем количество строк из табличной части и номер документа.
Разберем пример кода для ручного формирования представления:
// Получаем количество строк из состава запасов документа-основания
КоличествоСтрок = ДанныеПечати.Ссылка.ДокументОснование.ВидыЗапасов.Количество();
// Формируем строковое представление с помощью функции СтрШаблон
ПредставлениеСтроки5а = СтрШаблон(НСтр("ru = '№ п/п %1 № %2 от %3'"),
"1-" + КоличествоСтрок,
ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ДанныеПечати.Номер, Ложь, Истина),
Формат(ДанныеПечати.Дата, "ДЛФ=D"));
ПоДокументуОтгрузки = ?(ЗначениеЗаполнено(ПредставлениеСтроки5а), ПредставлениеСтроки5а, НСтр("ru='-- от --'"));
При самостоятельной модификации печатных форм учитывайте следующие аспекты:
тбТовары) корректно очищаются и заполняются для каждой итерации цикла. Не используйте глобальные переменные для хранения промежуточных итогов.ОбщегоНазначения."1-" + КоличествоСтрок подходит только для простых случаев, когда документ имеет одно основание.Если вы столкнулись с тем, что данные не выводятся, первым делом проверьте с помощью отладчика, заполнен ли ваш объект ДанныеПечати необходимыми полями до начала выполнения кода вывода на макет.