При разработке конфигураций на платформе 1С часто возникает задача массовой обработки данных. Типичный сценарий: пользователь выбирает несколько элементов справочника в поле типа СписокЗначений, и после нажатия кнопки система должна внести изменения в каждый выбранный объект. Начинающие разработчики часто пытаются получить форму каждого элемента, чтобы изменить его реквизиты, однако это является архитектурной ошибкой. Рассмотрим, как решить эту задачу правильно и эффективно.
Попытка вызвать ОткрытьФорму() или подобные методы для каждого выбранного элемента — это путь к созданию медленного и нестабильного кода. Открытие формы требует значительных ресурсов сервера и клиента: отрисовка интерфейса, выполнение событий ПриСозданииНаСервере, ПриОткрытии и других обработчиков формы существенно замедляет процесс. Если в списке выбрано 50 или 100 элементов, приложение может зависнуть или вызвать ошибку нехватки памяти. Кроме того, формы предназначены для взаимодействия с пользователем, а не для фонового изменения данных.
Для внесения изменений в справочник программно необходимо работать не с формой, а непосредственно с объектом базы данных. Разберем по шагам, как это реализовать:
ПолучитьОбъект() переводим ссылку в объектную модель (СправочникОбъект).Записать() для сохранения изменений в базе данных.Посмотрим на пример реализации такого цикла:
Список = Объект.Хранилище.ВыгрузитьЗначения();
Для Каждого Элемент Из Список Цикл
// Получаем объект справочника по ссылке
ОбъектСправочника = Элемент.Значение.ПолучитьОбъект();
// Проверяем, что объект не пустой
Если ОбъектСправочника <> Неопределено Тогда
// Изменяем нужный реквизит
ОбъектСправочника.Наименование = \"Новое наименование\";
// Записываем изменения
ОбъектСправочника.Записать();
КонецЕсли;
КонецЦикла;
При работе со списком значений крайне важно понимать разницу между полным списком и отмеченными элементами. Метод ВыгрузитьЗначения() вернет массив всех элементов, которые были добавлены в список, вне зависимости от того, установил ли пользователь «галочку» (пометку) напротив них. Если ваша бизнес-задача подразумевает обработку только тех элементов, которые пользователь отметил в интерфейсе, используйте метод ОтмеченныеЭлементы().
Рассмотрим разницу в коде:
// Получит все элементы, добавленные в список
МассивВсех = Объект.Хранилище.ВыгрузитьЗначения();
// Получит только те, у которых установлена пометка (галочка)
МассивОтмеченных = Объект.Хранилище.ОтмеченныеЭлементы();
Если вы обрабатываете большое количество объектов, примите во внимание следующие рекомендации:
Использование транзакций: Чтобы обеспечить целостность данных и повысить скорость записи, рекомендуется поместить цикл в транзакцию. Это гарантирует, что либо все изменения будут успешно зафиксированы, либо, в случае ошибки, система откатит все действия назад.
НачатьТранзакцию();
Попытка
Для Каждого Элемент Из МассивОтмеченных Цикл
// Логика изменения объекта
ОбъектСправочника = Элемент.ПолучитьОбъект();
// ... установка свойств ...
ОбъектСправочника.Записать();
КонецЦикла;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
// Обработка ошибки
КонецПопытки;
Проверка прав и обмен данными: Метод Записать() при выполнении проверяет права доступа текущего пользователя и запускает все стандартные механизмы проверки данных (например, ПередЗаписью). В ситуациях, когда необходимо максимально ускорить процесс записи или пропустить дополнительные проверки (например, при массовом импорте), вы можете установить свойство ОбменДанными.Загрузка = Истина. Будьте осторожны с этим свойством, так как оно отключает автоматические проверки, которые могут быть критичны для бизнес-логики конфигурации.
Таким образом, отказ от работы с формами в пользу серверной обработки объектов через ПолучитьОбъект() — это лучший способ сделать вашу программу быстрее, надежнее и профессиональнее.