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

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

1. Когда требуется обновление списков в 1С

Не все изменения данных требуют полноценного обновления списков. Рассмотрим ключевые scenarios, когда без этой процедуры не обойтись:

  • 📋 Изменение реквизитов справочника — например, когда поменялось наименование контрагента или его ИНН, но код остался прежним. Система не обновляет автоматически связанные документы.
  • 🔄 Массовая замена значений — при смене классификатора (ОКВЭД, ОКПД2) или перехода на новую версию номенклатуры.
  • 🔧 Исправление ошибок — когда в ручном режиме были внесены некорректные данные, требующие ретроспективного исправления.
  • 📈 Обновление регистров — после изменения алгоритмов расчета (например, пересчет себестоимости в Управлении торговлей 11).

Важно отличать обновление от перепроведения документов. Первое затрагивает сами данные в справочниках, второе — только результаты расчетов. Например, если вы изменили ставку НДС в справочнике, то для корректного отображения в старых документах потребуется именно обновление списка ставок, а не простое перепроведение.

📊 Как часто вы обновляете справочники в 1С?
Ежедневно
Раз в неделю
Только при ошибках
Никогда не обновлял

2. Ручное обновление через интерфейс 1С

Самый простой способ — использовать стандартные инструменты платформы. Рассмотрим пошаговую инструкцию на примере обновления справочника Контрагенты:

  1. Откройте нужный справочник через меню Справочники → Контрагенты.
  2. Выделите запись, которую требуется обновить (или несколько записей с зажатой клавишей Ctrl).
  3. Нажмите правой кнопкой мыши и выберите Изменить (или Все действия → Изменить в новых версиях интерфейса).
  4. Внесите изменения в реквизиты и сохраните (Ctrl+S или кнопка "Записать и закрыть").
  5. Для массового обновления используйте Все действия → Групповое изменение реквизитов.

Обратите внимание: при групповом изменении система предложит выбрать реквизиты для обновления. Например, можно одновременно поменять Юр.адрес и Телефон для всех выбранных контрагентов. Однако этот метод не затрагивает связанные документы — для них потребуется отдельное обновление.

Проверить права доступа (полные права на справочник)

Создать резервную копию базы

Убедиться в отсутствии блокировок другими пользователями

Зафиксировать текущие значения для отката при ошибке-->

3. Программное обновление с помощью запросов

Для сложных сценариев (например, обновление 10 000 записей по определенному критерию) ручной метод неэффективен. В таких случаях используют встроенный язык 1С и конструктор запросов. Пример кода для обновления поля СтавкаНДС у всех элементов справочника Номенклатура:

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

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.СтавкаНДС = &СтараяСтавка";

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

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

Выборка = Результат.Выбрать();

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

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

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

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

КонецЦикла;

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

Объект.Записать(РежимЗаписиОбъекта.ЗаписьСКонтролем);
Что будет если не использовать режим контроля?

Без флага РежимЗаписиОбъекта.ЗаписьСКонтролем система не проверяет уникальность кодов и не блокирует изменение служебных реквизитов. Это может привести к дублированию кодов или потере ссылок в связанных документах.

4. Обновление через обработки и расширения

Для регулярных операций целесообразно использовать внешние обработки или расширения конфигурации. Популярные решения:

  • 📊 Обработка "Групповое изменение реквизитов" — стандартный инструмент, доступный в большинстве типовых конфигураций (БП 3.0, УТ 11, ЗУП 3.1).
  • 🔧 Расширение "Массовое обновление данных" — позволяет создавать правила обновления с условиями (например, "заменить ставку НДС на 20% для всех товаров категории 'Электроника'").
  • 🤖 Роботы 1С:Enterprise — для автоматизации по расписанию (например, еженедельное обновление курсов валют из ЦБ).

Пример настройки группового изменения через обработку:

  1. Откройте обработку через Файл → Открыть (выберите файл GroupChange.epf).
  2. Укажите справочник-источник (например, Номенклатура).
  3. Добавьте условие отбора (например, Группа = "Товары").
  4. Выберите реквизиты для изменения и укажите новые значения.
  5. Запустите выполнение и дождитесь завершения (прогресс отображается в статусной строке).
