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