Создание и заполнение документа основания программно из модуля формы

02.05.18

Разработка - Универсальные функции

Работа с модулями форм документов УФ

Это очередная публикация, можно судить строго.

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

Надеюсь этой статьей помочь таким же, как и я в свое время (Таковых много, я смотрел на различных форумах аналогичные безответные запросы);

В моем случае необходимо было создать документ "Расходная накладная" на основании документа "Заказ покупателя" с проверкой на проведенность и с изменением реквизита в основном документе после проведения и самое главное баз открытия создаваемого документа.

Использовались самые стандартные и на мой взгляд самые рабочие методы исполнения из формы документа. Если есть круче с удовольствием прочту в комментариях.

Практика.

1. Методом несложных манипуляций создаем кнопку на командной панели списка документов "Заказы покупателей" с именем "СоздатьРасходнуюНакладную".

2. В модуле формы основного документа прописываем Функцию на Сервере и процедуру на Клиенте.

&НаСервере
Функция СоздатьРасходнуюНакладнуюНаСервере()
	
	ЭтотДокумент = РеквизитФормыВЗначение("Объект");
	ЭтотДокумент.Записать(РежимЗаписиДокумента.Проведение);
	ЗначениеВРеквизитФормы(ЭтотДокумент, "Объект");
	Док1=Документы.РасходнаяНакладная.СоздатьДокумент();
	Док1.Заполнить(Объект.ссылка);
	Док1.Дата=ТекущаяДата();
	Док1.Ответственный=Объект.Ответственный;
	Док1.Подразделение=Объект.СтруктурнаяЕдиницаПродажи;
	Док1.Автор=Объект.Автор;
	Док1.Комментарий=Объект.Комментарий;

//При повторном создании документа количество запасов в ТЧ запасы = 0 Заведомо запрещаем дальнейшие действия(ТАКОВ ПОДХОД)	
	Если Док1.Запасы.Количество()=0 тогда
				Сообщить("Вы уже создали ВАШ_ДОКУМЕНТ!");
		Возврат Ложь;
	КонецЕсли;	

//Проверяем документ на заполненность, если созданный на основании документ заполнен, то проводим и оповещаем пользователя 	
	    Если Док1.Запасы.Количество()>0 Тогда
		Док1.Записать(Режимзаписидокумента.Проведение);
		Сообщить("Создан документ "+Док1);

//Проверяем если документ проведен, то устанавливаем реквизит документа основания в определенное состояние		
		Если Док1.Проведен тогда
		Объект.СостояниеЗаказа=Справочники.СостоянияЗаказовПокупателей.НайтиПоКоду("ВАШ_КОД");
			Возврат Истина;
		КонецЕсли;
	Иначе
//Если эта операция была проделана ранее то выдаем сообщение пользователю 		
		Сообщить("Вы уже создали ВАШ_ДОКУМЕНТ!");
		Возврат Ложь;

	    КонецЕсли;
КонецФункции

//Команду с кнопкой мы поместили на командной панели нашего документа основания и указываем нашу процедуру
//
&НаКлиенте
Процедура СоздатьРасходнуюНакладную(Команда)	
//Определяем наш Док1 и выполняем команду и закрываем форму оновного документа;
Док1=СоздатьРасходнуюНакладнуюНаСервере();
Если Док1 тогда
	Записать();
Конецесли;
//Закрывем форму
Закрыть();
КонецПроцедуры

Вот таким путем мы создали на основании документ с заполнением всех необходимых нам  данных, с проведением документов и без открытия формы созданного документа!

End;

Создать на основании заполнить по документу Документ основание Заполнить по основанию

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2670    0    John_d    8    

54

GUID в 1С 8.3 - как с ними быть

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

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4607    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3960    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

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

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8821    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16143    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

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

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. mvk4d 03.05.18 07:54 Сейчас в теме
"Закрыть" - это метод.
На ИТС есть микро статья про это: https://its.1c.ru/db/metod8dev/content/2484/hdoc
2. DENSKR 15 04.05.18 19:45 Сейчас в теме
(1)
"Закрыть"
Закрываем текущую форму а не форму созданного дока
3. MVK80 04.05.18 20:38 Сейчас в теме
(2) Так, а что это меняет? Нет такого свойства "Закрыть", есть только метод "Закрыть()". Скобок не хватает. Проверка модуля ругается.
4. DENSKR 15 04.05.18 20:59 Сейчас в теме
(3)Точно) Не заметил) Спасибо.
5. Бубузяка 62 10.05.18 11:52 Сейчас в теме
Я себе позволил изменить немного код автора. Правки отмечены "NB".


