В практике разработки на платформе 1С:Предприятие 8.3 часто встречается ситуация, когда типовую конфигурацию не хотят снимать с поддержки или изменять визуально в конфигураторе. В таких случаях разработчики прибегают к программному добавлению элементов на форму. Однако при попытке вывести эти данные в печатную форму возникают сложности: данные «не видны» в модуле менеджера или обработке печати. Проанализируем эту ситуацию, выясним причины и найдем правильные способы решения проблемы.
Для начала разберем важный технический нюанс, который часто сбивает с толку. Рассмотрим пример кода, которым поле добавляется на форму документа:
ЭлементПриянто = Элементы.Добавить("КоличествоПринятоПокупателем", Тип("ПолеФормы"), Элементы.Запасы);
ЭлементПриянто.Вид = ВидПоляФормы.ПолеВвода;
ЭлементПриянто.ПутьКДанным = "Объект.Запасы.КоличествоПринятоПокупателем";
Элементы.Переместить(ЭлементПриянто, Элементы.Запасы, Элементы.Найти("ЗапасыОстатки"));
ЭлементПриянто.УстановитьДействие("ПриИзменении", "КоличествоПринятоПокупателем");
Здесь мы видим использование метода Элементы.Добавить. Важно понимать: этот метод создает только визуальный элемент (колонку в таблице на экране). Чтобы этот элемент работал, свойство ПутьКДанным должно указывать на существующий реквизит в структуре данных.
Существует три варианта того, где на самом деле могут находиться данные:
Проанализируем работу механизмов печати (особенно в конфигурациях на базе БСП, таких как УНФ, УТ 11 или ERP). Когда вы нажимаете кнопку «Печать», система не берет данные из открытой вами формы. Вместо этого она обращается к модулю менеджера документа или специальной обработке печати.
Внутри этих модулей выполняется Запрос к базе данных. Проблема автора темы заключалась в том, что он добавил колонку на форму, но не обновил текст запроса, который собирает данные для печатной формы. Запрос «не знает» о существовании вашего нового поля, даже если оно есть в метаданных.
Прежде чем менять код печати, выясним, существует ли поле КоличествоПринятоПокупателем физически. Самый простой способ — воспользоваться консолью запросов. Попробуем выполнить простейший запрос:
ВЫБРАТЬ
РасходнаяНакладнаяЗапасы.КоличествоПринятоПокупателем
ИЗ
Документ.РасходнаяНакладная.Запасы КАК РасходнаяНакладнаяЗапасы
ГДЕ
РасходнаяНакладнаяЗапасы.Ссылка = &Ссылка
Если система выдает ошибку «Поле не найдено», значит, реквизит является чисто экранным (динамическим) и в базе его нет. В этом случае печать из базы невозможна, пока вы не обеспечите сохранение этих данных в реальные таблицы (например, через механизм Дополнительных Реквизитов).
Если реквизит в базе существует, переходим к редактированию кода печати. Разберем, как это сделать в типовой обработке или модуле менеджера. Обычно там есть функция, называемая СформироватьЗапросДляПечати или ПодготовитьДанныеДляПечати. Нам нужно найти место, где описываются поля табличной части Запасы.
Рассмотрим пример того, как нужно дополнить запрос:
// Находим текст запроса в модуле
ТекстЗапроса = "ВЫБРАТЬ
| РасходнаяНакладнаяЗапасы.Номенклатура,
| РасходнаяНакладнаяЗапасы.Количество,
| РасходнаяНакладнаяЗапасы.Цена,
| // Добавляем наше поле вручную:
| РасходнаяНакладнаяЗапасы.КоличествоПринятоПокупателем КАК КоличествоПринято
|ИЗ
| Документ.РасходнаяНакладная.Запасы КАК РасходнаяНакладнаяЗапасы
|ГДЕ
| РасходнаяНакладнаяЗапасы.Ссылка В(&МассивОбъектов)";
После добавления поля в текст запроса, оно появится в результирующей выборке или таблице значений (например, в структуре ДанныеОбъектовПечати). Теперь его можно выводить в макет.
Теперь, когда данные получены из базы, проанализируем процесс заполнения параметров макета. Посмотрим на типовой код заполнения области:
ОбластьМакета = Макет.ПолучитьОбласть("Строка");
// Если мы добавили поле в запрос под именем "КоличествоПринято",
// то метод Заполнить() найдет его в строке выборки автоматически
ОбластьМакета.Параметры.Заполнить(СтрокаДанных);
ТабличныйДокумент.Вывести(ОбластьМакета);
Важно: Убедитесь, что в самом макете (таблице mxl) вы создали соответствующий параметр и назвали его точно так же, как поле в запросе (в нашем примере — КоличествоПринято).
Если выяснилось, что поле добавлено через ИзменитьРеквизиты() на форме и не сохраняется в базу, стандартный путь через запрос в модуле менеджера не сработает. В такой ситуации рассмотрим альтернативный вариант: Печать с контекстом формы.
В этом случае вы не вызываете серверную команду печати БСП, а формируете печатную форму прямо из модуля формы, передавая туда таблицу Объект.Запасы в качестве источника данных.
// Пример передачи данных из формы напрямую
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("ДанныеТЧ", Объект.Запасы.Выгрузить());
// Далее вызываем процедуру формирования печатной формы, передавая эти данные
Однако помните, что это считается «плохим тоном» в архитектуре 1С, так как печатные формы должны быть независимы от состояния экрана пользователя. Правильным решением будет всё же создание реального реквизита в конфигурации или расширении.
Подведем итоги нашего исследования:
ДанныеОбъектовПечати — именно в неё попадают результаты запроса, которые затем передаются в макет.Следуя этим шагам, вы сможете успешно вывести любые дополнительные данные в печатные формы, независимо от того, как они были добавлены в пользовательский интерфейс.