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