Работа с актуальными данными в 1С:Предприятие — залог корректного учета и отчетности. Однако многие пользователи сталкиваются с ситуацией, когда справочники, документы или регистры накопления требуют принудительного обновления. Это может быть связано с изменениями в законодательстве, обновлением конфигурации или ручным редактированием данных. В отличие от стандартного добавления новых записей, обновление списков предполагает перезапись существующей информации с сохранением связей и истории изменений.
В этой статье мы разберем все актуальные методы обновления списков в 1С 8.3 — от ручного редактирования до программных решений с использованием встроенного языка. Особое внимание уделим типичным ошибкам, которые приводят к разрыву ссылочной целостности или потере данных. Материал будет полезен как бухгалтерам, так и администраторам систем 1С, которые поддерживают работоспособность базы.
1. Когда требуется обновление списков в 1С
Не все изменения данных требуют полноценного обновления списков. Рассмотрим ключевые scenarios, когда без этой процедуры не обойтись:
- 📋 Изменение реквизитов справочника — например, когда поменялось наименование контрагента или его ИНН, но код остался прежним. Система не обновляет автоматически связанные документы.
- 🔄 Массовая замена значений — при смене классификатора (ОКВЭД, ОКПД2) или перехода на новую версию номенклатуры.
- 🔧 Исправление ошибок — когда в ручном режиме были внесены некорректные данные, требующие ретроспективного исправления.
- 📈 Обновление регистров — после изменения алгоритмов расчета (например, пересчет себестоимости в Управлении торговлей 11).
Важно отличать обновление от перепроведения документов. Первое затрагивает сами данные в справочниках, второе — только результаты расчетов. Например, если вы изменили ставку НДС в справочнике, то для корректного отображения в старых документах потребуется именно обновление списка ставок, а не простое перепроведение.
2. Ручное обновление через интерфейс 1С
Самый простой способ — использовать стандартные инструменты платформы. Рассмотрим пошаговую инструкцию на примере обновления справочника Контрагенты:
- Откройте нужный справочник через меню
Справочники → Контрагенты. - Выделите запись, которую требуется обновить (или несколько записей с зажатой клавишей
Ctrl). - Нажмите правой кнопкой мыши и выберите
Изменить(илиВсе действия → Изменитьв новых версиях интерфейса). - Внесите изменения в реквизиты и сохраните (
Ctrl+Sили кнопка "Записать и закрыть"). - Для массового обновления используйте
Все действия → Групповое изменение реквизитов.
Обратите внимание: при групповом изменении система предложит выбрать реквизиты для обновления. Например, можно одновременно поменять Юр.адрес и Телефон для всех выбранных контрагентов. Однако этот метод не затрагивает связанные документы — для них потребуется отдельное обновление.
Проверить права доступа (полные права на справочник)
Создать резервную копию базы
Убедиться в отсутствии блокировок другими пользователями
Зафиксировать текущие значения для отката при ошибке-->
3. Программное обновление с помощью запросов
Для сложных сценариев (например, обновление 10 000 записей по определенному критерию) ручной метод неэффективен. В таких случаях используют встроенный язык 1С и конструктор запросов. Пример кода для обновления поля СтавкаНДС у всех элементов справочника Номенклатура:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.СтавкаНДС = &СтараяСтавка";
Запрос.УстановитьПараметр("СтараяСтавка", СтавкаНДС.Ставка10);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.СтавкаНДС = СтавкаНДС.Ставка20;
Объект.Записать();
КонецЦикла;
Этот скрипт последовательно обновляет каждую запись, что может быть долго при большом объеме данных. Для ускорения используйте пакетную запись:
Объект.Записать(РежимЗаписиОбъекта.ЗаписьСКонтролем);
Что будет если не использовать режим контроля?
Без флага РежимЗаписиОбъекта.ЗаписьСКонтролем система не проверяет уникальность кодов и не блокирует изменение служебных реквизитов. Это может привести к дублированию кодов или потере ссылок в связанных документах.
4. Обновление через обработки и расширения
Для регулярных операций целесообразно использовать внешние обработки или расширения конфигурации. Популярные решения:
- 📊 Обработка "Групповое изменение реквизитов" — стандартный инструмент, доступный в большинстве типовых конфигураций (БП 3.0, УТ 11, ЗУП 3.1).
- 🔧 Расширение "Массовое обновление данных" — позволяет создавать правила обновления с условиями (например, "заменить ставку НДС на 20% для всех товаров категории 'Электроника'").
- 🤖 Роботы 1С:Enterprise — для автоматизации по расписанию (например, еженедельное обновление курсов валют из ЦБ).
Пример настройки группового изменения через обработку:
- Откройте обработку через
Файл → Открыть(выберите файлGroupChange.epf). - Укажите справочник-источник (например,
Номенклатура). - Добавьте условие отбора (например,
Группа = "Товары"). - Выберите реквизиты для изменения и укажите новые значения.
- Запустите выполнение и дождитесь завершения (прогресс отображается в статусной строке).
Перед массовым обновлением через обработку проверьте настройки Режим записи в параметрах выполнения. Опция "Записывать с контролем" предотвратит дублирование кодов.
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С: документы хранят ссылки на элементы справочников, а не их текущие значения. Чтобы обновить данные в документах, необходимо:
- Использовать перепроведение документов (меню
Все функции → Перепроведение). - Или написать специальный скрипт, который обновит реквизиты в табличных частях.
Для справочников с предопределенными элементами (например, ВидыНоменклатуры) может потребоваться обновление конфигурации.
Как обновлять данные в распределенной базе 1С (РИБ)?
В распределенных информационных базах обновление требует синхронизации:
- Выполните изменения в главном узле.
- Используйте
ПланОбмена.ОправитьИзменения()для передачи данных в подчиненные узлы. - В подчиненных узлах запустите
ПланОбмена.ПолучитьИзменения().
Важно: при конфликтах данных (одно и то же поле изменено в разных узлах) используется правило, заданное в настройках плана обмена (обычно приоритет у главного узла).
Какие права нужны для массового обновления данных?
Минимальные требования:
- Полные права на справочник/регистр (
Чтение,Добавление,Изменение,Удаление). - Администрирование — если требуется изменение структуры (добавление реквизитов).
- Интерактивное удаление — для операций с пометкой удаления.
- Регламентные задания — если настраиваете автоматическое обновление.
В 1С:Предприятие 8.3.20+ для некоторых операций может потребоваться роль АдминистраторОбменаДанными.
Как ускорить обновление больших справочников (100 000+ записей)?
Рекомендации для оптимизации:
- Используйте пакетную запись с отключенным контролем:
Объект.Записать(РежимЗаписиОбъекта.ЗаписьБезКонтроля); - Разбивайте операцию на порции по 500-1000 записей с паузой 1-2 секунды.
- Отключите индексы на время обновления (требует прав администратора СУБД).
- Используйте прямые SQL-запросы (только для опытных пользователей!).
Для PostgreSQL дополнительно настройте параметры maintenance_work_mem и work_mem в конфигурационном файле.