При интерактивном создании или редактировании элементов справочников, документов или задач разработчики и пользователи часто сталкиваются с системным сообщением: «Введенные данные не отображены в списке, так как не соответствуют отбору». Начинающие специалисты нередко принимают эту фразу за фатальную ошибку, блокирующую запись объекта. Разберем по шагам, как устроен этот механизм платформы 1С:Предприятие, почему возникает данное предупреждение и какими способами можно скорректировать поведение системы.
Проанализируем механику работы платформы при записи нового объекта. Когда пользователь нажимает кнопку сохранения (например, «Записать и закрыть» или «ОК»), происходит штатная процедура:
Таким образом, это не ошибка записи, а штатное уведомление о том, что элемент сохранен, но прямо сейчас в текущей таблице его увидеть нельзя из-за активных фильтров.
Рассмотрим специфику задач и бизнес-процессов, где данное сообщение встречается чаще всего. Списки задач практически никогда не выводятся без фильтров. Как правило, форма «Мои задачи» содержит жесткие отборы:
Выполнена = Ложь или СостояниеБизнесПроцесса = Активен.Исполнитель = &ТекущийПользователь.Если в процессе доработки конфигурации или экранной формы исполнитель был переназначен на другого сотрудника, реквизит адресации остался пустым либо задача сразу была помечена как выполненная, платформа физически не сможет отобразить ее в списке текущего пользователя. Список обновляется, видит несовпадение условий и выдает указанное сообщение.
Кроме видимых фильтров, на отображение могут влиять:
Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор. Пользователь не видит их в стандартной панели отборов и не может отключить кнопкой сброса настроек.ГДЕ основного запроса динамического списка.Выясним причину связывания: платформа сравнивает реквизиты объекта с фильтрами только тогда, когда форма объекта «знает» своего владельца — элемент управления формы списка. Если задача или документ создаются программно из общего интерфейса или внешней обработки, можно явно указать значение Неопределено в качестве владельца при вызове метода ОткрытьФорму.
Посмотрим на пример программного вызова:
ПараметрыФормы = Новый Структура;
// Передаем необходимые параметры заполнения при необходимости
ОткрытьФорму("Задача.ЗадачаИсполнителя.ФормаОбъекта", ПараметрыФормы, Неопределено);
При таком подходе после нажатия кнопки «Записать и закрыть» форма не инициирует проверку в родительском динамическом списке, и предупреждение не появляется.
Платформа 1С умеет автоматически заполнять реквизиты нового объекта значениями из отбора динамического списка, но делает это только в том случае, если в отборе используется вид сравнения Равно. Если в списке установлено условие В списке, Не равно или отбор по группе, автоподстановка не сработает.
Чтобы гарантировать корректность данных, переопределим логику в модуле объекта создаваемой сущности в процедуре ОбработкаЗаполнения:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
// Проверяем структуру переданных настроек отбора
Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
Если ДанныеЗаполнения.Свойство("Исполнитель") И ЗначениеЗаполнено(ДанныеЗаполнения.Исполнитель) Тогда
ЭтотОбъект.Исполнитель = ДанныеЗаполнения.Исполнитель;
Иначе
ЭтотОбъект.Исполнитель = ПользователиИнформационнойБазы.ТекущийПользователь();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Корректное заполнение ключевых реквизитов адресации при создании позволит новому объекту сразу удовлетворять условиям текущего списка.
Если специфика бизнес-логики предполагает, что пользователь регулярно создает задачи для других исполнителей, находясь в своем персональном списке, целесообразно перехватить оповещение о записи и адаптировать фильтр списка.
В модуле формы списка задач реализуем обработчик события ОбработкаОповещения:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "Запись_ЗадачаИсполнителя" Тогда
// При необходимости временно отключаем отбор по текущему исполнителю
ЭлементОтбора = Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти("Исполнитель");
Если ЭлементОтбора <> Неопределено Тогда
ЭлементОтбора.Использование = Ложь;
КонецЕсли;
Элементы.Список.Обновить();
КонецЕсли;
КонецПроцедуры
Важно учитывать архитектурные различия платформ:
ТабличноеПоле присутствует свойство ПроверкаОтображенияНовойСтроки. Если установить его в значение ВариантПроверкиОтображенияНовойСтроки.НеПроверять, платформа полностью прекращает вывод сообщений о несоответствии создаваемых строк критериям отбора.