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

Опубликовал Виталий Барилко (Diversus) в раздел Обработки - Обработка документов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив, СозданныеОбъекты) Экспорт
	
	//Переберем все выбранные документы на основании, которых будет созданы другие новые документы
	Для каждого Элемент из ОбъектыНазначенияМассив Цикл	
		
		//Получая форму объекта создаваемого документа
		ФормаДок = ПолучитьФорму("Документ.ОрдерНаПеремещениеТоваров.ФормаОбъекта"); 
		
		//Далее мы получаем объект только, что созданной формы и помещаем её в переменную
		//В объекте содержатся все реквизиты (элементы) формы
		ДанныеФормы = ФормаДок.Объект; 
		
		//Мы помещаем объект формы в переменную, 
		//так как должны передать её в процедуру на сервере,
		//где нельзя изменять объект формы, зато можно править переменную содержащую его
		СоздатьНовыйДокумент(Элемент, ДанныеФормы);
		
		//После выполнения процедуры на сервере мы получаем изменную переменную ДанныеФормы,
		//которую необходимо передать в уже созданную нами форму
		КопироватьДанныеФормы(ДанныеФормы, ФормаДок.Объект);
		
		//Открываем результат выполнения обработки
		ФормаДок.Открыть();
		
	КонецЦикла;	
	
КонецПроцедуры

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


Все.

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

Всем удачи.

Скачать файлы

Наименование Файл Версия Размер
Создание ордера на перемещение на основании приходного ордера
.epf 7,30Kb
26.06.15
9
.epf 1.0 7,30Kb 9 Скачать

См. также

Комментарии
1. tixis1c tixis1c (qwed557) 26 27.06.15 09:02 Сейчас в теме
Автор, перед публикацией проверял какие тексты выложил? 2 раза Модуль подключения внешней обработки ))
u_n_k_n_o_w_n; seermak; +2 Ответить 1
2. Виталий Барилко (Diversus) 2257 27.06.15 12:57 Сейчас в теме
(1) qwed557, хех действительно :)
Исправил спасибо.
3. Яков Коган (Yashazz) 2036 28.06.15 22:21 Сейчас в теме
Гуру не гуру, но некоторые интересные спецэффекты БСП при использовании этой фишки есть. Но примеры сделаны грамотно.

В своё время я собирался сделать полный обзор всех 6 вариантов подключения-запуска применительно ко всем режимам команд. Но быстрые и зачастую кардинальные изменения БСП заставили отложить. Опять же, для любознательных, советую посмотреть, как себя ведут некоторые режимы запуска при запрете на модальность. Забавно выходит)
4. Игорь Фелькер (Brawler) 293 29.06.15 08:27 Сейчас в теме
(3) Yashazz, изменения в БСП 2.3.1?
Столкнулся с тем что умерли все обработки типа заполнения объектов как только обновил тестовую базу БП до 3.0.41

Так бы вообще не против почитать материал по вшешним обработкам, но уже применительно к БСП 2.3.1

По самой публикации замечание.
Все же считаю, что некорректно реализовывать внешние обработки и городить при этом свои методы ПолучитьТаблицуКоманд и ДобавитьКоманду, а так же в СведенияОВнешнейОбработке создавать структуру параметров регистрации самому.

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

О чем стоит конечно же указывать!
5. Виталий Барилко (Diversus) 2257 29.06.15 10:44 Сейчас в теме
(4) Brawler, почему нет? Логика самой 1С v8 - максимальная функциональность и унификация. Очень часто есть общие модули с одним единственным методом, создание переопределяемых модулей там где это не нужно, системные объекты конфигурации, назначение которых с первого взгляда абсолютно не понятно и т.д. Такова логика: добавить побольше, авось завтра пригодиться. Эта обработка не исключение... С этим можно спорить, но тем не менее хуже от этого не будет. Да и если завтра вдруг надо будет расширить и добавить еще что-то, то все уже готово для этого.
wolfsoft; Yashazz; +2 Ответить
6. Марина Чирина (chmv) 06.07.15 11:25 Сейчас в теме
а ввод на основании вроде же работает?
7. Виталий Барилко (Diversus) 2257 06.07.15 13:10 Сейчас в теме
(6) chmv, нет, не работает. Для нашей задачи ввод на основании не работает.
8. г. Казань Рустем Гумеров (Rustig) 790 07.07.15 12:02 Сейчас в теме
9. Виталий Барилко (Diversus) 2257 07.07.15 12:50 Сейчас в теме
Оставьте свое сообщение