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

26.06.15

Разработка - БСП (Библиотека стандартных подсистем)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Все.

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

Всем удачи.

УТ11 БСП СозданиеСвязанныхОбъектов создание связных объектов создание на основании

См. также

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    1282    dimanich70    6    

13

Заполнение поля адреса в своей обработке [БСП]

Механизмы платформы 1С БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Небольшая шпаргалка по функциям БСП касательно адреса. Так скажем, еще один способ помимо https://infostart.ru/1c/articles/1060970/

12.02.2024    687    FilippovRI    0    

15

Расширяем возможности дополнительных обработок и настраиваем их отладку

БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Уже не одна веб-страница исписана знаниями о дополнительных обработках, как создать, как подключить. Есть масса вариантов, как их можно отладить. Я разобрался в кишках работы библиотеки и покажу, как можно расширить возможности дополнительных отчетов, а также покажу удобный способ отладки.

07.02.2024    2351    YA_418728146    11    

40

1С:БСП Дополнительные реквизиты и сведения

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Бесплатно (free)

В этой статье расскажем об архитектуре, использовании и особенностях реализации подсистемы «Свойства» из инструментария разработчика «1С:Библиотека стандартных подсистем» (1С: БСП).

19.01.2024    5161    PROSTO-1C    5    

45

Бесплатный митап 9 февраля «Библиотеки и фреймворки на 1С и всё, что с этим связано»

БСП (Библиотека стандартных подсистем) Мероприятия Бесплатно (free)

Митап посвящен вопросам создания, использования и поддержке переиспользуемого кода при разработке решений на платформе 1С:Предприятие 8.

15.01.2024    3798    0    Infostart    0    

20

Шаблоны новых объектов 1С для 1С:Бухгалтерии предприятия

Инструментарий разработчика БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 1С:Бухгалтерия 3.0 Бесплатно (free)

Используются для создания новых объектов в конфигурации, чтобы не забыть, что нужно сделать. Сделано на примере 1С:Бухгалтерия предприятия, в других конфигурациях могут быть другие, а могут быть и похожие объекты.

28.12.2023    4830    mrXoxot    11    

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

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

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

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

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

О чем стоит конечно же указывать!
Necytij; Cthulhu; KilloN; +3 Ответить
5. Diversus 2306 29.06.15 10:44 Сейчас в теме
(4) Brawler, почему нет? Логика самой 1С v8 - максимальная функциональность и унификация. Очень часто есть общие модули с одним единственным методом, создание переопределяемых модулей там где это не нужно, системные объекты конфигурации, назначение которых с первого взгляда абсолютно не понятно и т.д. Такова логика: добавить побольше, авось завтра пригодиться. Эта обработка не исключение... С этим можно спорить, но тем не менее хуже от этого не будет. Да и если завтра вдруг надо будет расширить и добавить еще что-то, то все уже готово для этого.
wolfsoft; Yashazz; +2 Ответить
6. chmv 06.07.15 11:25 Сейчас в теме
а ввод на основании вроде же работает?
7. Diversus 2306 06.07.15 13:10 Сейчас в теме
(6) chmv, нет, не работает. Для нашей задачи ввод на основании не работает.
8. RustIG 1351 07.07.15 12:02 Сейчас в теме
9. Diversus 2306 07.07.15 12:50 Сейчас в теме
10. user617395_levchenko 08.08.17 14:50 Сейчас в теме
Вдруг понадобилось срочно написать в БП 3.0 ввод Отчета производства за смену (заполнение табличной части Продукция) на основании Счета покупателю - с помощью данного описания написал слету. До этого не использовал Создание связанных объектов.
11. AndKovalchuk 188 29.05.20 14:22 Сейчас в теме
А что делать, если документ добавлен в типовую конфигурацию?
Скажем у меня есть документ "АГ-Букинг" на основании которого вводится счет. Но вот внешняя команда заполнения на основании почему-то не подключается. Хотя в массиве назначений он есть
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.аг_Букинг");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);

12. Jestem 02.11.20 16:05 Сейчас в теме
(11) Для искателей.

Отпишусь для искателей.

В новый БСП надо подредактировать определяемый тип ОбъектСДополнительнымиКомандами и добавить туда недостающие объекты.
13. baracuda 2 27.03.21 16:12 Сейчас в теме
Спасибо большое, работает!)
14. user604163_sasha_nikolaev 27.04.21 10:17 Сейчас в теме
В БП3 после обновления не видит "ФормаДок.Объект"
15. ServicePlus 28.04.21 16:39 Сейчас в теме
После обновления 1с ругается на "ФормаДок.Объект" - Поле объекта не обнаружено (Объект)
16. nikavilk 12.05.21 11:05 Сейчас в теме
(15) у вас получилось узнать в чем проблема??


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

походу теперь через созданную форму не получается - выбрать объект
ругается на выражение:

ДанныеФормы = ФормаДок.Объект;

Смотрела рабочую версию конфигураций с текущей, на которой перестало работать, - добавлены ещё три новых формы может здесь зарыта проблема. Напишите если кто-что-то знает как обойти ?
17. zhuravlev_as 392 03.12.21 16:15 Сейчас в теме
(16) скорее всего должно быть:

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

И лишний раз проверить что основный реквизит формы носит именно имя "Объект", иначе указывать имя основного реквизита формы как есть для:

ДанныеФормы = ФормаДок.Объект;
18. zhuravlev_as 392 03.12.21 16:20 Сейчас в теме
Слишком теоретическое описание.
Нет разъяснения о том, что помещать в параметр "СозданныеОбъекты", который должен открыть то, что создаем.
Но возникает логичный вопрос. В "СозданныеОбъекты" должны быть переданы уже сохраненные объекты базы??
Если да, то тогда новый механизм создания связанных объектов - лишь жалкое подобие ввода на основании. Поскольку преимуществом ввода на основании обычного приложения было то, что созданные объекты открывались несохраненными в формах.
В управляемом же интерфейсе - это возможно "намучать", о тогда останется открытым окно "Команды создания связанных объектов" - что вынуждает пользователя закрывать его вручную.
Оставьте свое сообщение