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