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