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