Как передать переменную с датой в ячейку макета печатной формы 1С и настроить её формат

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

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

Анализ типовых ошибок при передаче данных в макет

Типичный сценарий: при открытии или формировании печатной формы система запрашивает у пользователя дату с помощью диалога ВвестиЗначение. Затем эту дату требуется подставить в определенную ячейку табличного документа.

Посмотрим на частые причины возникновения ошибок в таком сценарии:

  1. Несоответствие областей видимости: если значение запрашивается в модуле формы или в отдельной процедуре в локальную переменную, модуль объекта печатной формы (в частности, функция Печать) не имеет прямого доступа к этой локальной переменной. Попытка обратиться к ней напрямую вызывает ошибку компиляции Переменная не определена.
  2. Неверная настройка ячейки макета: если в свойствах ячейки табличного документа не указан тип заполнения Параметр или имя параметра в макете не совпадает с кодом присвоения (например, опечатка в регистре или названии), платформа выдает исключение Поле объекта не обнаружено.
  3. Вывод даты вместе со временем: по умолчанию переменные типа Дата содержат и время (например, 15.05.2024 0:00:00). Для корректного представления в официальных документах требуется обязательное форматирование.

Пошаговое решение задачи

Разберем процесс настройки печатной формы от конфигуратора до программного кода.

Шаг 1. Обеспечение доступности переменной

Чтобы значение даты, полученное от пользователя, было доступно внутри функции формирования печатного документа, необходимо связать его с объектом обработки. Для этого используем один из двух способов:

  1. Добавление реквизита в обработку: в дереве метаданных внешней обработки создаем реквизит ДатаПриказа с типом Дата (состав даты: Дата). В этом случае значение сохраняется в контексте объекта и доступно во всех процедурах и функциях обработки.
  2. Объявление экспортной переменной в модуле объекта: в самом начале модуля объекта можно объявить переменную с директивой экспорта: Перем ДатаПриказа Экспорт; При интерактивном вводе значения в форме присваиваем полученное значение реквизиту объекта.

Шаг 2. Настройка свойств ячейки в макете

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

  1. Выделяем ячейку, в которую должна выводиться дата.
  2. Открываем палитру свойств ячейки (комбинация клавиш Alt + Enter).
  3. В группе свойств Макет находим параметр Заполнение и выбираем значение Параметр.
  4. В поле Параметр указываем точное имя, например, ДатаПриказа.

Шаг 3. Заполнение параметров и форматирование даты в коде

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

Рассмотрим пример правильного кода функции печати:


Функция Печать() Экспорт
    
    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ДопТрудДоговор";
    
    Макет = ПолучитьМакет("ДопТрудДоговор");
    
    // Заполняем постоянные параметры макета
    Макет.Параметры.НомерДоговора = СсылкаНаОбъект.НомерДоговора;
    Макет.Параметры.ДатаДоговора = Формат(СсылкаНаОбъект.ДатаДоговора, "ДЛФ=D") + " г.";
    Макет.Параметры.ФизЛицоИНН = СсылкаНаОбъект.ФизЛицо.ИНН;
    
    // Получаем выборку из запроса
    Выборка = СформироватьЗапросДляПечатиТрудовогоДоговора().Выбрать();
    Если Выборка.Следующий() Тогда
        Макет.Параметры.Заполнить(Выборка);
        Макет.Параметры.НазваниеОрганизации = СокрЛП(Макет.Параметры.НазваниеОрганизации);
        Макет.Параметры.ДокументКемВыдан = СокрЛП(Макет.Параметры.ДокументКемВыдан);
        Макет.Параметры.ДокументДатаВыдачи = Формат(Макет.Параметры.ДокументДатаВыдачи, "ДЛФ=D");
    КонецЕсли;
    
    // Передаем дату приказа с форматированием (без времени)
    Макет.Параметры.ДатаПриказа = Формат(ДатаПриказа, "ДФ=dd.MM.yyyy; ДП=''");
    
    // Выводим заполненный макет в табличный документ
    ТабДокумент.Вывести(Макет);
    
    Возврат ТабДокумент;
    
КонецФункции

Способы форматирования даты в 1С

Проанализируем варианты настройки формата даты, чтобы исключить отображение времени:

  1. Программное форматирование через функцию Формат:
    • Формат(ДатаПриказа, "ДФ=dd.MM.yyyy") — формирует дату в виде 15.05.2024.
    • Формат(ДатаПриказа, "ДЛФ=DD") — выводит длинный формат даты прописью месяца: 15 мая 2024 г.
    • Параметр ДП='' в форматной строке (например, "ДФ=dd.MM.yyyy; ДП=''") обеспечивает корректное отображение незаполненной даты в виде пустой строки, предотвращая появление значения 01.01.0001.
  2. Настройка формата в палитре свойств ячейки:

    Формат можно задать интерактивно без использования функции Формат в коде. Для этого в свойствах ячейки макета находим строку Формат, нажимаем кнопку выбора и в конструкторе форматной строки настраиваем желаемый вид даты. В коде в таком случае достаточно передать исходное значение:

    Макет.Параметры.ДатаПриказа = ДатаПриказа;
  3. Использование типа заполнения «Шаблон»:

    Если дату необходимо встроить внутрь текстового предложения (например: «на основании приказа от 15.05.2024 г.»), в свойствах ячейки выбираем тип заполнения Шаблон, а в тексте ячейки указываем выражение с параметрами и форматом:

    на основании приказа от [ДатаПриказа:ДФ=dd.MM.yyyy] г.

Оформление кода и отступы

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

← На главную