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

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

В процессе работы с базами данных 1С часто возникает ситуация, когда необходимо внести изменения не в один реквизит «шапки», а массово заполнить или обновить табличные части (ТЧ) у множества объектов сразу. Например, у ста различных «Соглашений с клиентами» нужно заполнить «Этапы оплаты», которые остались пустыми после первоначальной загрузки данных. Стандартные инструменты не всегда позволяют гибко выбрать конкретный список объектов и добавить в них строки ТЧ. В этой статье мы разберем несколько эффективных способов решения этой задачи: от простого программного кода до использования продвинутых инструментов разработчика.

Проблема массового заполнения табличных частей

Стандартная обработка Групповое изменение реквизитов отлично справляется с заменой значений в полях объекта, но работа с табличными частями в ней ограничена. Часто пользователи сталкиваются с тем, что обработка либо заменяет всю ТЧ целиком, либо требует сложной настройки условий, которые не позволяют просто «добавить» строки в пустые таблицы. Рассмотрим ситуацию, когда у нас есть список из 100 соглашений, выбранных вручную или по сложным критериям, и нам нужно программно заполнить их этапы оплаты.

Способ 1. Программное заполнение через запрос и цикл

Самый надежный способ — написать небольшую внешнюю обработку. Рассмотрим базовый алгоритм, который позволяет отобрать нужные объекты и заполнить их табличную часть ЭтапыГрафикаОплаты. Проанализируем пример кода, который решает эту задачу:


// Создаем запрос для получения ссылок на объекты
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Ссылка
    |ИЗ
    |   Справочник.СоглашенияСКлиентами
    |ГДЕ
    |   НЕ ПометкаУдаления
    |   И Ссылка В (&СписокСоглашений)"; // Параметр для точного отбора

Запрос.УстановитьПараметр("СписокСоглашений", Объект.СписокВыбранныхСсылок);

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    // Получаем объект для редактирования
    ОбъектСоглашение = Выборка.Ссылка.ПолучитьОбъект();
    
    // Добавляем новую строку в табличную часть
    НовСтр = ОбъектСоглашение.ЭтапыГрафикаОплаты.Добавить();
    НовСтр.ВариантОплаты = Перечисления.ВариантыОплатыКлиентом.АвансДоОбеспечения;
    НовСтр.Сдвиг = 1;
    НовСтр.ПроцентПлатежа = 100;
    
    // Пытаемся записать изменения
    Попытка
        ОбъектСоглашение.Записать();
    Исключение
        Сообщить("Ошибка при записи объекта " + Выборка.Ссылка + ": " + ОписаниеОшибки());
    КонецПопытки;
КонецЦикла;

В этом коде мы используем метод ПолучитьОбъект(), так как менять данные можно только у объекта, а не у ссылки. Метод Добавить() создает новую строку в ТЧ, после чего мы заполняем её реквизиты и сохраняем изменения методом Записать().

Способ 2. Интерактивный отбор элементов

Если нам нужно выбрать не «все соглашения», а конкретные 10, 20 или 45 штук, программный запрос с жестким фильтром не подойдет. Выясним, как реализовать удобный пользовательский интерфейс для такой задачи. На форме обработки рекомендуется создать реквизит с типом СписокЗначений (тип данных — нужный справочник). Разберем шаги настройки:

  1. Добавим на форму таблицу, связанную со списком значений.
  2. В свойствах списка укажем тип значения — СправочникСсылка.СоглашенияСКлиентами.
  3. Используем стандартную команду «Подбор» или добавим кнопку, которая вызывает форму выбора справочника с флагом МножественныйВыбор.

После того как пользователь наполнил список, мы передаем этот список в запрос через условие ГДЕ Ссылка В (&Список). Это позволяет точечно обрабатывать только те элементы, которые были отобраны визуально.

Способ 3. Использование режима разработчика в стандартных обработках

Мало кто знает, что стандартная обработка Групповое изменение реквизитов в современных конфигурациях на базе БСП (Библиотека стандартных подсистем) имеет скрытый потенциал. Если в форме обработки зайти в меню «Дополнительные параметры», можно включить режим разработчика.

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

Оптимизация процесса записи данных

Когда речь идет о сотнях или тысячах элементов, процесс может затянуться из-за срабатывания различных проверок в модулях объекта (например, проверка заполнения, контроль прав, подписки на события). Чтобы ускорить выполнение, рассмотрим использование специального свойства:


ОбъектСоглашение.ОбменДанными.Загрузка = Истина;
ОбъектСоглашение.Записать();

Установка флага ОбменДанными.Загрузка = Истина отключает большинство прикладных проверок в процедурах ПередЗаписью и ПриЗаписи. Это значительно повышает скорость работы, однако этот метод следует использовать осторожно, так как он позволяет записать данные, которые могут нарушать бизнес-логику системы.

Инструменты разработчика (Tormozit)

Если задача массового изменения ТЧ возникает регулярно, стоит обратить внимание на профессиональный пакет Инструменты разработчика. В его составе есть мощная групповая обработка объектов. Рассмотрим её преимущества:

Резюме и рекомендации

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

← На главную