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