При разработке внешних печатных форм и отчетов в 1С разработчики часто сталкиваются с задачей интерактивного запроса данных у пользователя (например, выбора даты приказа или подписания) с последующим выводом этих сведений в табличный документ. Начинающие программисты нередко допускают ошибки, связанные с областью видимости переменных между модулем формы и модулем объекта, а также испытывают трудности с корректным выводом и форматированием значений в ячейках макета.
Разберем подробно, почему возникают ошибки вида Переменная не определена или Поле объекта не обнаружено, и рассмотрим пошаговый алгоритм передачи даты в ячейку макета с нужным форматом отображения.
Типичный сценарий: при открытии или формировании печатной формы система запрашивает у пользователя дату с помощью диалога ВвестиЗначение. Затем эту дату требуется подставить в определенную ячейку табличного документа.
Посмотрим на частые причины возникновения ошибок в таком сценарии:
Печать) не имеет прямого доступа к этой локальной переменной. Попытка обратиться к ней напрямую вызывает ошибку компиляции Переменная не определена.Параметр или имя параметра в макете не совпадает с кодом присвоения (например, опечатка в регистре или названии), платформа выдает исключение Поле объекта не обнаружено.Дата содержат и время (например, 15.05.2024 0:00:00). Для корректного представления в официальных документах требуется обязательное форматирование.Разберем процесс настройки печатной формы от конфигуратора до программного кода.
Чтобы значение даты, полученное от пользователя, было доступно внутри функции формирования печатного документа, необходимо связать его с объектом обработки. Для этого используем один из двух способов:
ДатаПриказа с типом Дата (состав даты: Дата). В этом случае значение сохраняется в контексте объекта и доступно во всех процедурах и функциях обработки.
Перем ДатаПриказа Экспорт;
При интерактивном вводе значения в форме присваиваем полученное значение реквизиту объекта.Откроем макет печатной формы в конфигураторе и выполним настройку целевой ячейки:
Параметр.ДатаПриказа.Перейдем в модуль объекта к функции формирования печатной формы (как правило, функция Печать()). Перед выводом макета в итоговый табличный документ присваиваем значение параметру.
Рассмотрим пример правильного кода функции печати:
Функция Печать() Экспорт
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ДопТрудДоговор";
Макет = ПолучитьМакет("ДопТрудДоговор");
// Заполняем постоянные параметры макета
Макет.Параметры.НомерДоговора = СсылкаНаОбъект.НомерДоговора;
Макет.Параметры.ДатаДоговора = Формат(СсылкаНаОбъект.ДатаДоговора, "ДЛФ=D") + " г.";
Макет.Параметры.ФизЛицоИНН = СсылкаНаОбъект.ФизЛицо.ИНН;
// Получаем выборку из запроса
Выборка = СформироватьЗапросДляПечатиТрудовогоДоговора().Выбрать();
Если Выборка.Следующий() Тогда
Макет.Параметры.Заполнить(Выборка);
Макет.Параметры.НазваниеОрганизации = СокрЛП(Макет.Параметры.НазваниеОрганизации);
Макет.Параметры.ДокументКемВыдан = СокрЛП(Макет.Параметры.ДокументКемВыдан);
Макет.Параметры.ДокументДатаВыдачи = Формат(Макет.Параметры.ДокументДатаВыдачи, "ДЛФ=D");
КонецЕсли;
// Передаем дату приказа с форматированием (без времени)
Макет.Параметры.ДатаПриказа = Формат(ДатаПриказа, "ДФ=dd.MM.yyyy; ДП=''");
// Выводим заполненный макет в табличный документ
ТабДокумент.Вывести(Макет);
Возврат ТабДокумент;
КонецФункции
Проанализируем варианты настройки формата даты, чтобы исключить отображение времени:
Формат:
Формат(ДатаПриказа, "ДФ=dd.MM.yyyy") — формирует дату в виде 15.05.2024.Формат(ДатаПриказа, "ДЛФ=DD") — выводит длинный формат даты прописью месяца: 15 мая 2024 г.ДП='' в форматной строке (например, "ДФ=dd.MM.yyyy; ДП=''") обеспечивает корректное отображение незаполненной даты в виде пустой строки, предотвращая появление значения 01.01.0001.Формат можно задать интерактивно без использования функции Формат в коде. Для этого в свойствах ячейки макета находим строку Формат, нажимаем кнопку выбора и в конструкторе форматной строки настраиваем желаемый вид даты. В коде в таком случае достаточно передать исходное значение:
Макет.Параметры.ДатаПриказа = ДатаПриказа;
Если дату необходимо встроить внутрь текстового предложения (например: «на основании приказа от 15.05.2024 г.»), в свойствах ячейки выбираем тип заполнения Шаблон, а в тексте ячейки указываем выражение с параметрами и форматом:
на основании приказа от [ДатаПриказа:ДФ=dd.MM.yyyy] г.
Пустые строки и отступы между логическими блоками кода не влияют на скорость и корректность выполнения программы платформой 1С. Однако следование стандартам оформления кода (структурирование условий, группировка заполнения параметров макета и разделение логических блоков пустыми строками) существенно упрощает чтение и сопровождение алгоритмов другими разработчиками.