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

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

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

Этап 1. Открытие формы справочника для выбора

Для начала нам нужно инициировать процесс подбора. Рассмотрим код, который должен располагаться в модуле формы документа. Самое важное здесь — не просто открыть список справочника, а указать системе, что форма открывается в режиме выбора и у неё есть «владелец». Проанализируем пример кода для кнопки:


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

Обратим внимание на параметр ЭтаФорма. Именно благодаря ему, когда пользователь дважды кликнет по элементу в справочнике или нажмет кнопку «Выбрать», система «поймет», куда нужно отправить результат выбора. Если этого не сделать, справочник просто закроется (или останется открытым), но документ не получит никаких данных.

Этап 2. Перехват выбора в документе

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

Нам необходимо получить ссылку на выбранную акцию, прочитать её табличную часть (например, она называется Состав) и в цикле добавить эти строки в наш документ. Выясним, как это выглядит в коде:


Процедура ОбработкаВыбора(ЗначениеВыбора, Источник)
    // Сначала проверим, что нам пришла именно ссылка на справочник "Акции"
    Если ТипЗнч(ЗначениеВыбора) = Тип("СправочникСсылка.Акции") Тогда
        
        // Разберем ситуацию: нужно ли нам очищать старые строки в документе?
        // Если да, используем метод Очистить()
        // Товары.Очистить(); 
        
        // Теперь пройдемся циклом по табличной части выбранной акции
        Для Каждого СтрокаИзАкции Из ЗначениеВыбора.Состав Цикл
            
            // Добавляем новую строку в табличную часть документа "Товары"
            НоваяСтрока = Товары.Добавить();
            
            // Заполняем реквизиты новой строки данными из акции
            НоваяСтрока.Номенклатура = СтрокаИзАкции.Номенклатура;
            НоваяСтрока.Количество   = СтрокаИзАкции.Количество;
            НоваяСтрока.Цена         = СтрокаИзАкции.Цена;
            
            // Если в документе есть Сумма, ее нужно рассчитать
            НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
            
        КонецЦикла;
        
        // Опционально: сообщим пользователю об успешном заполнении
        Сообщить("Данные по акции '" + ЗначениеВыбора + "' успешно перенесены.");
        
    КонецЕсли;
КонецПроцедуры

Этап 3. Оптимизация с использованием ЗаполнитьЗначенияСвойств

Если в табличных частях справочника и документа много колонок с одинаковыми именами (например, Номенклатура, ЕдиницаИзмерения, Характеристика и т.д.), прописывать каждую строку вручную утомительно и чревато ошибками. Посмотрим на пример использования метода ЗаполнитьЗначенияСвойств, который значительно упрощает жизнь разработчику.

Этот метод ищет свойства с одинаковыми именами у объекта-источника и объекта-приемника и копирует значения между ними. Проанализируем оптимизированный цикл:


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

Этап 4. Важные нюансы обычного приложения

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

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

Этап 5. Настройка на стороне справочника

В некоторых случаях стандартного поведения формы списка недостаточно. Рассмотрим ситуацию, когда в справочнике «Акции» нужно не просто выбрать элемент, а выполнить какую-то предварительную проверку. Хотя автор вопроса справился с открытием формы, полезно знать, что в самой форме справочника (в модуле формы списка) можно явно вызвать выбор:


Процедура СписокПриВыборе(Элемент, ВыбраннаяСтрока, СтандартнаяОбработка)
    // Если мы хотим какую-то особую логику перед закрытием формы выбора
    // СтандартнаяОбработка = Ложь;
    // ОповеститьОВыборе(ВыбраннаяСтрока);
КонецПроцедуры

Однако в 90% случаев стандартного механизма РежимВыбора = Истина достаточно, и управление успешно передается в документ через ЗначениеВыбора.

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

← На главную