Как правильно изменить элементы справочника, выбранные в списке значений, без открытия формы?

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

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

Почему не стоит использовать открытие формы элемента?

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

Использование метода ПолучитьОбъект() для изменения данных

Для внесения изменений в справочник программно необходимо работать не с формой, а непосредственно с объектом базы данных. Разберем по шагам, как это реализовать:

  1. Получаем ссылку на элемент справочника из списка.
  2. С помощью метода ПолучитьОбъект() переводим ссылку в объектную модель (СправочникОбъект).
  3. Устанавливаем необходимые значения реквизитов объекта.
  4. Вызываем метод Записать() для сохранения изменений в базе данных.

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


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

Важные нюансы работы со списками

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

Рассмотрим разницу в коде:


// Получит все элементы, добавленные в список
МассивВсех = Объект.Хранилище.ВыгрузитьЗначения();

// Получит только те, у которых установлена пометка (галочка)
МассивОтмеченных = Объект.Хранилище.ОтмеченныеЭлементы();

Рекомендации по оптимизации массовых операций

Если вы обрабатываете большое количество объектов, примите во внимание следующие рекомендации:

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


НачатьТранзакцию();
Попытка
    Для Каждого Элемент Из МассивОтмеченных Цикл
        // Логика изменения объекта
        ОбъектСправочника = Элемент.ПолучитьОбъект();
        // ... установка свойств ...
        ОбъектСправочника.Записать();
    КонецЦикла;
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    // Обработка ошибки
КонецПопытки;

Проверка прав и обмен данными: Метод Записать() при выполнении проверяет права доступа текущего пользователя и запускает все стандартные механизмы проверки данных (например, ПередЗаписью). В ситуациях, когда необходимо максимально ускорить процесс записи или пропустить дополнительные проверки (например, при массовом импорте), вы можете установить свойство ОбменДанными.Загрузка = Истина. Будьте осторожны с этим свойством, так как оно отключает автоматические проверки, которые могут быть критичны для бизнес-логики конфигурации.

Таким образом, отказ от работы с формами в пользу серверной обработки объектов через ПолучитьОбъект() — это лучший способ сделать вашу программу быстрее, надежнее и профессиональнее.

← На главную