Как программно или с помощью стандартных инструментов изменить значение булевого реквизита с Истины на Ложь в 1С

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

В процессе сопровождения баз данных 1С часто возникает задача массового изменения значений определенных реквизитов. Одной из типичных ситуаций является необходимость «снять галочки», то есть перевести значение булевого поля из состояния Истина в Ложь для группы элементов справочника или документов. В данной статье мы подробно разберем, как это реализовать программно, как оптимизировать этот процесс для больших баз данных и как воспользоваться встроенными инструментами системы, если вы не хотите писать код.

Способ 1. Программный перебор элементов в цикле

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

Проанализируем пример кода, который часто используют начинающие разработчики, и исправим в нем типичные ошибки. Для того чтобы изменить реквизит, нам необходимо получить объект на основании ссылки, так как через саму ссылку (выборку) менять данные нельзя.


// Выбираем все элементы справочника "Пенсионеры"
Выборка = Справочники.Пенсионеры.Выбрать();

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

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

Способ 2. Оптимизация процесса с использованием запросов

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

Выясним, как составить эффективный запрос для этой задачи:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Пенсионеры.Ссылка КАК Ссылка
    |ИЗ
    |   Справочник.Пенсионеры КАК Пенсионеры
    |ГДЕ
    |   Пенсионеры.Юбиляр = ИСТИНА";

РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Объект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
    Объект.Юбиляр = Ложь;
    Объект.Записать();
КонецЦикла;

Использование запроса позволяет существенно сократить количество итераций цикла. Мы выбираем только те ссылки, которые действительно требуют изменения. Это классический подход профессиональной разработки в среде 1С.

Способ 3. Использование встроенной обработки «Групповое изменение реквизитов»

Если ваша конфигурация построена на базе БСП (Библиотеки стандартных подсистем), например, «Бухгалтерия предприятия 3.0» или «Управление торговлей 11», вам не нужно писать код. Рассмотрим, как выполнить задачу интерактивно.

  1. Перейдите в раздел Администрирование, затем выберите пункт Обслуживание.
  2. Найдите подраздел Корректировка данных и откройте ссылку Групповое изменение реквизитов.
  3. В поле «Выбирать элементы типа» укажите ваш справочник (например, «Пенсионеры»).
  4. Нажмите «Добавить условие отбора», выберите поле Юбиляр и установите значение «Да» (Истина).
  5. В списке реквизитов ниже найдите поле Юбиляр и в колонке «Новое значение» оставьте пустой флажок (Ложь).
  6. Нажмите кнопку «Изменить реквизиты».

Этот метод наиболее безопасен для пользователей, так как он учитывает права доступа и позволяет визуально проконтролировать список изменяемых объектов перед началом операции.

Важные нюансы при массовом изменении данных

Рассмотрим подробнее дополнительные механизмы, которые помогут сделать процесс изменения данных безопасным и быстрым. При программной записи объектов могут срабатывать различные проверки в модулях (например, проверка заполнения других полей), которые могут выдать ошибку и прервать ваш цикл.

1. Режим загрузки данных. Чтобы избежать выполнения лишних проверок и процедур при записи, установите свойство ОбменДанными.Загрузка = Истина. Это своего рода «зеленый свет» для системы, сообщающий, что выполняется техническая операция, а не ввод данных пользователем.


Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.ОбменДанными.Загрузка = Истина;
Объект.Юбиляр = Ложь;
Объект.Записать();

2. Использование транзакций. Для ускорения записи, особенно в файловых версиях базы, рекомендуется оборачивать цикл в транзакцию. Это позволяет системе выполнить запись пачкой, а не обращаться к диску на каждой итерации. Разберем пример:


НачатьТранзакцию();
Пока Выборка.Следующий() Цикл
    // Логика изменения...
КонецЦикла;
ЗафиксироватьТранзакцию();

3. Работа порциями. Если данных очень много (миллионы строк), единая транзакция может переполнить лог транзакций или заблокировать базу для других пользователей. В таких случаях проанализируем стратегию разделения на порции: записывайте данные, например, по 1000 элементов, фиксируя транзакцию и начиная новую.

Таким образом, мы рассмотрели различные подходы к снятию «истинности» реквизита: от простого цикла до профессиональной оптимизации с использованием запросов и транзакций. Выбор метода зависит от сложности вашей конфигурации и объема обрабатываемых данных.

← На главную