Почему не отображается кнопка «Ввод на основании» в расширениях 1С и как реализовать этот механизм вручную?

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

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

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

Выясняем причину: почему стандартный механизм дает сбой?

Для начала проанализируем техническую сторону вопроса. Стандартный механизм «Ввод на основании» опирается на дерево метаданных и системные коллекции. В версиях платформы (особенно до 8.3.15) существуют определенные ограничения в работе расширений:

  1. Ограничение типа «ЛюбаяСсылка»: Тип ЛюбаяСсылка, используемый в основной конфигурации, не включает в себя типы объектов, созданных в расширениях. Если системная группа команд «Создать на основании» пытается динамически построить список доступных документов, она может просто «не увидеть» ваши новые объекты.
  2. Инициализация командного интерфейса: Автоматические команды формы формируются на сервере в момент её создания. Если документ-приемник или документ-источник находятся в расширении, платформа не всегда корректно связывает их в стандартных группах команд, особенно если форма в основной конфигурации не является автогенерируемой.
  3. Права доступа в расширении: Даже если вы добавили роль с полными правами в расширение, необходимо убедиться, что для конкретного документа разрешено использование стандартных команд.

Рассмотрим ситуацию, когда проверка прав и настроек метаданных не помогла. В этом случае нам на помощь приходит программная реализация задачи.

Шаг 1. Проверка прав и настроек видимости

Прежде чем переходить к написанию кода, давайте исключим самые простые причины. Проверим следующие пункты:

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

Шаг 2. Создание пользовательской команды «Ввод на основании»

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

  1. В расширении найдем наш документ-приемник (который мы хотим создавать).
  2. Перейдем в ветку «Команды» и добавим новую команду, например, СоздатьНаОснованииЗКМ_Выкуп.
  3. В свойствах команды укажем «Группа»: Форма командная панель / Важное или Форма командная панель / Создать на основании.
  4. Установим «Тип параметра команды»: выберем тот документ из основной конфигурации или расширения, который будет являться источником (основанием).
  5. Режим использования параметра выберем Одиночный.

Теперь нам нужно написать обработчик этой команды. Нажмем на лупу в поле «Модуль команды».

Шаг 3. Программный вызов формы нового документа

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

Рассмотрим пример кода:


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

В данном коде ПараметрКоманды содержит ссылку на объект, из которого мы вызываем создание. Мы упаковываем эту ссылку в структуру с ключом "Основание" и передаем её функции ОткрытьФорму.

Шаг 4. Реализация логики заполнения в модуле объекта

После того как форма открыта, управление передается на сервер в модуль объекта создаваемого документа. Нам необходимо перехватить данные заполнения. Для этого в расширении добавим модуль объекта документа-приемника и создадим (или расширим через &Вместо или &Перед) процедуру ОбработкаЗаполнения.

Разберем, как это реализовать:


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

Использование аннотации &После позволяет нам добавить свою логику заполнения, не нарушая работу стандартных механизмов, если они вдруг когда-нибудь «проснутся» или если документ создается другими способами.

Важные нюансы при работе с расширениями

Проанализируем еще несколько моментов, которые могут помешать корректной работе:

Итоги

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

Наиболее надежным решением в данной ситуации является создание собственной команды в расширении. Рассмотрим кратко основные преимущества этого метода:

  1. Гарантированная видимость: Вы сами определяете, в какой группе команд и для каких пользователей будет видна кнопка.
  2. Гибкость: Вы можете передать в форму не только основание, но и любые дополнительные параметры (складки, цены, ответственных).
  3. Чистота кода: Вы не вносите изменения в формы основной конфигурации, сохраняя возможность легкого обновления системы.

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

← На главную