В этой статье мы подробно разберем задачу по доработке печатной формы Универсального передаточного документа (УПД) в конфигурации «Торговля и Склад 9.2» на платформе 1С:Предприятие 7.7. Рассмотрим типичную ошибку начинающих программистов, из-за которой во всех строках печатается код одного и того же товара, и реализуем корректный алгоритм вывода данных.
Часто при попытке добавить новый реквизит (например, Код или Артикул) в макет печатной формы пользователи просто прописывают в ячейке выражение вида <Докум.Номенклатура.Код>. Однако при печати обнаруживается, что для всех позиций выводится код товара из первой строки документа.
Давайте выясним причину. В типовых конфигурациях 1С 7.7 (в частности, в «Торговле и Склад») механизм печати сложных документов, таких как Счет-фактура или УПД, устроен следующим образом:
МнЧ — Множественная Часть). Это делается для того, чтобы сгруппировать одинаковые товары, распределить их по Грузовым таможенным декларациям (ГТД) или разбить одну строку документа на несколько строк в печатной форме.МнЧ.Суть ошибки: Когда вы пишете в макете Докум.Номенклатура.Код, вы обращаетесь к контексту самого документа. В процессе перебора таблицы МнЧ курсор в объекте документа не двигается (он стоит на первой строке или на той, где был оставлен последним вызовом). Поэтому система раз за разом берет данные из одной и той же строки документа.
Чтобы решить задачу правильно, необходимо добавить нужные данные (Код) в саму таблицу значений МнЧ на этапе ее формирования.
Первым делом нам необходимо найти процедуру, которая создает структуру таблицы для печати. Обычно она называется СоздатьСтруктуру или схожим образом. В ней определяются колонки будущей таблицы.
Нам нужно добавить новую колонку для хранения кода товара. Рассмотрим пример кода:
Процедура СоздатьСтруктуру(МнЧ)
МнЧ = СоздатьОбъект("ТаблицаЗначений");
МнЧ.НоваяКолонка("Цена",);
// ... другие колонки ...
МнЧ.НоваяКолонка("Номенклатура"); // Здесь обычно хранится Наименование (строка)
// Добавляем нашу новую колонку
МнЧ.НоваяКолонка("НоменклатураКод");
// ... продолжение процедуры
КонецПроцедуры
Теперь перейдем к процедурам заполнения таблицы. В конфигурации их может быть несколько для разных ситуаций (например, ПодготовитьМнЧоснУПД, ПодготовитьМнЧУПД и т.д.). Нам нужно найти места, где заполняется колонка Номенклатура, и рядом добавить заполнение нашей новой колонки НоменклатураКод.
Разберем логику заполнения. Данные берутся из ТаблицаОснования (которая содержит выгруженную табличную часть документа) или напрямую из движений регистров/строк документа.
Пример доработки процедуры подготовки данных:
// Внутри цикла перебора строк (Пока ТаблицаОснования.ПолучитьСтроку()=1 Цикл)
// ... существующий код заполнения
МнЧ.Номенклатура = ТаблицаОснования.Номенклатура.ПолнНаименование; // Заполняем наименование
// --- НАШИ ИЗМЕНЕНИЯ ---
// Проверяем, является ли номенклатура справочником и есть ли у нее код
Если (ТипЗначенияСтр(ТаблицаОснования.Номенклатура) = "Справочник") Тогда
If ТаблицаОснования.Номенклатура.Вид() = "Номенклатура" Тогда
// Заполняем кодом
МнЧ.НоменклатураКод = ТаблицаОснования.Номенклатура.Код;
Иначе
// Если это не товар (например, текст), ставим прочерк
МнЧ.НоменклатураКод = "-";
КонецЕсли;
Иначе
МнЧ.НоменклатураКод = "-";
КонецЕсли;
// --- КОНЕЦ ИЗМЕНЕНИЙ ---
Важный момент: Обратите внимание, что в УПД могут попадать услуги, работы или текстовые описания. Для них нужно предусмотреть вывод прочерка или пустой строки, чтобы не возникало ошибок обращения к несуществующим реквизитам.
Если используется распределение по ГТД (когда одна строка товара разбивается на несколько), убедитесь, что при добавлении новых строк в МнЧ (метод МнЧ.НоваяСтрока()) вы также копируете значение кода из исходной строки.
После того как таблица МнЧ сформирована и заполнена, переходим к процедуре непосредственной печати (обычно она называется ПечатьУПД). В этой процедуре происходит перебор строк подготовленной таблицы и вывод их в секции макета.
Нам нужно считать значение из таблицы значений в переменную, которая будет доступна в макете. Рассмотрим пример:
// Цикл печати
Пока МнЧ.ПолучитьСтроку() = 1 Цикл
НомерСтроки = НомерСтроки + 1;
// Получаем данные для вывода в секцию
Наименование = СокрЛП(МнЧ.Номенклатура);
// --- НАШИ ИЗМЕНЕНИЯ ---
// Получаем код из колонки ТЗ, которую мы добавили ранее
ТекКод = СокрЛП(МнЧ.НоменклатураКод);
// Если нужно убрать лидирующие нули (превратить "0000123" в "123")
// Используем форматирование. Но будьте осторожны, если коды содержат буквы!
// Вариант для числовых кодов:
// ТекКод = Формат(МнЧ.НоменклатураКод, "Ч(0)10.0"); // Пример формата
// --- КОНЕЦ ИЗМЕНЕНИЙ ---
// Вывод секции
Таб.ВывестиСекцию("Строка");
КонецЦикла;
Остался последний шаг — визуализация. Откройте макет печатной формы (Таблица) в конфигураторе.
НомерСтроки). Если вы хотите заменить номер на код или добавить код к наименованию, выберите соответствующую ячейку.ТекКод.Если вы хотите вывести код в отдельной колонке, вам, возможно, придется изменить структуру самой печатной формы (раздвинуть или добавить столбцы), но помните, что форма УПД является регламентированной, и серьезные изменения её структуры могут вызвать вопросы у контролирующих органов. Безопаснее выводить код в графе наименования (например: "Код: " + ТекКод + " " + Наименование).
Мы проанализировали процесс доработки печати в 1С 7.7. Главный секрет успеха — работать не с документом напрямую в макете, а подготовить данные в промежуточной таблице значений. Это обеспечивает корректный вывод информации при любых группировках и разбиениях строк.
Краткий чек-лист решения:
МнЧ.НоваяКолонка("НоменклатураКод").МнЧ.НоменклатураКод при переборе строк документа.ТекКод = МнЧ.НоменклатураКод.ТекКод в макете.