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