Каждый разработчик или администратор платформы 1С:Предприятие рано или поздно сталкивается с загадочным поведением интерфейса: пользователь пытается ввести данные в поле ввода (например, в табличной части документа), устанавливает туда курсор, курсор успешно мигает, однако при нажатии на клавиши клавиатуры ничего не происходит. При этом выбор значения через стандартное диалоговое окно (кнопка с троеточием) или из выпадающего списка работает абсолютно корректно. Что еще более примечательно — у пользователей с полными правами такой проблемы не возникает.
Давайте подробно проанализируем эту ситуацию, выясним скрытые механизмы работы платформы 1С и разберем по шагам все возможные причины и способы решения данной проблемы.
Как показывает практика и обсуждения практикующих специалистов, наиболее частой причиной такого поведения является отсутствие специфического права «Ввод по строке» у неполноправной роли пользователя на тот объект метаданных, ссылка на который выбирается в проблемном поле.
Давайте разберем внутреннюю логику работы платформы 1С:Предприятие. Когда пользователь начинает вводить текст в поле, предназначенное для хранения ссылки (например, ссылка на справочник Контрагенты или Номенклатура), платформа автоматически инициирует механизм автоподбора. Этот механизм пытается сопоставить вводимые символы с наименованием, кодом или другими реквизитами целевого справочника. Для выполнения этой операции платформе необходимо право «Ввод по строке» для данного справочника у текущего пользователя.
Если у пользователя есть права на Чтение и Просмотр объекта, но галочка Ввод по строке в конфигураторе для его роли снята, платформа ведет себя следующим образом:
Решение проблемы в конфигураторе:
Для устранения этой проблемы нам необходимо выдать пользователю соответствующее право. Разберем этот процесс по шагам:
Общие -> Роли.ЧтениеКонтрагентов или аналогичную).Номенклатура).Если с правами доступа все в порядке (или проблема воспроизводится даже под учетной записью администратора), нам стоит детально изучить свойства самого элемента формы в конфигураторе. Рассмотрим подробнее комбинацию свойств, которая может приводить к аналогичному визуальному эффекту.
У любого поля ввода на управляемой форме существуют свойства РежимВыбораИзСписка (Режим выбора из списка) и РедактироватьТекст (Редактирование текста). Давайте проанализируем, как они взаимосвязаны:
РежимВыбораИзСписка установлено в значение Истина, то поле начинает работать как закрытый выпадающий список. Пользователь может выбирать значения только из предопределенного набора.РедактироватьТекст определяет, разрешено ли пользователю фильтровать элементы списка путем ввода букв с клавиатуры. Если свойство РедактироватьТекст установлено в значение Ложь, клавиатурный ввод будет полностью заблокирован платформой. Курсор при этом может позиционироваться в поле ввода, создавая иллюзию готовности к работе.Чтобы исправить это поведение программно или интерактивно, убедитесь, что свойство РедактироватьТекст установлено в значение Истина, либо отключите режим выбора из списка, если он вам не требуется.
Рассмотрим пример того, как можно управлять этими свойствами динамически в коде модуля формы при создании или при изменении условий:
// Программная настройка доступности ввода текста в поле формы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Находим нужный элемент на форме
ЭлементПолеВвода = Элементы.ТабличнаяЧастьТоварыНоменклатура;
// Разрешаем редактирование текста для автоподбора
ЭлементПолеВвода.РедактироватьТекст = Истина;
// Если требуется выбор только из определенного списка, но с возможностью поиска
ЭлементПолеВвода.РежимВыбораИзСписка = Ложь;
КонецПроцедуры
Еще одна классическая ситуация, ставящая в тупик начинающих разработчиков — это работа с полями ввода, имеющими составной тип данных. Например, реквизит табличной части может принимать значения типов СправочникСсылка.Контрагенты и СправочникСсылка.ФизическиеЛица одновременно.
Когда такое поле является абсолютно пустым, платформа 1С изначально не знает, по какому именно объекту метаданных пользователь планирует осуществлять поиск при вводе текста с клавиатуры. В этот момент поле переходит в так называемый режим выбора типа, а рядом с ним появляется кнопка с буквой «Т».
До тех пор, пока тип данных не определен пользователем интерактивно или не задан программно, ввод любого текста с клавиатуры будет блокироваться платформой. Курсор при этом может находиться в поле и мигать, вводя пользователя в заблуждение.
Как решить эту проблему:
Рассмотрим пример кода, реализующий автоматическое заполнение типа при начале редактирования:
// Предопределение типа данных для составного реквизита при начале редактирования
&НаКлиенте
Процедура ТабличнаяЧастьПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
Если НоваяСтрока Тогда
ТекущиеДанные = Элементы.ТабличнаяЧасть.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
// Задаем пустую ссылку конкретного типа по умолчанию
ТекущиеДанные.Субъект = ПредопределенноеЗначение("Справочник.Контрагенты.ПустаяСсылка");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Давайте посмотрим на ситуацию глубже — на уровне свойств самих объектов конфигурации. У каждого справочника в конфигураторе на вкладке «Формы» есть свойство «Быстрый выбор» (возможные значения: Истина, Ложь, Авто).
Если для справочника включен быстрый выбор, то при нажатии на кнопку выбора в поле ввода на форме вместо открытия стандартной формы выбора открывается компактный выпадающий список. Если при этом у пользователя урезаны права или наложены сложные ограничения доступа на уровне записей (RLS), платформа 1С может некорректно обрабатывать фоновые запросы автоподбора при попытке ручного ввода текста. Это приводит к блокировке ввода символов с клавиатуры, оставляя доступным только выбор мышью из списка.
Попробуйте временно установить свойство «Быстрый выбор» в значение Ложь у целевого справочника в конфигураторе и проверить, решит ли это проблему для пользователей с ограниченными правами.
Бывают случаи, когда право Ввод по строке физически установлено в ролях пользователя, но проблема все равно сохраняется. Виновником здесь могут выступать некорректно настроенные шаблоны RLS (Row-Level Security).
Когда пользователь начинает вводить текст в поле, платформа выполняет неявный фоновый запрос к базе данных для поиска подходящих записей. Если запрос ограничения доступа RLS для этого справочника написан неоптимально, содержит ошибки или обращается к таблицам, к которым у текущего пользователя нет доступа, СУБД возвращает ошибку или пустой результат.
В некоторых версиях платформы 1С, во избежание генерации бесконечных фоновых ошибок и снижения производительности сервера, клиентское приложение превентивно отключает ввод с клавиатуры для этого поля в текущем сеансе работы пользователя. Проанализируйте шаблоны RLS, используемые в ролях пользователя, и убедитесь, что они работают быстро и без сбоев.
Вы провели все необходимые проверки, зашли в конфигуратор, добавили право «Ввод по строке» для нужной роли, сохранили изменения, но у конкретного пользователя на его рабочем месте проблема по-прежнему воспроизводится. В чем может быть дело?
Дело в том, что локальный кэш клиента 1С имеет свойство устаревать или обновляться некорректно. Клиентское приложение пользователя может использовать старую копию структуры прав доступа, «не зная» о ваших нововведениях в конфигураторе.
Для гарантированного решения этой проблемы выполните очистку кэша на компьютере пользователя одним из следующих способов:
%userprofile%\AppData\Local\1C\1Cv8%userprofile%\AppData\Roaming\1C\1Cv8После очистки кэша и повторного запуска программы права обновятся, и ввод текста с клавиатуры в проблемном поле заработает в штатном режиме.