К статье
Практический материал

Разработка и Конфигурация · 10 мин

1С: как программно поменять значения объектов и реквизитов

Как программно поменять данные в 1С: изменение реквизитов справочников и документов, записей регистров, обработка группового изменения. Примеры кода на встроенном языке.

Программное изменение данных — базовая задача при доработке и администрировании 1С. Встроенный язык платформы позволяет менять реквизиты справочников, документов, записи регистров сведений и накопления, а также выполнять групповую обработку множества объектов. Понимание механизмов чтения, изменения и записи объектов помогает избежать типичных ошибок: потери данных, блокировок и нарушения логики учёта.

Главный принцип прост: сначала объект получают из базы (через ссылку или выборку), затем меняют нужные свойства и вызывают метод записи. Однако детали различаются в зависимости от типа объекта, режима работы (тонкий клиент, сервер, внешняя обработка) и требований к контролю прав. Ниже разобраны рабочие сценарии с примерами кода.

Как программно поменять реквизит справочника

Справочник — самый частый объект изменений. Стандартная последовательность: получить ссылку на элемент (например, через НайтиПоКоду, НайтиПоНаименованию или из параметра), вызвать у ссылки метод ПолучитьОбъект(), присвоить новые значения реквизитам и записать.

НоменклатураСсылка = Справочники.Номенклатура.НайтиПоКоду("000123");

Если Не НоменклатураСсылка.Пустая() Тогда

НоменклатураОбъект = НоменклатураСсылка.ПолучитьОбъект();

НоменклатураОбъект.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;

НоменклатураОбъект.Записать();

КонецЕсли;

Обратите внимание: изменения вступают в силу только после Записать(). Если объект не записать, все присвоенные значения останутся в памяти и будут потеряны при завершении процедуры. При записи срабатывают подписки на события и обработчики ПередЗаписью и ПриЗаписи — это важно, если в конфигурации есть проверки или бизнес-логика.

Для помеченных на удаление элементов запись может завершиться ошибкой, если логика конфигурации это запрещает. Проверяйте свойство ПометкаУдаления перед изменением.

Как программно поменять данные документа

С документами работают аналогично, но есть нюанс: документ участвует в проведении, поэтому важен режим записи. Метод Записать() по умолчанию выполняет простую запись без проведения; для перепроведения используют Записать(РежимЗаписиДокумента.Проведение).

ДокументОбъект = ДокументСсылка.ПолучитьОбъект();

ДокументОбъект.Комментарий = "Скорректировано программно";

ДокументОбъект.Скидка = 10;

ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение,

РежимПроведенияДокумента.Оперативный);

Изменение табличной части выполняется через коллекцию строк: обход в цикле, добавление через Добавить(), удаление через Удалить(). После любых правок табличной части документ нужно записать, иначе изменения не сохранятся.

Если документ уже проведён, а вы меняете суммы или количества, перепроведение обязательно — иначе движения по регистрам останутся старыми и учёт разойдётся с данными документа.

Как поменять записи регистров сведений и накопления

Регистры сведений изменяют через менеджер записи (для одной записи) или набор записей (для группы). Менеджер записи подходит, когда известен полный ключ записи — измерения и, для периодических регистров, период.

МенеджерЗаписи = РегистрыСведений.ЦеныНоменклатуры.СоздатьМенеджерЗаписи();

МенеджерЗаписи.Период = ТекущаяДатаСеанса();

МенеджерЗаписи.Номенклатура = НоменклатураСсылка;

МенеджерЗаписи.ВидЦены = ВидЦеныСсылка;

МенеджерЗаписи.Прочитать();

Если МенеджерЗаписи.Выбран() Тогда

МенеджерЗаписи.Цена = 1500;

МенеджерЗаписи.Записать();

КонецЕсли;

Набор записей используют, когда нужно поменять несколько записей сразу, например все движения конкретного документа. Устанавливается отбор по регистратору, набор читается, модифицируется и записывается с замещением.

Прямая правка регистров накопления в обход документов — крайняя мера. Движения должны формироваться проведением документов, иначе при следующем перепроведении ручные правки будут затёрты.

Групповое изменение данных: обработка и запросы

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

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура

|ГДЕ СтавкаНДС = &СтараяСтавка";

Запрос.УстановитьПараметр("СтараяСтавка", СтараяСтавка);

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

Пока Выборка.Следующий() Цикл

Объект = Выборка.Ссылка.ПолучитьОбъект();

Объект.СтавкаНДС = НоваяСтавка;

Объект.Записать();

КонецЦикла;

В типовых конфигурациях для разовых массовых правок есть штатная обработка «Групповое изменение реквизитов» (в разделе администрирования). Она позволяет поменять реквизиты без программирования и уважает права доступа — используйте её, если задача разовая.

Порядок безопасной массовой обработки
  1. 1
    Сделайте резервную копию информационной базы
  2. 2
    Отладьте код на одном-двух тестовых объектах
  3. 3
    Оберните цикл записи в транзакцию с попыткой-исключением
  4. 4
    Добавьте счётчик обработанных и ошибочных объектов
  5. 5
    Проверьте результат выборочно по нескольким объектам

