В процессе разработки на платформе 1С:Предприятие 8.2 (особенно в конфигурациях на обычных формах, таких как УТ 10.3) часто возникает задача ограничить пользователю возможность создания документов на основании. Стандартная кнопка «Ввод на основании» формируется платформой автоматически, исходя из настроек метаданных. Однако иногда требуется не просто запретить ввод, а сделать это выборочно: например, скрыть кнопку только для определенного типа документа или запретить ввод, если по текущему основанию уже созданы все возможные чеки.
Разберем подробно несколько эффективных способов решения этой задачи: от изменения структуры метаданных до тонкой настройки программного кода в модулях объекта и формы.
Это самый простой и быстрый метод. Если вам необходимо, чтобы документ ЧекККМ никогда не появлялся в списке «Ввода на основании» для конкретного документа-родителя, мы можем изменить настройки самой конфигурации.
Проанализируем этот путь по шагам:
ЧекККМ).Важный нюанс: Посмотрим на последствия этого действия. После снятия галочки документ исчезнет из меню «Действия» -> «Ввод на основании». Однако это может повлиять на работу стандартного отчета «Структура подчиненности». Если документ перестанет быть «основанием» в метаданных, платформа может перестать автоматически связывать их в дереве документов. Чтобы этого избежать, убедитесь, что связь сохранена в КритерииОтбора.СвязанныеДокументы.
Если нам нужно оставить кнопку, но запретить создание документа при определенных условиях (например, если остаток товара по документу-основанию равен нулю), логично использовать модуль объекта. Рассмотрим, как это реализовать.
Выясним причину, по которой обычный Отказ = Истина не всегда работает в ОбработкеЗаполнения. В Обычных формах 1С 8.2 это событие предназначено для заполнения реквизитов, и оно не всегда блокирует последующее открытие формы нового объекта. Поэтому мы применим более надежную связку: Модуль объекта + Модуль формы.
В модуле объекта документа ЧекККМ пропишем проверку:
Процедура ОбработкаЗаполнения(Основание)
// Проверяем, что основание нужного типа
Если ТипЗнч(Основание) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
// Здесь ваша бизнес-логика проверки
Если ВсеТоварыУжеВыбраны(Основание) Тогда
// Используем ДополнительныеСвойства для передачи флага в форму
ЭтотОбъект.ДополнительныеСвойства.Вставить("ОтказОтОткрытия", Истина);
Возврат;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Теперь проанализируем ситуацию в модуле формы. Нам нужно «поймать» этот флаг перед тем, как пользователь увидит окно документа.
Этот метод считается наиболее корректным с точки зрения архитектуры 1С. Мы связываем логику проверки данных в объекте с поведением интерфейса формы. Разберем по шагам реализацию в модуле формы документа.
В модуле формы (обычно это ФормаДокумента) найдем или создадим предопределенную процедуру ПередОткрытием:
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
// Проверяем, есть ли в объекте наш флаг отказа
Если ЭтотОбъект.ДополнительныеСвойства.Свойство("ОтказОтОткрытия") Тогда
Если ЭтотОбъект.ДополнительныеСвойства.ОтказОтОткрытия = Истина Тогда
Предупреждение("Все товары по данному основанию уже оформлены. Чек не требуется!");
Отказ = Истина; // Блокируем открытие формы
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Использование ДополнительныеСвойства позволяет избежать создания лишних реквизитов в базе данных, так как эта коллекция существует только в оперативной памяти в момент работы с объектом.
Если ваша задача — именно скрыть пункт из меню программно, чтобы пользователь его даже не видел, нам придется поработать с элементами формы документа-основания. Посмотрим на пример кода, который перебирает кнопки командной панели.
Стоит учитывать, что в Обычных формах меню «Ввод на основании» часто вложено в подменю «Действия». Проанализируем, как добраться до нужной кнопки:
Процедура СкрытьВводНаОсновании()
// Получаем командную панель (например, "ДействияФормы")
Панель = ЭлементыФормы.ДействияФормы;
// Ищем кнопку "Ввод на основании" (обычно это подменю)
КнопкаВвод = Панель.Кнопки.Действия.Кнопки.ВвестиНаОсновании;
// Перебираем вложенные кнопки подменю
Для Каждого Подкнопка Из КнопкаВвод.Кнопки Цикл
Если Подкнопка.Текст = "Чек ККМ" Тогда
Подкнопка.Видимость = Ложь;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важно: Этот метод требует осторожности, так как имена кнопок могут отличаться в разных версиях конфигураций или формироваться динамически платформой. Если кнопка создана платформой автоматически, ее программное удаление через ЭлементыФормы может быть затруднено, так как коллекция кнопок может обновляться после события ПриОткрытии.
Часто программисты 1С прибегают к радикальному, но стабильному решению: отключить стандартную кнопку ввода на основании в свойствах командной панели и создать свою собственную кнопку (с иконкой и нужным текстом). Это позволяет полностью контролировать логику:
Ложь (или вручную удаляем стандартную кнопку).ДействиеЧекККМ.
Процедура КоманднаяПанельДействиеЧекККМ(Кнопка)
// Проверка условий
Если Не ПроверитьВозможностьСозданияЧека() Тогда
Возврат;
КонецЕсли;
// Программный ввод на основании
НовыйЧек = Документы.ЧекККМ.СоздатьДокумент();
НовыйЧек.Заполнить(ЭтотОбъект.Ссылка);
НовыйЧек.ПолучитьФорму().Открыть();
КонецПроцедуры
Подводя итог, можно сказать: если нужно просто «убрать» документ — используйте Метаданные. Если нужно «умное» поведение с проверками — используйте связку ОбработкаЗаполнения + ПередОткрытием через ДополнительныеСвойства. Это обеспечит чистоту кода и отсутствие лишних элементов в интерфейсе, сохраняя при этом целостность ссылочных связей в системе.