В практике администратора или разработчика 1С часто возникает задача массового редактирования данных. Однако стандартная обработка «Групповое изменение реквизитов» имеет существенный недостаток: если вам нужно регулярно менять одни и те же наборы полей на разные, но заранее известные значения (например, для тестирования или сезонной смены цен/аналитики), вводить их каждый раз вручную крайне утомительно. Рассмотрим, как реализовать механизм, позволяющий сохранять «сценарии» изменений и применять их в несколько кликов.
Проанализируем самый доступный способ, который не требует программирования, но решает задачу сохранения «шаблонов» изменений. Речь идет о типовой обработке ЗагрузкаДанныхИзТабличногоДокумента.epf (или встроенной в современные конфигурации функции «Загрузка данных из файла»).
Разберем по шагам, как это работает в контексте нашей задачи:
Вариант_1.xlsx, Вариант_2.xlsx и так далее.Кассы). Укажем, что идентификация происходит по полю Код. Для остальных полей выберем режим «Обновлять»..mxl. Это именно то, что нужно: вам не придется каждый раз заново указывать, какая колонка Excel соответствует какому реквизиту 1С.Преимущество этого метода: вы можете хранить сколько угодно вариантов значений в разных файлах Excel, а структура загрузки останется неизменной.
Этот метод считается наиболее профессиональным и гибким среди разработчиков. Рассмотрим ситуацию, когда нам нужно быстро переключаться между наборами данных. Современные консоли запросов позволяют не только выбирать данные, но и выполнять произвольный код для каждой строки результата.
Проанализируем алгоритм действий:
Посмотрим на пример кода, который можно использовать в консоли для массового изменения:
Для Каждого СтрокаРезультата Из РезультатЗапроса Цикл
Объект = СтрокаРезультата.Ссылка.ПолучитьОбъект();
// Здесь мы можем задать логику выбора значения
// Например, если мы заранее подготовили условие или переменную
Если ВариантИзменения = 1 Тогда
Объект.ВалютаПоУмолчанию = Справочники.Валюты.НайтиПоКоду("840"); // USD
Объект.СчетУчета = ПланыСчетов.Хозрасчетный.КассаОрганизации_01;
ИначеЕсли ВариантИзменения = 2 Тогда
Объект.ВалютаПоУмолчанию = Справочники.Валюты.НайтиПоКоду("643"); // RUB
Объект.СчетУчета = ПланыСчетов.Хозрасчетный.КассаОрганизации;
КонецЕсли;
Попытка
Объект.Записать();
Исключение
Сообщить("Ошибка записи объекта " + Объект + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Выясним причину популярности этого метода: сам текст запроса вместе с кодом обработки можно сохранить в файл .q1c. Это позволяет создать целую библиотеку «скриптов» для разных ситуаций, которые не зависят от обновлений конфигурации, так как используют стандартные программные интерфейсы.
Если вы разрабатываете собственную обработку, стоит обратить внимание на механизм ХранилищеОбщихНастроек. Это позволит пользователю сохранять введенные в таблицу значения непосредственно в базе данных под своим именем.
Разберем, как реализовать сохранение таблицы значений, в которой пользователь указал старые и новые реквизиты, в формат JSON для последующего восстановления. Выясним, почему JSON — это отличный выбор: он легко читается и устойчив к изменениям метаданных.
Пример кода для сохранения настроек в файл:
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(,,, ЭлементыСоставаJSON.Авто);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл("C:\Settings\MyUpdate.json");
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ТаблицаСДанными, НазначениеТипаXML.Явное);
ЗаписьJSON.Закрыть();
А вот как мы можем прочитать эти данные обратно:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл("C:\Settings\MyUpdate.json");
ТаблицаДанных = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON, Тип("ТаблицаЗначений"));
ЧтениеJSON.Закрыть();
// Теперь таблица заполнена вашими сохраненными значениями "НовоеЗначение1", "НовоеЗначение2"
Важный момент: при использовании такого подхода мы обеспечиваем «выживаемость» настроек при обновлении конфигурации. Если даже какой-то реквизит будет удален, метод ПрочитатьJSON все равно загрузит остальные данные, а ошибку можно будет обработать программно.
Иногда задача «сохранения прошлых значений» решается штатными средствами платформы. Если в вашей конфигурации (на базе БСП) включено Версионирование объектов, система автоматически сохраняет состояние объекта до и после изменения.
Рассмотрим, как это помогает в нашей задаче:
Проанализировав все варианты, мы можем сделать следующие выводы:
Помните, что любые массовые изменения в базе данных следует сначала тестировать на копии, а механизм версионирования объектов является отличной «страховкой» на случай непредвиденных результатов групповой обработки.