Как автоматически заполнять код номенклатуры при ее выборе в табличной части 1С?

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

При разработке и доработке документов или обработок в платформе 1С часто возникает задача: пользователь выбирает элемент справочника (например, Номенклатура) в табличную часть, и необходимо, чтобы в соседней колонке сразу же отобразился или заполнился его реквизит — Код. Рассмотрим различные способы реализации этой задачи в зависимости от архитектурных требований и типа используемых форм.

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

Вариант 1. Только отображение кода без сохранения в базу данных

Если код номенклатуры нужен пользователю исключительно для визуального контроля и не участвует в специфических движениях регистров или внешних обменах, дублировать его в реквизиты табличной части не рекомендуется. Это позволяет избежать избыточности (денормализации) данных.

Для управляемых форм:

Разберем по шагам, как настроить отображение без единой строчки программного кода:

  1. Откроем форму в конфигураторе и перейдем к элементам табличной части.
  2. Добавим новую колонку (поле ввода или поле надписи).
  3. В палитре свойств элемента найдем свойство ПутьКДанным и укажем путь через точку к реквизиту ссылки: Объект.Товары.Номенклатура.Код (где Товары — имя вашей табличной части).

Платформа 1С автоматически считает код выбранной номенклатуры и отобразит его в соответствующей ячейке при выборе строки.

Для обычных форм:

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

Посмотрим на пример обработчика:


Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)
    Для Каждого Оформление Из ОформленияСтрок Цикл
        СтрокаДанных = Оформление.ДанныеСтроки;
        Если СтрокаДанных <> Неопределено И ЗначениеЗаполнено(СтрокаДанных.Номенклатура) Тогда
            Оформление.Ячейки.Код.Значение = СтрокаДанных.Номенклатура.Код;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Вариант 2. Заполнение отдельного реквизита в обычных формах

Если в табличной части документа создан отдельный реквизит Код, который должен сохраняться в базе данных, заполнение выполняется в обработчике события изменения номенклатуры.

Разберем по шагам реализацию в обычном приложении:

  1. Откроем свойства колонки Номенклатура в табличном поле формы.
  2. Создадим обработчик события ПриИзменении.
  3. В контексте формы обратимся к текущей строке и считаем код выбранной ссылки напрямую.

Рассмотрим пример кода:


Процедура ТоварыНоменклатураПриИзменении(Элемент)
    СтрокаТЧ = ЭлементыФормы.Товары.ТекущиеДанные;
    Если СтрокаТЧ <> Неопределено Тогда
        Если ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
            СтрокаТЧ.Код = СтрокаТЧ.Номенклатура.Код;
        Иначе
            СтрокаТЧ.Код = "";
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Вариант 3. Заполнение отдельного реквизита в управляемых формах

В управляемом интерфейсе действуют правила клиент-серверного разделения: на тонком клиенте прямое обращение через точку к реквизитам ссылочных типов (включая СтрокаТЧ.Номенклатура.Код) запрещено платформой, так как это вызывает неявный вызов сервера или ошибку компиляции.

Проанализируем правильный алгоритм решения задачи на управляемых формах:

  1. На клиенте перехватываем событие ПриИзменении поля ввода номенклатуры.
  2. Получаем текущую строку через Элементы.Товары.ТекущиеДанные.
  3. Вызываем легковесную серверную функцию (без контекста формы), которая считывает код по переданной ссылке.
  4. Записываем полученный результат в реквизит текущей строки.

Посмотрим на программную реализацию:


&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    СтрокаТЧ = Элементы.Товары.ТекущиеДанные;
    Если СтрокаТЧ <> Неопределено Тогда
        Если ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
            СтрокаТЧ.Код = ПолучитьКодНоменклатуры(СтрокаТЧ.Номенклатура);
        Иначе
            СтрокаТЧ.Код = "";
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьКодНоменклатуры(СсылкаНоменклатура)
    Возврат СсылкаНоменклатура.Код;
КонецФункции

Важные особенности и рекомендации

При выборе подхода обратите внимание на следующие нюансы:

  1. Актуальность данных: если вы сохраняете код в табличную часть, помните, что при последующем переименовании или изменении кода в справочнике Номенклатура значение в уже созданных документах останется прежним.
  2. Подбор товаров: если в документе используется внешняя форма подбора, код необходимо заполнять не только в событии ПриИзменении, но и в обработчике переноса позиций из формы подбора в табличную часть.
← На главную