gifts2017

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Все.

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

Всем удачи.

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

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

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

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

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

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

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