При интенсивной работе со справочниками в 1С:Предприятии 8.3 пользователи часто сталкиваются с необходимостью быстрого ввода большого количества элементов. Стандартный интерфейс предлагает два варианта: либо кнопку Записать и закрыть, которая возвращает пользователя в список, либо просто Записать, которая оставляет форму открытой. Однако для максимальной продуктивности часто требуется третья опция: "Записать текущий элемент, закрыть его окно и тут же открыть чистую форму для создания следующего".
В этой статье мы подробно разберем, как реализовать такой функционал, проанализируем различные подходы — от простых горячих клавиш до работы с командами и кнопками на управляемых формах — и выясним, как сделать работу пользователей максимально комфортной.
Прежде чем приступать к написанию кода, давайте проанализируем, какие механизмы уже заложены в платформу 1С:Предприятие. Начиная с версии 8.3.15, поведение форм во многом зависит от свойства справочника Способ редактирования. Рассмотрим ситуацию: если в настройках списка установлено значение "В списке", пользователь может добавлять новые записи, просто нажимая Enter. Это самый быстрый способ, так как он не требует открытия и закрытия отдельных окон.
Однако, если справочник имеет сложную структуру с множеством реквизитов, ввод в списке становится неудобным. В этом случае мы переходим к работе в диалоге. Здесь на помощь может прийти комбинация горячих клавиш. Как справедливо отмечено в обсуждениях, цикл Ctrl + Enter (записать и закрыть) и последующее нажатие Insert (создать новый) фактически решают задачу. Но для рядового пользователя такая двухшаговая комбинация часто оказывается сложной. Поэтому создание отдельной кнопки через штатные команды управляемого интерфейса — логичный шаг навстречу удобству. При этом важно понимать, что добавление реквизитов и элементов на управляемые формы может быть реализовано как через дизайнер, так и программно.
Рассмотрим основной технический способ решения задачи — создание собственной команды формы. Этот метод является наиболее гибким и правильным с точки зрения архитектуры управляемого приложения. Разберем этот процесс по шагам.
Во-первых, нам необходимо открыть форму элемента справочника в конфигураторе и перейти на закладку Команды. Создадим новую команду, назовем ее ЗаписатьЗакрытьИСоздатьНовый. После этого вынесем ее на командную панель формы. Для ускорения процесса разработки и соблюдения стандартов можно использовать общий модуль для программного изменения форм, содержащий вспомогательные функции для добавления команд.
Теперь проанализируем клиентский код, который должен выполняться при нажатии. Здесь важно учитывать принципы программного открытия форм, чтобы правильно инициализировать новое окно после записи текущего объекта.
Рассмотрим пример кода для обработки этой команды:
&НаКлиенте
Процедура ЗаписатьЗакрытьИСоздатьНовый(Команда)
// Пытаемся записать текущий объект.
// Метод Записать() на клиенте инициирует проверку заполнения и серверную запись.
Если Записать() Тогда
// Определяем имя типа справочника
ИмяСправочника = "Справочник.Контрагенты"; // Замите на имя вашего справочника
// Открываем форму нового элемента
ОткрытьФорму(ИмяСправочника + ".ФормаОбъекта");
// Закрываем текущую форму
Закрыть();
КонецЕсли;
КонецПроцедуры
В данном примере функция Записать() возвращает Истина, если объект успешно сохранен. Если же сработали проверки (например, не заполнено обязательное поле), платформа выдаст предупреждение, и код открытия новой формы не выполнится. Это критически важный момент, позволяющий избежать потери данных или создания "пустых" цепочек окон.
Часто при ручном вводе данных многие реквизиты в последовательно создаваемых элементах совпадают (например, "Группа номенклатуры" или "Основной поставщик"). Мы можем пойти дальше и реализовать механизм, который будет подставлять значения из только что закрытого элемента в новый.
Для этого важно понимать, как работают параметры заполнения и метод ЗначенияЗаполнения. Рассмотрим модифицированный код, который передает данные из текущего объекта в форму нового:
&НаКлиенте
Процедура ЗаписатьИСоздатьСКопированием(Команда)
// Подготовим структуру данных для нового элемента
ДанныеДляЗаполнения = Новый Структура;
ДанныеДляЗаполнения.Вставить("Родитель", Объект.Родитель);
ДанныеДляЗаполнения.Вставить("ТипЦен", Объект.ТипЦен);
ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ДанныеДляЗаполнения);
Если Записать() Тогда
ОткрытьФорму("Справочник.Номенклатура.ФормаОбъекта", ПараметрыФормы);
Закрыть();
КонецЕсли;
КонецПроцедуры
Этот подход значительно ускоряет работу, так как пользователю не приходится повторно выбирать одни и те же значения в иерархических или сильно детализированных справочниках.
Если вы работаете с типовым решением (например, 1С:ERP или 1С:Бухгалтерия), крайне не рекомендуется вносить изменения напрямую в конфигурацию. Это усложнит дальнейшие обновления. Оптимальным вариантом будет использование расширений конфигурации для реализации нашей задачи.
ЗаписатьИСоздатьНовый.Ctrl + Shift + S), чтобы опытные пользователи могли работать еще быстрее.&После или &Вместо, но для новой кнопки лучше использовать чистую процедуру команды.В обсуждениях на форумах иногда встречается совет использовать событие ПередЗакрытием. Давайте проанализируем эту ситуацию подробнее. Идея заключается в том, что если форма закрывается после нажатия стандартной кнопки Записать и закрыть, мы программно открываем новое окно. Иногда разработчики также пытаются внедрить самодельный обработчик ПослеЗаписи, чтобы гарантировать выполнение действий после завершения транзакции.
Однако мы считаем этот метод неудачным ("если не любишь пользователей"), так как он лишает человека выбора. Если пользователю действительно нужно было просто закрыть форму и вернуться в список, он будет раздражен внезапно открывшимся новым окном. Поэтому явная кнопка в интерфейсе — гораздо более профессиональное и предсказуемое решение.
Мы рассмотрели несколько способов реализации функционала "Записать и создать новый". Наиболее эффективным является создание отдельной команды формы с проверкой результата метода Записать(). Мы также выяснили, что передача параметров через ЗначенияЗаполнения может еще сильнее оптимизировать трудозатраты сотрудников.
Помните, что интерфейсные решения должны быть интуитивно понятными, а валидация данных и метод Записать должны всегда предшествовать открытию новых форм. Добавление горячих клавиш для созданной кнопки и использование расширений для сохранения чистоты конфигурации — это лучшие практики разработки в среде 1С:Предприятие 8.3.
Для более глубокого изучения темы рекомендуем ознакомиться со следующими материалами: