При разработке и доработке документов или обработок в платформе 1С часто возникает задача: пользователь выбирает элемент справочника (например, Номенклатура) в табличную часть, и необходимо, чтобы в соседней колонке сразу же отобразился или заполнился его реквизит — Код. Рассмотрим различные способы реализации этой задачи в зависимости от архитектурных требований и типа используемых форм.
Перед тем как приступать к написанию кода, важно определиться с архитектурой данных: требуется ли физически сохранять код в отдельном реквизите табличной части, либо достаточно только отображать его визуально пользователю на форме.
Если код номенклатуры нужен пользователю исключительно для визуального контроля и не участвует в специфических движениях регистров или внешних обменах, дублировать его в реквизиты табличной части не рекомендуется. Это позволяет избежать избыточности (денормализации) данных.
Для управляемых форм:
Разберем по шагам, как настроить отображение без единой строчки программного кода:
ПутьКДанным и укажем путь через точку к реквизиту ссылки: Объект.Товары.Номенклатура.Код (где Товары — имя вашей табличной части).Платформа 1С автоматически считает код выбранной номенклатуры и отобразит его в соответствующей ячейке при выборе строки.
Для обычных форм:
В обычных формах для вычисляемых колонок оптимально использовать событие табличного поля ПриПолученииДанных. В отличие от события ПриВыводеСтроки, данный обработчик принимает массив оформлений строк за один раз, что позволяет значительно оптимизировать быстродействие при скроллинге больших списков.
Посмотрим на пример обработчика:
Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)
Для Каждого Оформление Из ОформленияСтрок Цикл
СтрокаДанных = Оформление.ДанныеСтроки;
Если СтрокаДанных <> Неопределено И ЗначениеЗаполнено(СтрокаДанных.Номенклатура) Тогда
Оформление.Ячейки.Код.Значение = СтрокаДанных.Номенклатура.Код;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Если в табличной части документа создан отдельный реквизит Код, который должен сохраняться в базе данных, заполнение выполняется в обработчике события изменения номенклатуры.
Разберем по шагам реализацию в обычном приложении:
Номенклатура в табличном поле формы.ПриИзменении.Рассмотрим пример кода:
Процедура ТоварыНоменклатураПриИзменении(Элемент)
СтрокаТЧ = ЭлементыФормы.Товары.ТекущиеДанные;
Если СтрокаТЧ <> Неопределено Тогда
Если ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
СтрокаТЧ.Код = СтрокаТЧ.Номенклатура.Код;
Иначе
СтрокаТЧ.Код = "";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В управляемом интерфейсе действуют правила клиент-серверного разделения: на тонком клиенте прямое обращение через точку к реквизитам ссылочных типов (включая СтрокаТЧ.Номенклатура.Код) запрещено платформой, так как это вызывает неявный вызов сервера или ошибку компиляции.
Проанализируем правильный алгоритм решения задачи на управляемых формах:
ПриИзменении поля ввода номенклатуры.Элементы.Товары.ТекущиеДанные.Посмотрим на программную реализацию:
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
СтрокаТЧ = Элементы.Товары.ТекущиеДанные;
Если СтрокаТЧ <> Неопределено Тогда
Если ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
СтрокаТЧ.Код = ПолучитьКодНоменклатуры(СтрокаТЧ.Номенклатура);
Иначе
СтрокаТЧ.Код = "";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьКодНоменклатуры(СсылкаНоменклатура)
Возврат СсылкаНоменклатура.Код;
КонецФункции
При выборе подхода обратите внимание на следующие нюансы:
Номенклатура значение в уже созданных документах останется прежним.ПриИзменении, но и в обработчике переноса позиций из формы подбора в табличную часть.