&НаСервере
Функция СоздатьРасходнуюНакладнуюНаСервере()
	
	// ++ NB 
	//ЭтотДокумент = РеквизитФормыВЗначение("Объект");
	//ЭтотДокумент.Записать(РежимЗаписиДокумента.Проведение);
	//ЗначениеВРеквизитФормы(ЭтотДокумент, "Объект");
	// -- NB
	
	Док1=Документы.РасходнаяНакладная.СоздатьДокумент();
	Док1.Заполнить(Объект.ссылка);
	Док1.Дата=ТекущаяДата();
	Док1.Ответственный=Объект.Ответственный;
	Док1.Подразделение=Объект.СтруктурнаяЕдиницаПродажи;
	Док1.Автор=Объект.Автор;
	Док1.Комментарий=Объект.Комментарий;
	
	//При повторном создании документа количество запасов в ТЧ запасы = 0 Заведомо запрещаем дальнейшие действия(ТАКОВ ПОДХОД)	
	Если Док1.Запасы.Количество()=0 тогда
		Сообщить("Вы уже создали ВАШ_ДОКУМЕНТ!");
		Возврат Ложь;
	КонецЕсли;	
	
	//Проверяем документ на заполненность, если созданный на основании документ заполнен, то проводим и оповещаем пользователя 	
	Если Док1.Запасы.Количество()>0 Тогда
		// ++ NB 
		Попытка
			Док1.Записать(Режимзаписидокумента.Проведение);
		Исключение
			// Сново что-то пошло не так. :(
			Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
			Возврат Ложь;
		КонецПопытки;
		// -- NB 
		
		Сообщить("Создан документ "+Док1);
		
		// ++ NB: "Док1.Проведен" Зачем проверять проведен или нет? Мы же его проводим. 
		
		//Проверяем если документ проведен, то устанавливаем реквизит документа основания в определенное состояние		
		Если Док1.Проведен тогда
			
			// ++ NB: Не очень хорошая идея модифицировать текущй объект в функции создания другого объекта.
			//		  Это нарушет логику модуля. Поясню. По коду понятно, что происходит.
			//		  События: - запись текущего документа,
			//				   - заполнение и проведение нового документа,	
			//			       - изменение состояния текущего документа,
			//				   - завершение работы с текущим документом (закрыли форму).
			//        Поэтому, изменение состояние лучше вынести в обработчик команды, ибо - это
			//		  результат ввода на основании. Стороннему разработчику и автору (год спустя)
			//		  легче уловить цепт событий.
			// -- NB 
			Объект.СостояниеЗаказа=Справочники.СостоянияЗаказовПокупателей.НайтиПоКоду("ВАШ_КОД");
			Возврат Истина;
		КонецЕсли;
	Иначе
		//Если эта операция была проделана ранее то выдаем сообщение пользователю 		
		Сообщить("Вы уже создали ВАШ_ДОКУМЕНТ!");
		Возврат Ложь;
	КонецЕсли;
	
КонецФункции

//Команду с кнопкой мы поместили на командной панели нашего документа основания и указываем нашу процедуру
//
&НаКлиенте
Процедура СоздатьРасходнуюНакладную(Команда)
	
	// ++ NB 
	// "Безопасная" запись и проведение.
	Если НЕ ПроверитьЗаполнение() Тогда
		// Текущий документ не готов к проведению.
		Возврат;
	КонецЕсли; 
	
	ПараметрыЗаписи = Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение); 
	Если НЕ Записать(ПараметрыЗаписи) Тогда
		// Что-то пошло не так и документ не удалось провести.
		Возврат;
	КонецЕсли; 
	// -- NB

	//Определяем наш Док1 и выполняем команду и закрываем форму оновного документа;
	Док1=СоздатьРасходнуюНакладнуюНаСервере();
	Если Док1 тогда
		Записать();
	Конецесли;
	//Закрывем форму
	Закрыть();
КонецПроцедуры
Показать
7. DENSKR 15 11.05.18 10:09 Сейчас в теме
(5)
(6) Хорошие замечания, возьму к вооружению.
6. user596590_pavel.kuznecov 46 10.05.18 12:37 Сейчас в теме
//Команду с кнопкой мы поместили на командной панели нашего документа основания и указываем нашу процедуру

Про дополнительные обработки и БСП не слышали? Все это можно оформить без изменения конфигурации, создав и подключив дополнительную внешнюю обработку. В модуле обработке должна присутствовать экспортная функция "СведенияОВнешнейОбработке":
Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиСозданиеСвязанныхОбъектов();
    ПараметрыРегистрации.Версия = "1.0.0.1";
    Команда = ПараметрыРегистрации.Команды.Добавить();
    Команда.Представление = НСтр("ru = '<Пишем наше представление команды>'");
    Команда.Идентификатор = "<Пишем наше имя команды>";
    Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    Команда.ПоказыватьОповещение = Ложь;
    Возврат ПараметрыРегистрации; 
КонецФункции
Показать


Здесь же в модуле обработки создаете экспортную функцию ВыполнитьКоманду() :
 Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, СозданныеОбъекты, ПараметрыВыполнения) Экспорт
       	// Реализация логики команды.
       КонецПроцедуры

ОбъектыНазначения - Массив ссылок на документы-основания. Почему массив: для обеспечения возможности создания связанных объектов из формы списка множественным выделением. То есть выделили произвольно документы, нажали кнопку, и для всех выделенных документов будут созданы связанные объекты. Идентификатор команды нужен когда в одной обработке несколько команд, в вашем случае игнорируйте. Остальные параметры тоже Вам не понадобятся. Описание команд и их параметров можно посмотреть в комментарии к функции "ТипКомандыВызовСерверногоМетода".
cepera1575; 1cccc; DENSKR; +3 Ответить
8. German_Tagil 42 12.05.18 15:17 Сейчас в теме
Оставьте свое сообщение