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

26.06.15

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Создание ордера на перемещение на основании приходного ордера
.epf 7,30Kb ver:1.0
41
41 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Все.

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

Всем удачи.

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

См. также

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

Синтакс-помощник БСП - cправочник по библиотеке стандартных подсистем. В состав справочника входит описание экспортных процедур и функций, размещенных в областях кода ПрограммныйИнтерфейс БСП.

1800 руб.

21.11.2024    141    1    0    

2

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

В статье описан алгоритм для включения документа или справочника в систему БСП. Будет полезно программистам 1С, начинающим работать с БСП.

24.10.2024    1125    PROSTO-1C    0    

13

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

В материале описан универсальный механизм работы с добавленными элементами на общую форму «ФормаОтчета». Думаю, облегчит работу многим разработчикам.

08.10.2024    1006    PROSTO-1C    4    

12

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

В статье рассмотрим пошаговую инструкцию создания дополнительного отчета с фоновым формированием результата.

04.10.2024    1853    MadRave    11    

24

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

Пример отслеживания прогресса фонового выполнения дополнительной обработки с использованием программного интерфейса длительных операций БСП.

10.09.2024    1845    MadRave    1    

17

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

А что, если долгожданная реализация Паузы в 1С смутно напоминает старую, проверенную? А?!

06.09.2024    1265    n_mezentsev    10    

8

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

Добавим дополнительные свойства в новый документ средствами БСП

02.09.2024    4119    John_d    10    

52

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

Всё больше организаций выбирает для серверов под 1С операционные системы Linux. Одним из отличий систем Windows и Linux является отсутствие COM объектов, которые зачастую использовались для формирования печатных форм офисных документов (Word). Конечно, можно выполнять печать и на клиенте, но есть риск импортозамещения. В работе у меня случались проблемы с зависанием процесса Word, поэтому я не люблю его использовать.

29.07.2024    5375    PROSTO-1C    12    

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

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

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

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

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

О чем стоит конечно же указывать!
HolyRadiance; lavrov.online; Necytij; Cthulhu; KilloN; +5 Ответить
5. Diversus 2329 29.06.15 10:44 Сейчас в теме
(4) Brawler, почему нет? Логика самой 1С v8 - максимальная функциональность и унификация. Очень часто есть общие модули с одним единственным методом, создание переопределяемых модулей там где это не нужно, системные объекты конфигурации, назначение которых с первого взгляда абсолютно не понятно и т.д. Такова логика: добавить побольше, авось завтра пригодиться. Эта обработка не исключение... С этим можно спорить, но тем не менее хуже от этого не будет. Да и если завтра вдруг надо будет расширить и добавить еще что-то, то все уже готово для этого.
wolfsoft; Yashazz; +2 Ответить
6. chmv 06.07.15 11:25 Сейчас в теме
а ввод на основании вроде же работает?
7. Diversus 2329 06.07.15 13:10 Сейчас в теме
(6) chmv, нет, не работает. Для нашей задачи ввод на основании не работает.
8. RustIG 1747 07.07.15 12:02 Сейчас в теме
9. Diversus 2329 07.07.15 12:50 Сейчас в теме
10. user617395_levchenko 08.08.17 14:50 Сейчас в теме
Вдруг понадобилось срочно написать в БП 3.0 ввод Отчета производства за смену (заполнение табличной части Продукция) на основании Счета покупателю - с помощью данного описания написал слету. До этого не использовал Создание связанных объектов.
11. AndKovalchuk 195 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 436 03.12.21 16:15 Сейчас в теме
(16) скорее всего должно быть:

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

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

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