Почему в 1С произвольно очищаются отборы в настройках и как решить эту проблему

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

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

В этой статье мы подробно проанализируем причины, по которым платформа 1С может очищать сохраненные отборы, и разберем по шагам алгоритм диагностики и устранения данной неполадки.

Основные причины сброса отборов и настроек

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

  1. Динамическое обновление конфигурации («демоническое» обновление): При выполнении динамического обновления в клиент-серверном режиме структура кеша метаданных на сервере приложений и клиентах может рассинхронизироваться. Это регулярно приводит к сбоям считывания сохраненных структур данных, из-за чего отборы восстанавливаются в значения по умолчанию.
  2. Ошибки платформы и повреждение кеша настроек: В платформе 1С (особенно в релизах ветки 8.3.11, таких как 8.3.11.2924) существуют известные платформенные ошибки, связанные со сбоем работы системного хранилища настроек (таблица SystemSettings в СУБД). При сессионном сбое или аварийном завершении работы сеанса сохраненные настройки обнуляются.
  3. Конфликт программных отборов и пользовательских настроек: Если форма дорабатывалась и в коде (например, в событии ПриСозданииНаСервере или ПриОткрытии) прописан жесткий программный отбор, он может конфликтовать со стандартным механизмом компоновки данных. При неправильном порядке наложения отборов система сбрасывает пользовательские установки.
  4. Влияние ограничений прав на уровне записей (RLS) и фоновых заданий: Если настройка сохраняется или перезаписывается фоновым заданием (например, при автоматическом обмене данными), выполняемым под учетной записью с ограниченными правами, элементы отбора, недоступные данному пользователю по RLS, автоматически исключаются. В результате отбор становится пустым.
  5. Совпадение ключей настроек при копировании объектов: Если разработчик создал новую форму, узел обмена или отчет путем копирования существующего объекта в Конфигураторе, у них может остаться одинаковый КлючНастроек или КлючОбъекта. В таком случае сохранение настроек в одном месте перезаписывает и очищает отборы в другом.
  6. Агрессивная очистка временных папок на сервере: Скрипты очистки каталогов TEMP или работу антивируса на сервере приложений 1С могут затронуть файлы активных сессий (папки snacc / seance), что приводит к сбросу текущих незафиксированных настроек.

Шаг 1. Проверка и анализ Журнала регистрации

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

Сформируем отбор в Журнале регистрации:

  1. Откроем Журнал регистрации в режиме 1С:Предприятие (раздел Администрирование — Обслуживание — Журнал регистрации).
  2. Установим фильтр по событию Данные.Изменение или Данные.Удаление.
  3. В качестве объекта укажем интересующий справочник или узел плана обмена (например, НастройкиЗагрузкиВыгрузкиАвтоматическогоОбмена или узел плана обмена с БП).
  4. Проанализируем события перед моментом очистки отбора. Если запись выполнена фоновым заданием, необходимо проверить права пользователя, под которым оно запускается.

Шаг 2. Программный анализ сохранения отборов в модулях обмена

Рассмотрим, как отборы сохраняются в коде управляемых форм и модулей обмена. Настройки компоновки данных часто хранятся в реквизите с типом ХранилищеЗначений. Если при считывании из хранилища возникает ошибка, код возвращает пустую структуру.

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


&НаСервере
Процедура СохранитьОтборВХранилище(УзелОбмена, НастройкиКомпоновщика)
    
    // Получаем настройки отбора из компоновщика
    ТекущиеНастройки = НастройкиКомпоновщика.ПолучитьНастройки();
    
    // Помещаем структуру в хранилище значений
    ОбъектУзел = УзелОбмена.ПолучитьОбъект();
    ОбъектУзел.ХранилищеНастроекОтбора = Новый ХранилищеЗначений(ТекущиеНастройки);
    
    Попытка
        ОбъектУзел.Записать();
    Исключение
        ЗаписьЖурналаРегистрации("ОшибкаСохраненияНастроек", 
            УровеньЖурналаРегистрации.Ошибка,,, 
            ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;

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

Если в конфигурации используется программная установка отборов динамического списка, убедимся, что режим элемента отбора не конфликтует с пользовательским:


&НаСервере
Процедура УстановитьБезопасныйОтбор(Список, ИмяПоля, ЗначениеОтбора)
    
    ОтборСписка = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор;
    
    // Ищем существующий элемент отбора, чтобы не дублировать и не сбрасывать
    НайденныйЭлемент = Неопределено;
    Для Каждого Элемент Из ОтборСписка.Элементы Цикл
        Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных") 
            И Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля) Тогда
            НайденныйЭлемент = Элемент;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    Если НайденныйЭлемент = Неопределено Тогда
        НайденныйЭлемент = ОтборСписка.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        НайденныйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
    КонецЕсли;
    
    НайденныйЭлемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    НайденныйЭлемент.ПравоеЗначение = ЗначениеОтбора;
    НайденныйЭлемент.Использование = ЗначениеЗаполнено(ЗначениеОтбора);

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

Шаг 3. Очистка кеша и тестирование базы данных

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

  1. Очистить локальный кеш пользователей: Завершить сеансы 1С и удалить содержимого папок кеша на клиентских компьютерах (каталоги %LOCALAPPDATA%\1C\1cv8 и %APPDATA%\1C\1cv8).
  2. Перезапустить службу сервера 1С:Предприятие: Это необходимо для сброса серверного кеша метаданных, который мог быть поврежден в результате динамического обновления.
  3. Выполнить Тестирование и исправление ИБ: В режиме Конфигуратора перейти в меню Администрирование — Тестирование и исправление. Отметить флажками пункты:
    • Проверка логической целостности информационной базы
    • Реструктуризация таблиц информационной базы

Шаг 4. Обновление платформы 1С

Если проблема воспроизводится на релизе платформы 8.3.11.2924, настоятельно рекомендуется выполнить обновление платформы до актуального и стабильного релиза (например, ветки 8.3.18, 8.3.22 или выше). Релизы линейки 8.3.11 содержат известные ошибки работы с системными таблицами настроек СУБД, которые были успешно исправлены разработчиками в более поздних версиях.

Резюме действий для решения проблемы

Подводя итог, при возникновении сброса отборов рекомендуем придерживаться следующего алгоритма:

  1. Проверить по Журналу регистрации, под какой учетной записью происходит перезапись объекта с отборами.
  2. Исключить практику проведения динамических обновлений базы данных в клиент-серверном режиме.
  3. Убедиться, что пользователь, под которым выполняются регламентные задания обмена, обладает полными правами (без ограничений RLS).
  4. Выполнить очистку кеша и процедуру «Тестирование и исправление» в Конфигураторе.
  5. Обновить платформу 1С:Предприятие до стабильного релиза.
← На главную