Создание связных объектов, как аналог "Создания на основании" в конфигурациях на основе БСП

Не все знают, что конфигурации на основе БСП (УТ 11, БП 3.0, ЗУП 3.0 и т.д.) имеют механизм, который позволяет создавать связанные объекты, что в какой-то мере является аналогом создания на основании.

Понятно, что многие гуру знают об этой возможности, но статья все же не для них. Предупреждаю сразу. :)

Есть разные виды внешних отчетов и обработок:

// Вид - строка - возможные значения:
// "ДополнительнаяОбработка"
// "ДополнительныйОтчет"
// "ЗаполнениеОбъекта"
// "Отчет"
// "ПечатнаяФорма"
// "СозданиеСвязанныхОбъектов"

Поговорим о последнем виде... Как оказалось - это достаточно мощная возможность добавить новый функционал без необходимости непосредственного изменения конфигурации. Лучше всего рассмотрим на примере:

Мне была поставлена следующая задача.

Задача: Есть УТ 11, с одним складом и несколькими складскими помещениями и ордерной схемой работы. При закупке имеем следующее:

Заказ поставщику → Поступление товаров → Приходный ордер (центральное помещение) → [?] Перемещение (в другие помещения)

И все бы хорошо, но на последнем шаге, после того, как товар будет оприходован в центральное помещение, его начинают перемещать в другие помещения в рамках одного склада. Т.е. документ "Перемещение товаров" не сделать, все необходимо делать с помощью "Ордера на перемещение товаров", который выпадает из схемы закупки. И так получается, что этот документ нельзя создать на основании "Приходного ордера", или документа "Поступление товаров". Подходим к вопросу о том, как это сделать.

Необходимо: Добавить возможность создания документа "Ордер на перемещение товаров" на основании "Приходного ордера".


Функция СведенияОВнешнейОбработке() Экспорт

   
ПараметрыРегистрации = Новый Структура;

   
// Добавим куда нужно вставить возможность создания на основании
   
МассивНазначений = Новый Массив;
   
МассивНазначений.Добавить("Документ.ПриходныйОрдерНаТовары");

   
ПараметрыРегистрации.Вставить("Вид"             , "СозданиеСвязанныхОбъектов");
   
ПараметрыРегистрации.Вставить("Назначение"      , МассивНазначений);
   
ПараметрыРегистрации.Вставить("Наименование"    , "Создать ордер на перемещение товаров на основании приходного ордера");
   
ПараметрыРегистрации.Вставить("Версия"          , "1.0");
   
ПараметрыРегистрации.Вставить("БезопасныйРежим" , Истина);
   
ПараметрыРегистрации.Вставить("Информация"      , "Дополнительная обработка");

   
ТаблицаКоманд = ПолучитьТаблицуКоманд();

   
// Добавим команду
   
ДобавитьКоманду(
       
ТаблицаКоманд,
       
"Ордер на перемещение товаров",
       
"Ордер на перемещение товаров",
       
"ВызовКлиентскогоМетода",
        Истина
    );

   
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);

    Возврат
ПараметрыРегистрации;

КонецФункции

Функция
ПолучитьТаблицуКоманд()

   
Команды = Новый ТаблицаЗначений;
   
Команды.Колонки.Добавить("Представление"        , Новый ОписаниеТипов("Строка"));
   
Команды.Колонки.Добавить("Идентификатор"        , Новый ОписаниеТипов("Строка"));
   
Команды.Колонки.Добавить("Использование"        , Новый ОписаниеТипов("Строка"));
   
Команды.Колонки.Добавить("ПоказыватьОповещение" , Новый ОписаниеТипов("Булево"));
   
Команды.Колонки.Добавить("Модификатор"          , Новый ОписаниеТипов("Строка"));

    Возврат
Команды;

КонецФункции

Процедура
ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Истина, Модификатор = "")

   
НоваяКоманда                      = ТаблицаКоманд.Добавить();
   
НоваяКоманда.Представление        = Представление;
   
НоваяКоманда.Идентификатор        = Идентификатор;
   
НоваяКоманда.Использование        = Использование;
   
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
   
НоваяКоманда.Модификатор          = Модификатор;

КонецПроцедуры


Добавляем форму, в которой описываем перезаполнение:


&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив, СозданныеОбъекты) Экспорт

   
//Переберем все выбранные документы на основании, которых будет созданы другие новые документы
   
Для каждого Элемент из ОбъектыНазначенияМассив Цикл

       
//Получая форму объекта создаваемого документа
       
ФормаДок = ПолучитьФорму("Документ.ОрдерНаПеремещениеТоваров.ФормаОбъекта");

       
//Далее мы получаем объект только, что созданной формы и помещаем её в переменную
        //В объекте содержатся все реквизиты (элементы) формы
       
ДанныеФормы = ФормаДок.Объект;

       
//Мы помещаем объект формы в переменную,
        //так как должны передать её в процедуру на сервере,
        //где нельзя изменять объект формы, зато можно править переменную содержащую его
       
СоздатьНовыйДокумент(Элемент, ДанныеФормы);

       
//После выполнения процедуры на сервере мы получаем изменную переменную ДанныеФормы,
        //которую необходимо передать в уже созданную нами форму
       
КопироватьДанныеФормы(ДанныеФормы, ФормаДок.Объект);

       
//Открываем результат выполнения обработки
       
ФормаДок.Открыть();

    КонецЦикла;

КонецПроцедуры

&НаСервере
Процедура СоздатьНовыйДокумент(Элемент, НовыйОбъект)

   
// Заполняем
   
Основание             = Элемент.Ссылка;

   
НовыйОбъект.Дата         = ТекущаяДата();
   
НовыйОбъект.Склад         = Основание.Склад;
   
НовыйОбъект.ПомещениеОтправитель= Основание.Помещение;

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

КонецПроцедуры


Все!
Добавляем в дополнительные отчеты и обработки и можем работать! Все получилось достаточно просто и быстро.
Всем удачи.

Скриншоты

Файлы

НаименованиеДатаРазмер
Создание ордера на перемещение на основании приходного ордера 12.02.20 5.01 КБ Скачать
 15.03.2016 
 Автор:
 БСП, создание на основании, внешние отчеты и обработки


Системные решения для 1С
Создание связных объектов, как аналог "Создания на основании" в конфигурациях на основе БСП
SoftOnIT.RU
Не все знают, что конфигурации на основе БСП (УТ 11, БП 3.0, ЗУП 3.0 и т.д.) имеют механизм, который позвол... 2020-02-12T12:55:21+03:00
Создание связных объектов, как аналог "Создания на основании" в конфигурациях на основе БСП
Создание связных объектов, как аналог "Создания на основании" в конфигурациях на основе БСП
https://softonit.ru

Возврат к списку