При переходе с платформы «1С:Предприятие 7.7» на версии 8.2 и 8.3 многие разработчики и пользователи сталкиваются с изменением привычного интерфейсного поведения. Одним из таких неудобств часто называют необходимость заполнения реквизитов нового элемента справочника в отдельном всплывающем (диалоговом) окне. В старых версиях системы была возможность быстро вносить данные прямо в строки таблицы. Для справочников с малым количеством реквизитов (например, «Валюты», где нужно заполнить только код, наименование и страну) открытие полноценной формы элемента кажется избыточным действием, замедляющим массовый ввод.
В рамках этой статьи мы подробно разберем, как решить эту задачу. Мы проанализируем возможности классического (обычного) приложения, где данная функция поддерживается платформой штатно, а также детально рассмотрим современные обходные пути для управляемого приложения (управляемых форм), в котором динамические списки накладывают жесткие ограничения на интерактивное редактирование.
Если вы работаете в режиме обычного приложения (или поддерживаете старую конфигурацию), задача решается стандартными средствами конфигурирования без написания сложного программного кода. Платформа 1С содержит встроенное свойство объекта метаданных, отвечающее за поведение при создании и редактировании элементов.
Разберем по шагам, как активировать эту возможность:
Валюты).В диалоге).В списке или Обеими способами.Важное примечание: Как справедливо заметил автор темы на форуме, если это свойство недоступно для изменения или не отображается в палитре свойств, необходимо проверить настройки совместимости и режимы запуска приложения. Для этого перейдем в меню Сервис — Параметры, на вкладке Общие убедимся, что установлены флаги для работы как с управляемым, так и с обычным приложением.
При выборе значения В списке при нажатии клавиши Ins (Добавить) система не будет вызывать диалоговое окно формы элемента. Вместо этого в табличном поле списка справочника появится новая пустая строка, в которой пользователь сможет последовательно заполнить все доступные колонки (код, наименование и другие реквизиты) и сохранить элемент нажатием клавиши Enter.
В современных конфигурациях 1С (ERP, УТ, КА, БП 3.0), работающих на управляемом интерфейсе, основным средством отображения списков является элемент формы Динамический список (связанный с типом данных ДинамическийСписок). На уровне платформы разработчики 1С заблокировали возможность прямого интерактивного добавления и редактирования ссылочных данных непосредственно внутри строк динамического списка.
Даже если в свойствах справочника выставить способ редактирования В списке, динамический список проигнорирует эту настройку. Это сделано намеренно по следующим причинам:
ПередЗаписью). Интерактивное редактирование «на лету» в таблице усложняет контроль целостности данных.Тем не менее, если бизнес-требования требуют быстрого ввода без открытия дополнительных окон в управляемом приложении, мы можем реализовать это программно. Рассмотрим три надежных архитектурных сценария.
Этот способ идеально подходит для небольших справочников (таких как валюты, единицы измерения, ставки НДС), объем данных в которых заведомо невелик (до нескольких сотен элементов). Мы отказываемся от динамического списка в пользу обычной таблицы значений на форме, которая поддерживает редактирование прямо в строках.
Разберем по шагам алгоритм реализации:
ТаблицаЗначений (назовем его ТаблицаЭлементов). Добавим в эту таблицу колонки: Ссылка (тип: ссылка на наш справочник), Код, Наименование, Страна.ТолькоПросмотр и установив флаги РазрешитьВводСтрок, ИзменятьСоставСтрок).
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Заполняем таблицу значений данными из базы данных
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Валюты.Ссылка КАК Ссылка,
| Валюты.Код КАК Код,
| Валюты.Наименование КАК Наименование,
| Валюты.Страна КАК Страна
|ИЗ
| Справочник.Валюты КАК Валюты";
РезультатЗапроса = Запрос.Выполнить();
ТаблицаЭлементов.Загрузить(РезультатЗапроса.Выгрузить());
КонецПроцедуры
Теперь нам необходимо обрабатывать сохранение данных. Для этого настроим событие таблицы формы ПриОкончанииРедактирования. В этом обработчике мы программно создадим или обновим элемент справочника в базе данных:
&НаКлиенте
Процедура ТаблицаЭлементовПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
Если ОтменаРедактирования Тогда
Возврат;
КонецЕсли;
ТекущаяСтрока = Элементы.ТаблицаЭлементов.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
// Передаем строку на сервер для записи в базу данных
СтруктураДанных = Новый Структура("Ссылка, Код, Наименование, Страна",
ТекущаяСтрока.Ссылка, ТекущаяСтрока.Код, ТекущаяСтрока.Наименование, ТекущаяСтрока.Страна);
СсылкаНаОбъект = ЗаписатьЭлементСправочникаНаСервере(СтруктураДанных);
// Записываем полученную ссылку обратно в строку таблицы значений
ТекущаяСтрока.Ссылка = СсылкаНаОбъект;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗаписатьЭлементСправочникаНаСервере(ДанныеСтроки)
Если ЗначениеЗаполнено(ДанныеСтроки.Ссылка) Тогда
// Редактируем существующий элемент
ОбъектСправочника = ДанныеСтроки.Ссылка.ПолучитьОбъект();
Иначе
// Создаем новый элемент справочника
ОбъектСправочника = Справочники.Валюты.СоздатьЭлемент();
КонецЕсли;
ОбъектСправочника.Код = ДанныеСтроки.Код;
ОбъектСправочника.Наименование = ДанныеСтроки.Наименование;
ОбъектСправочника.Страна = ДанныеСтроки.Страна;
Попытка
ОбъектСправочника.Записать();
Возврат ОбъектСправочника.Ссылка;
Исключение
ВызватьИсключение "Ошибка сохранения элемента: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
КонецФункции
Этот подход полностью имитирует работу «как в 7.7», обеспечивая мгновенную реакцию интерфейса без всплывающих окон.
Если справочник крупный и мы обязаны использовать динамический список (для поддержки отборов, поиска и постраничной навигации), лучшим решением будет создание компактной панели быстрого ввода непосредственно над списком элементов.
Разберем этот метод по шагам:
ГруппаБыстрыйВвод).БыстрыйКод (строка), БыстроеНаименование (строка), БыстраяСтрана (ссылка на классификатор стран или строка). Разместим соответствующие поля ввода внутри нашей группы.ДобавитьЭлементБыстро.Напишем обработчик для выполнения этой команды:
&НаКлиенте
Процедура ДобавитьЭлементБыстро(Команда)
// Первичная проверка заполнения обязательных полей
Если Не ЗначениеЗаполнено(БыстроеНаименование) Тогда
ПоказатьПредупреждение(, "Пожалуйста, заполните наименование валюты!");
Возврат;
КонецЕсли;
// Программное создание элемента на сервере
НоваяСсылка = СоздатьНовуюВалютуНаСервере(БыстрыйКод, БыстроеНаименование, БыстраяСтрана);
Если ЗначениеЗаполнено(НоваяСсылка) Тогда
// Очищаем поля ввода для следующего элемента
БыстрыйКод = "";
БыстроеНаименование = "";
БыстраяСтрана = Неопределено;
// Обновляем динамический список, чтобы новый элемент появился на экране
Элементы.Список.Обновить();
// Позиционируем курсор на созданном элементе справочника
Элементы.Список.ТекущаяСтрока = НоваяСсылка;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция СоздатьНовуюВалютуНаСервере(Код, Наименование, Страна)
НоваяВалюта = Справочники.Валюты.СоздатьЭлемент();
НоваяВалюта.Код = Код;
НоваяВалюта.Наименование = Наименование;
НоваяВалюта.Страна = Страна;
Попытка
НоваяВалюта.Записать();
Возврат НоваяВалюта.Ссылка;
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось создать валюту: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат Неопределено;
КонецПопытки;
КонецФункции
Этот вариант невероятно удобен для операторов ввода данных: взгляд пользователя сфокусирован на одной форме, руки остаются на клавиатуре, а данные создаются в базе мгновенно.
Если мы хотим, чтобы привычная клавиша Ins срабатывала штатно, но вместо громоздкой формы открывалось легкое диалоговое окно ввода значений, мы можем использовать событие динамического списка ПередНачаломДобавления.
Рассмотрим пример реализации:
ПередНачаломДобавления.
&НаКлиенте
Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, ПараметрыКопирования)
// Отменяем стандартное открытие карточки нового элемента
Отказ = Истина;
// Опишем структуру параметров для передачи в легкую форму ввода
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимБыстрогоВвода", Истина);
// Открываем вспомогательную мини-форму в немодальном режиме
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВводаДанныхВалюты", ЭтотОбъект);
ОткрытьФорму("Справочник.Валюты.Форма.ФормаБыстрогоВвода", ПараметрыФормы, ЭтотОбъект, , , , ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВводаДанныхВалюты(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат; // Пользователь отказался от ввода
КонецЕсли;
// Результат вернет структуру с заполненными реквизитами
Элементы.Список.Обновить();
Элементы.Список.ТекущаяСтрока = Результат.Ссылка;
КонецПроцедуры
Как показало обсуждение на форуме, в процессе проектирования бизнес-логики задача может кардинально измениться. Если справочник (например, те же «Валюты») должен содержать строго фиксированный перечень значений (RUB, USD, EUR), которые создаются один раз при развертывании базы данных в виде предопределенных элементов, то возможность создавать новые элементы пользователям вообще не требуется.
В этом случае, чтобы защитить систему от некорректного ручного ввода и убрать лишние раздражающие факторы (включая реакцию на случайное нажатие клавиши Ins), мы можем полностью заблокировать интерактивное редактирование:
Список) найдем свойство ТолькоПросмотр и установим его в значение Истина.РазрешитьВводСтрок и ИзменятьСоставСтрок.Теперь при нажатии клавиши Ins или двойном клике система будет игнорировать эти действия или просто открывать карточку предопределенного элемента в режиме чтения, не вводя пользователя в заблуждение пустыми диалоговыми окнами.
Подведем итоги: В зависимости от версии платформы и архитектуры решения, задача обхода стандартных диалоговых окон решается либо через свойство метаданных справочника (в обычных формах), либо через программные механизмы подмены динамического списка таблицей значений или вынесением панели быстрого ввода (в управляемых формах 1С 8.3). Выбирайте вариант, наиболее подходящий под ваши задачи и стандарты разработки!