💡

Перед массовым обновлением через обработку проверьте настройки Режим записи в параметрах выполнения. Опция "Записывать с контролем" предотвратит дублирование кодов.

5. Обновление регистров накопления и сведений

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

Пример перерасчета регистра ТоварыНаСкладах:

РегистрыНакопления.ТоварыНаСкладах.ПерерасчетИтогов(

НачалоПериода, // Дата начала перерасчета

КонецПериода, // Дата окончания

Истина // Признак полного перерасчета

);

Для регистров сведений (например, ЦеныНоменклатуры) часто требуется перезапись последних значений:

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

Запрос.Текст =

"ВЫБРАТЬ РАЗРЕШЕННЫЕ

| Первые 1000

| ЦеныНоменклатуры.Номенклатура КАК Номенклатура,

| МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период

|ИЗ

| РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры

|СГРУППИРОВАТЬ ПО

| ЦеныНоменклатуры.Номенклатура";

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

Выборка = Результат.Выбрать();

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

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

НаборЗаписей.Отбор.Номенклатура.Установить(Выборка.Номенклатура);

НаборЗаписей.Отбор.Период.Установить(Выборка.Период);

НаборЗаписей.Прочитать();

Пока НаборЗаписей.Получить() Цикл

НаборЗаписей.Цена = НоваяЦена; // Ваше новое значение

НаборЗаписей.Записать();

КонецЦикла;

КонецЦикла;

Тип регистра Метод обновления Когда применять Риски
Накопления ПерерасчетИтогов() Изменение алгоритмов расчета остатков Длительное выполнение на больших базах
Сведений Перезапись последних записей Массовое изменение справочных данных (цен, курсов) Потеря истории изменений при некорректной фильтрации
Бухгалтерии ПерепроведениеДокументов() Изменение планов счетов или субконто Расхождение оборотов при прерывании процесса

6. Типичные ошибки и их решение

Даже опытные пользователи сталкиваются с проблемами при обновлении списков. Рассмотрим наиболее распространенные сценарии:

  • 🔗 Разрыв ссылочной целостности — возникает при изменении кодов элементов справочника, на которые ссылаются документы. Решение: использовать ПометкаУдаления = Истина вместо удаления, либо корректировать ссылки через запрос.
  • 🕒 Зависание при массовом обновлении — связано с блокировками транзакций. Решение: разбивать операцию на пакеты по 500-1000 записей с паузой между ними.
  • 📉 Некорректные остатки после перерасчета — typical для регистров накопления. Решение: предварительно фиксировать остатки на дату изменения и сверять результаты.

Особенно опасно обновлять периодические реквизиты (например, ДействуетС/ДействуетПо в справочнике Сотрудники). Неправильное изменение дат может привести к "исчезновению" сотрудников из расчетных документов за прошлые периоды. Всегда проверяйте влияние изменений на связанные регистры!

💡

Перед массовым обновлением создайте тестовую копию базы и протестируйте скрипт на небольшой выборке данных. Это позволит выявить скрытые зависимости между объектами.

⚠️ Внимание: При обновлении справочников, которые используются в регламентных заданиях (например, Графики работы в ЗУП), изменения могут вступить в силу только после перезапуска фонового процесса. Проверьте настройки сервера 1С:Предприятие.

7. Автоматизация обновлений

Для регулярных операций целесообразно настраивать автоматические процессы:

  • 📅 Регламентные задания — например, еженедельное обновление курсов валют из файла ЦБ. Настройка: Администрирование → Регламентные задания → Создать.
  • 🤖 Роботы 1С:Enterprise — позволяют запускать скрипты по расписанию или триггерам (например, при поступлении нового файла в каталог).
  • 🔄 Обмен данными — если обновления поступают из внешней системы (например, из 1С:EDI или 1С:Коннект), настройте правила конвертации данных.

