Как реализовать кнопку "Записать, закрыть и создать новый" в справочнике 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интенсивной работе со справочниками в 1С:Предприятии 8.3 пользователи часто сталкиваются с необходимостью быстрого ввода большого количества элементов. Стандартный интерфейс предлагает два варианта: либо кнопку Записать и закрыть, которая возвращает пользователя в список, либо просто Записать, которая оставляет форму открытой. Однако для максимальной продуктивности часто требуется третья опция: "Записать текущий элемент, закрыть его окно и тут же открыть чистую форму для создания следующего".

В этой статье мы подробно разберем, как реализовать такой функционал, проанализируем различные подходы — от простых горячих клавиш до работы с командами и кнопками на управляемых формах — и выясним, как сделать работу пользователей максимально комфортной.

Разберем стандартные возможности платформы

Прежде чем приступать к написанию кода, давайте проанализируем, какие механизмы уже заложены в платформу 1С:Предприятие. Начиная с версии 8.3.15, поведение форм во многом зависит от свойства справочника Способ редактирования. Рассмотрим ситуацию: если в настройках списка установлено значение "В списке", пользователь может добавлять новые записи, просто нажимая Enter. Это самый быстрый способ, так как он не требует открытия и закрытия отдельных окон.

Однако, если справочник имеет сложную структуру с множеством реквизитов, ввод в списке становится неудобным. В этом случае мы переходим к работе в диалоге. Здесь на помощь может прийти комбинация горячих клавиш. Как справедливо отмечено в обсуждениях, цикл Ctrl + Enter (записать и закрыть) и последующее нажатие Insert (создать новый) фактически решают задачу. Но для рядового пользователя такая двухшаговая комбинация часто оказывается сложной. Поэтому создание отдельной кнопки через штатные команды управляемого интерфейса — логичный шаг навстречу удобству. При этом важно понимать, что добавление реквизитов и элементов на управляемые формы может быть реализовано как через дизайнер, так и программно.

Реализация команды "Записать и создать новый" через программный код

Рассмотрим основной технический способ решения задачи — создание собственной команды формы. Этот метод является наиболее гибким и правильным с точки зрения архитектуры управляемого приложения. Разберем этот процесс по шагам.

Во-первых, нам необходимо открыть форму элемента справочника в конфигураторе и перейти на закладку Команды. Создадим новую команду, назовем ее ЗаписатьЗакрытьИСоздатьНовый. После этого вынесем ее на командную панель формы. Для ускорения процесса разработки и соблюдения стандартов можно использовать общий модуль для программного изменения форм, содержащий вспомогательные функции для добавления команд.

Теперь проанализируем клиентский код, который должен выполняться при нажатии. Здесь важно учитывать принципы программного открытия форм, чтобы правильно инициализировать новое окно после записи текущего объекта.

Рассмотрим пример кода для обработки этой команды:


&НаКлиенте
Процедура ЗаписатьЗакрытьИСоздатьНовый(Команда)
    
    // Пытаемся записать текущий объект. 
    // Метод Записать() на клиенте инициирует проверку заполнения и серверную запись.
    Если Записать() Тогда
        
        // Определяем имя типа справочника
        ИмяСправочника = "Справочник.Контрагенты"; // Замите на имя вашего справочника
        
        // Открываем форму нового элемента
        ОткрытьФорму(ИмяСправочника + ".ФормаОбъекта");
        
        // Закрываем текущую форму
        Закрыть();
        
    КонецЕсли;

КонецПроцедуры

В данном примере функция Записать() возвращает Истина, если объект успешно сохранен. Если же сработали проверки (например, не заполнено обязательное поле), платформа выдаст предупреждение, и код открытия новой формы не выполнится. Это критически важный момент, позволяющий избежать потери данных или создания "пустых" цепочек окон.

Оптимизация ввода: использование параметров заполнения

Часто при ручном вводе данных многие реквизиты в последовательно создаваемых элементах совпадают (например, "Группа номенклатуры" или "Основной поставщик"). Мы можем пойти дальше и реализовать механизм, который будет подставлять значения из только что закрытого элемента в новый.

Для этого важно понимать, как работают параметры заполнения и метод ЗначенияЗаполнения. Рассмотрим модифицированный код, который передает данные из текущего объекта в форму нового:


&НаКлиенте
Процедура ЗаписатьИСоздатьСКопированием(Команда)
    
    // Подготовим структуру данных для нового элемента
    ДанныеДляЗаполнения = Новый Структура;
    ДанныеДляЗаполнения.Вставить("Родитель", Объект.Родитель);
    ДанныеДляЗаполнения.Вставить("ТипЦен", Объект.ТипЦен);
    
    ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ДанныеДляЗаполнения);
    
    Если Записать() Тогда
        ОткрытьФорму("Справочник.Номенклатура.ФормаОбъекта", ПараметрыФормы);
        Закрыть();
    КонецЕсли;

КонецПроцедуры

Этот подход значительно ускоряет работу, так как пользователю не приходится повторно выбирать одни и те же значения в иерархических или сильно детализированных справочниках.

Использование расширений для сохранения типовой конфигурации

Если вы работаете с типовым решением (например, 1С:ERP или 1С:Бухгалтерия), крайне не рекомендуется вносить изменения напрямую в конфигурацию. Это усложнит дальнейшие обновления. Оптимальным вариантом будет использование расширений конфигурации для реализации нашей задачи.

  1. Создайте новое расширение и добавьте в него нужный справочник и его форму элемента.
  2. В расширении добавьте аналогичную команду ЗаписатьИСоздатьНовый.
  3. Для кнопки в расширении можно назначить сочетание клавиш (например, Ctrl + Shift + S), чтобы опытные пользователи могли работать еще быстрее.
  4. Добавьте код в модуль формы расширения. Обратите внимание, что при использовании расширений вы можете перехватывать стандартные события формы, используя аннотации &После или &Вместо, но для новой кнопки лучше использовать чистую процедуру команды.

Анализ альтернативного метода через событие "ПередЗакрытием"

В обсуждениях на форумах иногда встречается совет использовать событие ПередЗакрытием. Давайте проанализируем эту ситуацию подробнее. Идея заключается в том, что если форма закрывается после нажатия стандартной кнопки Записать и закрыть, мы программно открываем новое окно. Иногда разработчики также пытаются внедрить самодельный обработчик ПослеЗаписи, чтобы гарантировать выполнение действий после завершения транзакции.

Однако мы считаем этот метод неудачным ("если не любишь пользователей"), так как он лишает человека выбора. Если пользователю действительно нужно было просто закрыть форму и вернуться в список, он будет раздражен внезапно открывшимся новым окном. Поэтому явная кнопка в интерфейсе — гораздо более профессиональное и предсказуемое решение.

Подведем итоги

Мы рассмотрели несколько способов реализации функционала "Записать и создать новый". Наиболее эффективным является создание отдельной команды формы с проверкой результата метода Записать(). Мы также выяснили, что передача параметров через ЗначенияЗаполнения может еще сильнее оптимизировать трудозатраты сотрудников.

Помните, что интерфейсные решения должны быть интуитивно понятными, а валидация данных и метод Записать должны всегда предшествовать открытию новых форм. Добавление горячих клавиш для созданной кнопки и использование расширений для сохранения чистоты конфигурации — это лучшие практики разработки в среде 1С:Предприятие 8.3.

Для более глубокого изучения темы рекомендуем ознакомиться со следующими материалами:

← На главную