При оформлении витрин розничных магазинов часто возникает необходимость вывести на ценник дополнительную информацию о товаре, которая хранится в реквизите Комментарий карточки номенклатуры. В типовой конфигурации «1С:Торговля и Склад 9.2» на платформе 1С 7.7 стандартный ценник содержит лишь базовые реквизиты: наименование, артикул, цену и единицу измерения.
В данной статье мы подробно разберем, как доработать печатную форму ценника двумя способами: простым слиянием строк и профессиональным методом — выводом комментария в отдельную ячейку таблицы с возможностью индивидуального оформления размера и начертания шрифта. Также мы проанализируем частые ошибки, возникающие при модернизации кода, включая проблему с неработающей кнопкой печати при выборе товаров галочками.
Если перед нами не стоит задача изменять размер шрифта комментария отдельно от наименования товара, мы можем использовать самый простой путь — программно объединить эти строки. Рассмотрим, как это сделать в коде обработки.
Откроем нашу обработку печати ценников (обычно это внешний отчет с расширением .ert, например, PrPrice.ert) в режиме Конфигуратора. Перейдем во вкладку «Модуль» и найдем процедуру ДобавитьВтаблицу. Внутри этой процедуры найдем строку, отвечающую за присвоение наименования:
Табл.Товар = СокрЛП(Товар.ПолнНаименование) + ?(Константа.ПоказыватьАртикул = 1, " " + СокрЛП(Товар.Артикул), "");
Для того чтобы комментарий выводился сразу за наименованием, мы можем модифицировать эту строку следующим образом:
Табл.Товар = СокрЛП(Товар.ПолнНаименование) + ?(Константа.ПоказыватьАртикул = 1, " " + СокрЛП(Товар.Артикул), "") + " " + СокрЛП(Товар.Комментарий);
Если мы хотим, чтобы комментарий печатался с новой строки внутри той же самой ячейки, воспользуемся предопределенной конструкцией языка РазделительСтрок. Перепишем наше выражение:
Табл.Товар = СокрЛП(Товар.ПолнНаименование) + ?(Константа.ПоказыватьАртикул = 1, " " + СокрЛП(Товар.Артикул), "") + РазделительСтрок + СокрЛП(Товар.Комментарий);
Важное примечание: при использовании разделителя строк нам обязательно придется зайти в макет ценника и увеличить высоту ячейки, в которую выводится товар, иначе нижняя часть текста (сам комментарий) просто скроется за границами рамки.
Этот метод более гибкий и правильный. Он позволяет сделать дизайн ценника эстетичным: например, вывести название товара крупным жирным шрифтом, а техническое описание из комментария — мелким курсивом. Для реализации этого подхода нам потребуется отредактировать структуру таблицы значений, параметры процедур вывода и сам графический макет ценника. Разберем весь процесс по шагам.
В платформе 1С 7.7 перед выводом на печать список выбранных товаров компонуется в объект типа ТаблицаЗначений. Найдем в модуле формы процедуру ПриОткрытии. В ней происходит инициализация этой таблицы. Нам необходимо добавить новую колонку под комментарий:
ТабТоваров = СоздатьОбъект("ТаблицаЗначений");
ТабТоваров.НоваяКолонка("Товар");
ТабТоваров.НоваяКолонка("Цена","Число");
ТабТоваров.НоваяКолонка("Единица");
ТабТоваров.НоваяКолонка("Валюта");
// Добавляем новую колонку для хранения комментария номенклатуры:
ТабТоваров.НоваяКолонка("Комментарий");
Теперь перейдем в процедуру ДобавитьВтаблицу, которая отвечает за непосредственное добавление строк в нашу таблицу значений. Нам нужно считать реквизит Комментарий из карточки товара и записать его в только что созданную колонку таблицы:
Процедура ДобавитьВтаблицу(Табл, Товар, Тип)
Перем ВремЦена, ВремЕдиница, ВремВалюта;
Если глВернутьЦену(Товар, Тип, РабочаяДата, ВремЦена, ВремЕдиница, ВремВалюта) = 1 Тогда
Табл.НоваяСтрока();
Табл.Товар = СокрЛП(Товар.ПолнНаименование) + ?(Константа.ПоказыватьАртикул = 1, " " + СокрЛП(Товар.Артикул), "");
Табл.Цена = ВремЦена;
Табл.Валюта = ВремВалюта;
Табл.Единица = ВремЕдиница;
// Заполняем комментарий, очищая его от лишних пробелов:
Табл.Комментарий = СокрЛП(Товар.Комментарий);
Иначе
Сообщить("У товара """ + Товар.ПолнНаименование + """ отсутствует цена """ + Тип + """");
КонецЕсли;
КонецПроцедуры
За вывод каждой отдельной этикетки отвечает процедура ДобавитьЦенник. Нам нужно передать в нее новое значение. Найдем заголовок этой процедуры и добавим параметр ПечКомментарий:
Процедура ДобавитьЦенник(Таб, ПечФирма, ПечНаименование, ПечЕдиница, ПечРозн, ПечКомментарий, Столбик, Ряд)
Обратите внимание, что порядок передачи параметров очень важен! Если мы добавим параметр в середину списка, то при вызове процедуры возникнет путаница в переменных. Рекомендуется добавлять новые переменные ближе к концу списка, перед системными координатами Столбик и Ряд.
Теперь найдем процедуру Сформировать. В ней происходит обход заполненной таблицы товаров в цикле и вызов печати для каждой строки. Нам нужно передать значение из новой колонки Комментарий в процедуру ДобавитьЦенник. Модернизируем этот участок кода:
Процедура Сформировать(ТаблицаТоваров, ПечФирма)
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
Столбик = 1;
Ряд = 0;
ТаблицаТоваров.ВыбратьСтроки();
Пока ТаблицаТоваров.ПолучитьСтроку() = 1 Цикл
ПечРозн = глФРМ(ТаблицаТоваров.Price, ТаблицаТоваров.Валюта); // Форматируем цену
// Передаем параметр ТаблицаТоваров.Комментарий на шестую позицию вызова:
ДобавитьЦенник(Таб, ПечФирма, ТаблицаТоваров.Товар, ТаблицаТоваров.Единица, ПечРозн, ТаблицаТоваров.Комментарий, Столбик, Ряд);
глОживить(1);
КонецЦикла;
Таб.Опции(0,0,0,0,"ПечатьЦенников","ПечатьЦенников");
Таб.ТолькоПросмотр(1);
Таб.Показать("Товарные ценники","");
КонецПроцедуры
Важно: если при запуске отчета вы получаете ошибку {...}: Недостаточно фактических параметров, это означает, что вы обновили объявление процедуры ДобавитьЦенник в шаге 3, но забыли обновить её вызов в шаге 4 (или наоборот). Количество переменных в объявлении и вызове должно строго совпадать.
После внесения изменений в программный код необходимо подготовить макет таблицы для приема новых данных. Выполним следующие действия:
Товар|Ценник).ПечКомментарий.Сохраним изменения в обработке и проверим результат в режиме «1С:Предприятие». Теперь комментарий выводится в собственной ячейке с заданным нами стилем оформления.
Очень часто после самостоятельного редактирования программного кода пользователи сталкиваются с тем, что в форме подбора товаров отметка позиций «галочками» происходит успешно, но при нажатии на кнопку «Печать» ничего не происходит или печатная форма выходит пустой. Проанализируем причины этой проблемы и пути ее решения.
Интерфейс подбора в 1С 7.7 устроен так, что визуальная таблица на форме связана с программным объектом ТаблицаЗначений. Если при добавлении колонки Комментарий в процедуре ПриОткрытии вы случайно удалили или переставили местами системные колонки, связь формы и модуля нарушается.
Проверим наличие и правильность объявления колонки флага (печати). В начале процедуры ПриОткрытии инициализация таблицы должна выглядеть следующим образом:
ТабТоваров.НоваяКолонка("Печать", "Число", 1); // Колонка для хранения отметки (галочки)
Дважды кликнем по табличной части на форме обработки в режиме дизайна. Убедимся, что у колонки с галочками в свойствах указан правильный идентификатор связи, совпадающий с именем колонки в коде (например, Печать или Флаг).
Если товары выбираются выборочно галочками, то в процедуре формирования отчета обязательно должен присутствовать фильтр, отсекающий неотмеченные позиции. Убедимся, что цикл обхода строк выглядит именно так:
ТаблицаТоваров.ВыбратьСтроки();
Пока ТаблицаТоваров.ПолучитьСтроку() = 1 Цикл
// Проверяем, отмечена ли строка галочкой (значение должно быть равно 1)
Если ТаблицаТоваров.Печать = 1 Тогда
ПечРозн = глФРМ(ТаблицаТоваров.Цена, ТаблицаТоваров.Валюта);
ДобавитьЦенник(Таб, ПечФирма, ТаблицаТоваров.Товар, ТаблицаТоваров.Единица, ПечРозн, ТаблицаТоваров.Комментарий, Столбик, Ряд);
КонецЕсли;
КонецЦикла;
Если условие Если ТаблицаТоваров.Печать = 1 Тогда отсутствует, программа попытается распечатать вообще все строки из таблицы, включая те, по которым не установлена цена, что может привести к аварийной остановке выполнения кода. Если же имя колонки в условии не совпадает с реальным именем колонки отметки на форме, то условие всегда будет ложным, и ни один ценник не отправится на печать.
Используя приведенные инструкции, мы сможем гибко управлять внешним видом ценников в системе 1С 7.7, адаптируя печатные формы под любые требования розничной торговли.