Пример кода для регламентного задания, которое обновляет цены номенклатуры из Excel:

Процедура ОбновитьЦеныИзФайла() Экспорт

ПутьКФайлу = "C:\PriceUpdate\prices.xlsx";

ТаблицаЦен = ПолучитьДанныеИзExcel(ПутьКФайлу);

Для Каждого Строка Из ТаблицаЦен Цикл

Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Строка.Наименование);

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

Продолжить;

КонецЕсли;

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

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

НаборЗаписей.Отбор.ТипЦен.Установить(Перечисления.ТипыЦен.Розничная);

НаборЗаписей.Прочитать();

Если НаборЗаписей.Количество() > 0 Тогда

НаборЗаписей.Получить();

НаборЗаписей.Цена = Строка.Цена;

НаборЗаписей.Записать();

Иначе

НоваяЗапись = НаборЗаписей.Добавить();

НоваяЗапись.Номенклатура = Номенклатура;

НоваяЗапись.ТипЦен = Перечисления.ТипыЦен.Розничная;

НоваяЗапись.Цена = Строка.Цена;

НоваяЗапись.Период = ТекущаяДата();

НаборЗаписей.Записать();

КонецЕсли;

КонецЦикла;

КонецПроцедуры

⚠️ Внимание: При настройке автоматических обновлений через 1С:EDI или 1С:Коннект проверьте настройки Правил обмена. Некоторые поля (например, Владелец в справочнике Контрагенты) могут блокировать обновление данных из внешних источников.

FAQ: Частые вопросы по обновлению списков в 1С

Можно ли отменить массовое обновление, если оно было выполнено ошибочно?

Откат возможен только если:

  1. Вы использовали транзакции в коде (блок НачатьТранзакцию()/ЗафиксироватьТранзакцию()).
  2. У вас есть резервная копия базы до обновления.
  3. Изменения затрагивали только непериодические реквизиты (для периодических требуется ручной откат).

В остальных случаях потребуется повторное обновление с корректными данными или восстановление из бэкапа.

Почему после обновления справочника не изменились данные в документах?

Это стандартное поведение 1С: документы хранят ссылки на элементы справочников, а не их текущие значения. Чтобы обновить данные в документах, необходимо:

  1. Использовать перепроведение документов (меню Все функции → Перепроведение).
  2. Или написать специальный скрипт, который обновит реквизиты в табличных частях.

Для справочников с предопределенными элементами (например, ВидыНоменклатуры) может потребоваться обновление конфигурации.

Как обновлять данные в распределенной базе 1С (РИБ)?

В распределенных информационных базах обновление требует синхронизации:

  1. Выполните изменения в главном узле.
  2. Используйте ПланОбмена.ОправитьИзменения() для передачи данных в подчиненные узлы.
  3. В подчиненных узлах запустите ПланОбмена.ПолучитьИзменения().

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

Какие права нужны для массового обновления данных?

Минимальные требования:

  • Полные права на справочник/регистр (Чтение, Добавление, Изменение, Удаление).
  • Администрирование — если требуется изменение структуры (добавление реквизитов).
  • Интерактивное удаление — для операций с пометкой удаления.
  • Регламентные задания — если настраиваете автоматическое обновление.

В 1С:Предприятие 8.3.20+ для некоторых операций может потребоваться роль АдминистраторОбменаДанными.

Как ускорить обновление больших справочников (100 000+ записей)?

Рекомендации для оптимизации:

  1. Используйте пакетную запись с отключенным контролем:
    Объект.Записать(РежимЗаписиОбъекта.ЗаписьБезКонтроля);
  2. Разбивайте операцию на порции по 500-1000 записей с паузой 1-2 секунды.
  3. Отключите индексы на время обновления (требует прав администратора СУБД).
  4. Используйте прямые SQL-запросы (только для опытных пользователей!).

Для PostgreSQL дополнительно настройте параметры maintenance_work_mem и work_mem в конфигурационном файле.