Изменение через консоль кода и внешние обработки

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

Внешняя обработка (файл .epf) — правильный путь для повторяющихся задач. В ней можно организовать форму с параметрами, кнопкой выполнения и журналом результатов. Обработка подключается через «Файл — Открыть» или механизм дополнительных отчётов и обработок в типовых конфигурациях.

Способы программного изменения

Групповое изменение реквизитов

Штатный инструмент типовых конфигураций. Подходит для разовых правок без кода, но не умеет сложную логику условий.

Консоль кода

Быстрое выполнение произвольного кода. Подходит опытным администраторам для разовых задач, нет защиты от ошибок.

Внешняя обработка

Полноценное решение с формой и параметрами. Требует разработки, но безопасно и пригодно для повторного использования.

Доработка конфигурации

Код встраивается в модули. Подходит для постоянной бизнес-логики, но осложняет обновление типовой конфигурации.

Типичные ошибки и их последствия

Самая частая ошибка — изменение объекта без вызова Записать(). Код отрабатывает без ошибок, но данные в базе не меняются, и разработчик ищет проблему не там. Вторая по частоте — попытка записать объект, который параллельно редактирует пользователь: возникает конфликт блокировок, и запись завершается исключением.

Ещё одна группа ошибок связана с обходом бизнес-логики. Установка ОбменДанными.Загрузка = Истина отключает проверки и подписки при записи — это ускоряет массовую загрузку, но может нарушить целостность данных, если использовать приём без понимания последствий.

Типичные ошибки
01
Забыли вызвать Записать() — изменения остались только в памяти и потеряны
02
Изменили проведённый документ без перепроведения — движения по регистрам устарели
03
Использовали ОбменДанными.Загрузка = Истина без необходимости — пропущены проверки и подписки на события
04
Обрабатывали большую выборку без транзакции и лога — при сбое непонятно, что успело записаться
05
Меняли объект по наименованию без проверки Пустая() — получили исключение на несуществующей ссылке

Как проверить результат изменений

После программной записи убедитесь, что изменения реально применились. Минимальная проверка — повторное чтение объекта и сравнение реквизита с ожидаемым значением. Для документов дополнительно проверьте движения: откройте документ в режиме предприятия и посмотрите проводки или записи регистров.

При массовой обработке полезно вести журнал: сколько объектов обработано, сколько пропущено и по каким причинам. Это позволяет доказать корректность выполнения и быстро найти проблемные элементы.

Контрольные точки

Как проверить результат

Значение реквизита после записи
Норма

При повторном чтении реквизит равен новому значению

Тревожный признак

Значение старое — запись не выполнилась или откатилась транзакция

Движения перепроведённого документа
Норма

Проводки и записи регистров соответствуют новым данным документа

Тревожный признак

Движения старые — документ записан без режима Проведение

Счётчик массовой обработки
Норма

Число обработанных совпадает с размером выборки

Тревожный признак

Есть пропуски или исключения без разбора причин

Часто задаваемые вопросы

Можно ли поменять данные без прав администратора?

Да, если у пользователя есть права на изменение конкретного объекта. Программная запись проверяет права так же, как интерактивная. Код в привилегированном модуле (УстановитьПривилегированныйРежим) обходит проверку прав, поэтому его применяют только в серверных процедурах с осознанным риском.

Чем НайтиПоНаименованию опасен при поиске элемента?

Наименование не уникально: в справочнике может быть несколько элементов с одинаковым названием, и метод вернёт первый попавшийся. Для надёжного поиска используйте код, уникальный идентификатор или поиск по комбинации реквизитов с проверкой количества найденного.

Как отменить программные изменения, если что-то пошло не так?

Встроенного механизма отката нет. Единственная надёжная защита — резервная копия базы перед обработкой. Дополнительно можно перед изменением сохранять старые значения реквизитов в файл или регистр, чтобы иметь возможность восстановить данные обратной обработкой.

Почему запись объекта занимает много времени при большой выборке?

Каждый вызов Записать() выполняет проверки, подписки на события и фиксирует транзакцию. Для ускорения можно записывать порциями, временно отключать неиспользуемые подписки (через ОбменДанными.Загрузка с осторожностью) и выполнять обработку на сервере, а не на клиенте.

Можно ли программно поменять данные в закрытом периоде?

Технически — да, если не установлена дата запрета изменения данных или у пользователя есть право её обхода. Практически это недопустимо без согласования: изменение документов закрытого периода искажает сданную отчётность и может привести к налоговым рискам.

Что делать, если при записи возникает ошибка «Конфликт блокировок»?

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

Итог

Что важно запомнить

Программное изменение в 1С строится по схеме: получить объект по ссылке, изменить реквизиты, вызвать Записать(). Документы требуют перепроведения, регистры меняются через наборы записей, массовые обработки — только с резервной копией, транзакцией и журналом результатов.