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