Как связать вкладку товаров с детальной вкладкой характеристик в форме 1С

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

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

Выбор события формы для подгрузки данных

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

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

На практике наиболее удобным для пользователя является обработчик ПриАктивизацииСтроки. Однако, если при смене строки выполнять тяжелые серверные запросы, интерфейс может начать "притормаживать" при быстром перемещении по таблице стрелками на клавиатуре.

Оптимизация с помощью обработчика ожидания

Чтобы избежать лишней нагрузки на сервер при частой смене строк, проанализируем паттерн отложенного вызова с помощью метода ПодключитьОбработчикОжидания(). Схема работы выглядит следующим образом:

  1. В обработчике ПриАктивизацииСтроки проверяем, действительно ли изменилась текущая строка (сравниваем текущую строку с сохраненным в переменной формы предыдущим значением).
  2. Если строка сменилась, отключаем предыдущий и подключаем новый однократный обработчик ожидания с задержкой 0.1–0.3 секунды.
  3. Серверный вызов для чтения или заполнения характеристик выполняется только после того, как пользователь остановил выбор на конкретной позиции.

Связывание строк с помощью уникального идентификатора

Выясним, как правильно сопоставить данные на двух вкладках. Связывать характеристики просто по ссылке на номенклатуру — некорректно, так как в таблице товаров один и тот же товар может встречаться несколько раз (например, с разными ценами или в разных партиях).

Правильный подход — использование уникального идентификатора строки табличной части. Для получения идентификатора строки применяется метод ПолучитьИдентификатор().

Рассмотрим порядок организации хранения данных на форме:

  1. В подчиненной таблице характеристик на форме (типа ДанныеФормыКоллекция) предусматриваем числовую колонку ИдентификаторСтрокиТовара.
  2. При добавлении нового товара в основную таблицу считываем идентификатор созданной строки и присваиваем его связанным записям характеристик.
  3. При активизации строки в первой таблице устанавливаем отбор во второй таблице по значению ИдентификаторСтрокиТовара.

Способы реализации связи между вкладками

В зависимости от структуры данных и требований к редактированию можно использовать один из следующих проверенных способов:

Вариант 1. Использование одной полной таблицы на форме с отбором строк

На форме создаются две таблицы: основная (товары) и скрытая общая таблица характеристик для всех позиций документа. На второй вкладке выводится отображаемая таблица характеристик.

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


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

Вариант 2. Использование динамического списка для режима "только чтение"

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

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

Вариант 3. Покомпонентный ввод через поля формы и временную структуру

Если на второй вкладке располагаются отдельные поля ввода (например, "Процессор", "Объем ОЗУ", "Серийный номер"), то при переключении между строками значения этих полей должны считываться и записываться во временный реквизит формы (типа Соответствие или Структура), где ключом выступает идентификатор строки товара.

При окончательном сохранении документа (в обработчике ПередЗаписью на сервере) временная структура разбирается и данные записываются в соответствующие табличные части, справочники или регистры.

Безопасность данных при отмене изменений

Важный момент: не следует записывать изменения характеристик напрямую в базу данных в момент редактирования полей на форме. Если пользователь внесет правки в характеристики, а затем закроет документ без сохранения (нажмет кнопку "Закрыть" или "Отмена"), напрямую записанные данные останутся в базе, что нарушит целостность учетной системы. Все изменения должны накапливаться в контексте формы (ДанныеФормыСтруктура или ДанныеФормыКоллекция) и фиксироваться в базе данных строго при записи самого документа.

← На главную