В процессе работы с базами данных 1С часто возникает ситуация, когда необходимо внести изменения не в один реквизит «шапки», а массово заполнить или обновить табличные части (ТЧ) у множества объектов сразу. Например, у ста различных «Соглашений с клиентами» нужно заполнить «Этапы оплаты», которые остались пустыми после первоначальной загрузки данных. Стандартные инструменты не всегда позволяют гибко выбрать конкретный список объектов и добавить в них строки ТЧ. В этой статье мы разберем несколько эффективных способов решения этой задачи: от простого программного кода до использования продвинутых инструментов разработчика.
Стандартная обработка Групповое изменение реквизитов отлично справляется с заменой значений в полях объекта, но работа с табличными частями в ней ограничена. Часто пользователи сталкиваются с тем, что обработка либо заменяет всю ТЧ целиком, либо требует сложной настройки условий, которые не позволяют просто «добавить» строки в пустые таблицы. Рассмотрим ситуацию, когда у нас есть список из 100 соглашений, выбранных вручную или по сложным критериям, и нам нужно программно заполнить их этапы оплаты.
Самый надежный способ — написать небольшую внешнюю обработку. Рассмотрим базовый алгоритм, который позволяет отобрать нужные объекты и заполнить их табличную часть ЭтапыГрафикаОплаты. Проанализируем пример кода, который решает эту задачу:
// Создаем запрос для получения ссылок на объекты
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка
|ИЗ
| Справочник.СоглашенияСКлиентами
|ГДЕ
| НЕ ПометкаУдаления
| И Ссылка В (&СписокСоглашений)"; // Параметр для точного отбора
Запрос.УстановитьПараметр("СписокСоглашений", Объект.СписокВыбранныхСсылок);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Получаем объект для редактирования
ОбъектСоглашение = Выборка.Ссылка.ПолучитьОбъект();
// Добавляем новую строку в табличную часть
НовСтр = ОбъектСоглашение.ЭтапыГрафикаОплаты.Добавить();
НовСтр.ВариантОплаты = Перечисления.ВариантыОплатыКлиентом.АвансДоОбеспечения;
НовСтр.Сдвиг = 1;
НовСтр.ПроцентПлатежа = 100;
// Пытаемся записать изменения
Попытка
ОбъектСоглашение.Записать();
Исключение
Сообщить("Ошибка при записи объекта " + Выборка.Ссылка + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
В этом коде мы используем метод ПолучитьОбъект(), так как менять данные можно только у объекта, а не у ссылки. Метод Добавить() создает новую строку в ТЧ, после чего мы заполняем её реквизиты и сохраняем изменения методом Записать().
Если нам нужно выбрать не «все соглашения», а конкретные 10, 20 или 45 штук, программный запрос с жестким фильтром не подойдет. Выясним, как реализовать удобный пользовательский интерфейс для такой задачи. На форме обработки рекомендуется создать реквизит с типом СписокЗначений (тип данных — нужный справочник). Разберем шаги настройки:
СправочникСсылка.СоглашенияСКлиентами.МножественныйВыбор.После того как пользователь наполнил список, мы передаем этот список в запрос через условие ГДЕ Ссылка В (&Список). Это позволяет точечно обрабатывать только те элементы, которые были отобраны визуально.
Мало кто знает, что стандартная обработка Групповое изменение реквизитов в современных конфигурациях на базе БСП (Библиотека стандартных подсистем) имеет скрытый потенциал. Если в форме обработки зайти в меню «Дополнительные параметры», можно включить режим разработчика.
В этом режиме появляется возможность выполнять произвольный алгоритм на встроенном языке прямо в окне обработки. Это избавляет от необходимости создавать файл .epf. Проанализируем, как это работает: обработка находит объекты по вашему фильтру, а в поле «Выполнить код» вы пишете логику работы с табличной частью, используя переменную Объект.
Когда речь идет о сотнях или тысячах элементов, процесс может затянуться из-за срабатывания различных проверок в модулях объекта (например, проверка заполнения, контроль прав, подписки на события). Чтобы ускорить выполнение, рассмотрим использование специального свойства:
ОбъектСоглашение.ОбменДанными.Загрузка = Истина;
ОбъектСоглашение.Записать();
Установка флага ОбменДанными.Загрузка = Истина отключает большинство прикладных проверок в процедурах ПередЗаписью и ПриЗаписи. Это значительно повышает скорость работы, однако этот метод следует использовать осторожно, так как он позволяет записать данные, которые могут нарушать бизнес-логику системы.
Если задача массового изменения ТЧ возникает регулярно, стоит обратить внимание на профессиональный пакет Инструменты разработчика. В его составе есть мощная групповая обработка объектов. Рассмотрим её преимущества:
Мы проанализировали ситуацию и пришли к выводу, что для разовых задач по заполнению пустых табличных частей эффективнее всего написать простую обработку с циклом Для Каждого по списку значений. Если же требуется регулярная сложная модификация данных, лучше освоить режим разработчика в типовой групповой обработке или воспользоваться внешними инструментами автоматизации. Всегда выполняйте такие операции сначала на копии базы, чтобы убедиться в корректности заполнения всех реквизитов табличной части.