Как реализовать автоматическое отображение артикула в табличной части документа в 1С:УПП 1.3

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

В конфигурации «Управление производственным предприятием» (УПП) редакции 1.3 часто возникает задача сделать интерфейс более информативным для пользователя. Одной из популярных задач является вывод артикула номенклатуры в табличную часть документа (например, в «Заказ покупателя» или «Реализацию товаров и услуг»). Поскольку в обычных формах нельзя просто пробросить путь к данным через точку в свойствах колонки (как это делается в управляемых формах), нам необходимо использовать программные методы. Разберем подробно, как это реализовать.

Постановка задачи и выбор стратегии

Прежде чем переходить к коду, проанализируем ситуацию. У нас есть два пути решения проблемы:

  1. Динамическое отображение: Мы не создаем новый реквизит в базе данных, а просто «рисуем» текст артикула в колонке при отрисовке формы. Это экономит место в базе, но создает нагрузку на систему при прокрутке списка.
  2. Физическое хранение: Мы добавляем реквизит Артикул непосредственно в табличную часть документа. Значение заполняется один раз при выборе номенклатуры и сохраняется вместе с документом.

Рассмотрим оба варианта, так как в типовых решениях УПП 1.3 чаще всего используется именно динамическое отображение для колонок «Код» или «Артикул».

Вариант 1: Использование события ПриВыводеСтроки

Этот метод является классическим для обычных форм 1С. Событие ПриВыводеСтроки срабатывает каждый раз, когда строка табличного поля появляется на экране или обновляется. Это позволяет нам программно подставить текст в любую ячейку.

Выполним следующие шаги:

  1. Откроем форму документа в конфигураторе.
  2. Добавим в табличную часть (элемент управления на форме) новую колонку. Назовем её Артикул. Важно: свойство Данные у этой колонки оставляем пустым, так как мы будем заполнять её вручную.
  3. В свойствах табличного поля найдем событие ПриВыводеСтроки и создадим его обработчик.

Разберем пример кода, который позволит нам вывести значение:


Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    
    // Проверяем, что в строке выбрана номенклатура
    Если ЗначениеЗаполнено(ДанныеСтроки.Номенклатура) Тогда
        
        // Получаем артикул через общий модуль. 
        // Это более эффективно, чем обращение через точку, если используется кэширование
        АртикулТекст = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ДанныеСтроки.Номенклатура, "Артикул");
        
        // Устанавливаем текст в ячейку "Артикул"
        ОформлениеСтроки.Ячейки.Артикул.УстановитьТекст(АртикулТекст);
        
    КонецЕсли;

КонецПроцедуры

Важный нюанс: Использование функции ОбщегоНазначения.ПолучитьЗначениеРеквизита в этом событии может привести к замедлению работы интерфейса, если строк в документе очень много, так как на каждую отрисовываемую строку будет выполняться отдельный запрос к базе данных. Чтобы этого избежать, профессионалы рекомендуют использовать событие ПриПолученииДанных.

Вариант 2: Оптимизация через событие ПриПолученииДанных

Рассмотрим более продвинутый способ. В отличие от предыдущего метода, событие ПриПолученииДанных позволяет получить информацию сразу для всего набора видимых на экране строк одним запросом. Это значительно повышает производительность системы.

Проанализируем пример реализации такого подхода:


Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)
    
    // Создадим соответствие для связи Номенклатуры и Артикула
    СоответствиеНоменклатуры = Новый Соответствие;
    СписокНоменклатуры = Новый СписокЗначений;
    
    // Собираем всю номенклатуру из видимых строк
    Для Каждого Оформление Из ОформленияСтрок Цикл
        Если ЗначениеЗаполнено(Оформление.ДанныеСтроки.Номенклатура) Тогда
            СписокНоменклатуры.Добавить(Оформление.ДанныеСтроки.Номенклатура);
        КонецЕсли;
    КонецЦикла;
    
    // Одним запросом получаем артикулы для всего списка
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |   Номенклатура.Ссылка КАК Ссылка,
    |   Номенклатура.Артикул КАК Артикул
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |   Номенклатура.Ссылка В (&СписокНоменклатуры)";
    
    Запрос.УстановитьПараметр("СписокНоменклатуры", СписокНоменклатуры);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        СоответствиеНоменклатуры.Вставить(Выборка.Ссылка, Выборка.Артикул);
    КонецЦикла;
    
    // Расставляем полученные данные по ячейкам
    Для Каждого Оформление Из ОформленияСтрок Цикл
        ТекАртикул = СоответствиеНоменклатуры.Получить(Оформление.ДанныеСтроки.Номенклатура);
        Если ТекАртикул  Неопределено Тогда
            Оформление.Ячейки.Артикул.УстановитьТекст(ТекАртикул);
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры

Вариант 3: Хранение артикула в реквизите ТЧ

Если вам необходимо выводить артикул в сложные печатные формы или отчеты, не прибегая к соединениям со справочником «Номенклатура», или если вы хотите разрешить пользователям вручную корректировать артикул в документе, выберите этот путь.

Разберем шаги реализации:

  1. В конфигураторе добавьте реквизит Артикул (тип Строка) в табличную часть Товары вашего документа.
  2. Вынесите этот реквизит на форму. Теперь свойство Данные колонки будет связано с реквизитом ТЧ.
  3. Найдите событие НоменклатураПриИзменении в табличной части на форме. Нам нужно, чтобы при выборе товара артикул подтягивался автоматически.

Пример кода для автоматического заполнения при выборе номенклатуры:


Процедура ТоварыНоменклатураПриИзменении(Элемент)
    
    СтрокаТЧ = ЭлементыФормы.Товары.ТекущиеДанные;
    
    Если СтрокаТЧ  Неопределено И ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
        // Заполняем реквизит "Артикул" в строке табличной части
        СтрокаТЧ.Артикул = ОбщегоНазначения.ПолучитьЗначениеРеквизита(СтрокаТЧ.Номенклатура, "Артикул");
    Иначе
        СтрокаТЧ.Артикул = "";
    КонецЕсли;
    
КонецПроцедуры

Использование типовых механизмов УПП 1.3

Выясним, как это реализовано в стандартных документах УПП, таких как «Поступление товаров и услуг». В УПП существует глобальная настройка пользователя «Показывать артикул». Если вы хотите, чтобы ваш документ вел себя как типовой, следует добавить проверку этой настройки.

Проанализируем ситуацию: в типовых документах часто вызывается процедура РаботаСДиалогами.ПоказатьКодАртикул. Она автоматически определяет, что нужно выводить (Код или Артикул) на основе настроек пользователя и параметров учета.

Пример вызова типовой функции в обработчике ПриВыводеСтроки:


Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    // мКолонкиТовары - это структура, которая обычно инициализируется при открытии формы
    РаботаСДиалогами.ПоказатьКодАртикул(мКолонкиТовары, ОформлениеСтроки.Ячейки, ДанныеСтроки.Номенклатура);
КонецПроцедуры

Для корректной работы этой функции в переменной мКолонкиТовары должны быть предопределенные настройки видимости колонок. Если вы создаете свой документ «с нуля», проще воспользоваться первым или вторым вариантом, описанным выше.

Рекомендации по отладке

Если вы написали код, но колонка остается пустой, выполните следующие проверки:

Мы рассмотрели различные способы вывода артикула в табличную часть. Для простых задач идеально подходит ПриВыводеСтроки, а для высоконагруженных документов с большим количеством строк лучше использовать ПриПолученииДанных или прямое хранение реквизита в документе.

← На главную