Как убрать конкретный документ из меню «Ввод на основании» в 1С 8.2 (Обычные формы)

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В процессе разработки на платформе 1С:Предприятие 8.2 (особенно в конфигурациях на обычных формах, таких как УТ 10.3) часто возникает задача ограничить пользователю возможность создания документов на основании. Стандартная кнопка «Ввод на основании» формируется платформой автоматически, исходя из настроек метаданных. Однако иногда требуется не просто запретить ввод, а сделать это выборочно: например, скрыть кнопку только для определенного типа документа или запретить ввод, если по текущему основанию уже созданы все возможные чеки.

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

Способ 1: Изменение метаданных документа

Это самый простой и быстрый метод. Если вам необходимо, чтобы документ ЧекККМ никогда не появлялся в списке «Ввода на основании» для конкретного документа-родителя, мы можем изменить настройки самой конфигурации.

Проанализируем этот путь по шагам:

  1. Откроем дерево конфигурации и найдем подчиненный документ (в нашем случае ЧекККМ).
  2. Перейдем на закладку «Ввод на основании».
  3. В нижнем списке «Является основанием для» или в верхнем «Вводится на основании» (в зависимости от того, откуда мы хотим убрать связь) снимем галочку с соответствующего типа документа.

Важный нюанс: Посмотрим на последствия этого действия. После снятия галочки документ исчезнет из меню «Действия» -> «Ввод на основании». Однако это может повлиять на работу стандартного отчета «Структура подчиненности». Если документ перестанет быть «основанием» в метаданных, платформа может перестать автоматически связывать их в дереве документов. Чтобы этого избежать, убедитесь, что связь сохранена в КритерииОтбора.СвязанныеДокументы.

Способ 2: Программный отказ в «ОбработкеЗаполнения»

Если нам нужно оставить кнопку, но запретить создание документа при определенных условиях (например, если остаток товара по документу-основанию равен нулю), логично использовать модуль объекта. Рассмотрим, как это реализовать.

Выясним причину, по которой обычный Отказ = Истина не всегда работает в ОбработкеЗаполнения. В Обычных формах 1С 8.2 это событие предназначено для заполнения реквизитов, и оно не всегда блокирует последующее открытие формы нового объекта. Поэтому мы применим более надежную связку: Модуль объекта + Модуль формы.

В модуле объекта документа ЧекККМ пропишем проверку:


Процедура ОбработкаЗаполнения(Основание)
    // Проверяем, что основание нужного типа
    Если ТипЗнч(Основание) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
        // Здесь ваша бизнес-логика проверки
        Если ВсеТоварыУжеВыбраны(Основание) Тогда 
            // Используем ДополнительныеСвойства для передачи флага в форму
            ЭтотОбъект.ДополнительныеСвойства.Вставить("ОтказОтОткрытия", Истина);
            Возврат;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Теперь проанализируем ситуацию в модуле формы. Нам нужно «поймать» этот флаг перед тем, как пользователь увидит окно документа.

Способ 3: Передача флага отказа через «ДополнительныеСвойства»

Этот метод считается наиболее корректным с точки зрения архитектуры 1С. Мы связываем логику проверки данных в объекте с поведением интерфейса формы. Разберем по шагам реализацию в модуле формы документа.

В модуле формы (обычно это ФормаДокумента) найдем или создадим предопределенную процедуру ПередОткрытием:


Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    // Проверяем, есть ли в объекте наш флаг отказа
    Если ЭтотОбъект.ДополнительныеСвойства.Свойство("ОтказОтОткрытия") Тогда
        Если ЭтотОбъект.ДополнительныеСвойства.ОтказОтОткрытия = Истина Тогда
            Предупреждение("Все товары по данному основанию уже оформлены. Чек не требуется!");
            Отказ = Истина; // Блокируем открытие формы
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Использование ДополнительныеСвойства позволяет избежать создания лишних реквизитов в базе данных, так как эта коллекция существует только в оперативной памяти в момент работы с объектом.

Способ 4: Программное управление кнопками командной панели

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

Стоит учитывать, что в Обычных формах меню «Ввод на основании» часто вложено в подменю «Действия». Проанализируем, как добраться до нужной кнопки:


Процедура СкрытьВводНаОсновании()
    // Получаем командную панель (например, "ДействияФормы")
    Панель = ЭлементыФормы.ДействияФормы;
    
    // Ищем кнопку "Ввод на основании" (обычно это подменю)
    КнопкаВвод = Панель.Кнопки.Действия.Кнопки.ВвестиНаОсновании;
    
    // Перебираем вложенные кнопки подменю
    Для Каждого Подкнопка Из КнопкаВвод.Кнопки Цикл
        Если Подкнопка.Текст = "Чек ККМ" Тогда
            Подкнопка.Видимость = Ложь;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Важно: Этот метод требует осторожности, так как имена кнопок могут отличаться в разных версиях конфигураций или формироваться динамически платформой. Если кнопка создана платформой автоматически, ее программное удаление через ЭлементыФормы может быть затруднено, так как коллекция кнопок может обновляться после события ПриОткрытии.

Альтернативный вариант: Создание собственной кнопки

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

  1. Устанавливаем свойство командной панели «Автозаполнение» в значение Ложь (или вручную удаляем стандартную кнопку).
  2. Добавляем свою кнопку ДействиеЧекККМ.
  3. В обработчике нажатия пишем код вызова проверки и открытия формы:

Процедура КоманднаяПанельДействиеЧекККМ(Кнопка)
    // Проверка условий
    Если Не ПроверитьВозможностьСозданияЧека() Тогда
        Возврат;
    КонецЕсли;
    
    // Программный ввод на основании
    НовыйЧек = Документы.ЧекККМ.СоздатьДокумент();
    НовыйЧек.Заполнить(ЭтотОбъект.Ссылка);
    НовыйЧек.ПолучитьФорму().Открыть();
КонецПроцедуры

Подводя итог, можно сказать: если нужно просто «убрать» документ — используйте Метаданные. Если нужно «умное» поведение с проверками — используйте связку ОбработкаЗаполнения + ПередОткрытием через ДополнительныеСвойства. Это обеспечит чистоту кода и отсутствие лишних элементов в интерфейсе, сохраняя при этом целостность ссылочных связей в системе.

← На главную