Вызов процедур формы из подписки на событие в УФ
Здравствуйте!
1.При проведении документа вызывается подписка на событие и создаётся новый документ с другой организацией и данными, необходимо вызвать процедуры формы документа? Как можно вызвать эти процедуры и можно ли вообще?
2.Но так как в этих процедурах используеться параметр форма, при создании формы в модуле подписки на событие форму создать не возможно.
Как поступить в данной ситуации лучше?
Заранее благодарен!
1.При проведении документа вызывается подписка на событие и создаётся новый документ с другой организацией и данными, необходимо вызвать процедуры формы документа? Как можно вызвать эти процедуры и можно ли вообще?
2.Но так как в этих процедурах используеться параметр форма, при создании формы в модуле подписки на событие форму создать не возможно.
Как поступить в данной ситуации лучше?
Заранее благодарен!
По теме из базы знаний
- PowerTools: Инструменты администратора 1С 8.3
- Отладчик пользовательских дополнительных обработчиков бизнес-событий в 1С:Документооборот версии 2.1.7.9
- Свертка базы - или как свернуть базу УТ 10.3
- Последовательности событий при проведении документа 1С. Шпаргалка
- Обзор полезных методов БСП 3.1.4. Часть 2
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Тогда минус 1С с такой реализацией, для того чтобы переписать на сервер процедуру приизменении в комплексной, проще написать всё заного и заполнить по реквизитно все реквизиты, т.к. в типовой весде используется форма при пересчётах и.т.д. в большинстве случаев, а не объект!
Это в форме делается в зуп 3.1
&НаКлиенте
Процедура Подключаемый_ПорядокВыплатыПриИзменении(Элемент)
ПорядокВыплатыПриИзмененииНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПорядокВыплатыПриИзмененииНаСервере(УстановитьПланируемуюДатуВыплаты = Истина)
ОбязательныйРасчетНДФЛ = УчетНДФЛРасширенный.ДоходыВУчетеНДФЛРегистрируютсяПоДатеВыплаты(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Объект.Начисление));
УстановитьВидимостьРеквизитовМежрасчетнойВыплаты(ЭтаФорма);
Если УстановитьПланируемуюДатуВыплаты Тогда
РасчетЗарплатыРасширенныйКлиентСервер.УстановитьПланируемуюДатуВыплаты(ЭтаФорма, ОписаниеДокумента(ЭтаФорма));
КонецЕсли;
Если Не Объект.РассчитыватьУдержания Тогда
Объект.Удержания.Очистить();
Объект.НДФЛ.Очистить();
Объект.КорректировкиВыплаты.Очистить();
Объект.ПримененныеВычетыНаДетейИИмущественные.Очистить();
КонецЕсли;
РассчитатьСотрудниковНаСервере(ОбщегоНазначения.ВыгрузитьКолонку(Объект.Начисления, "Сотрудник"), ОписаниеТаблицыНачислений());
УстановитьОтметкуНезаполненногоПланируемойДатыВыплаты(ЭтаФорма);
КонецПроцедуры
Показать
А в этой процедуре РасчетЗарплатыРасширенныйКлиентСервер.УстановитьПланируемуюДатуВыплаты(ЭтаФорма, ОписаниеДокумента(ЭтаФорма)); не три строчки кода и если нет возможности вызвать это с сервера или без формы в чём смысл? Тогда чтобы программно создать документ в 1С надо писать новые модули без эта форма!!!
&НаКлиенте
Процедура Подключаемый_ПорядокВыплатыПриИзменении(Элемент)
ПорядокВыплатыПриИзмененииНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПорядокВыплатыПриИзмененииНаСервере(УстановитьПланируемуюДатуВыплаты = Истина)
ОбязательныйРасчетНДФЛ = УчетНДФЛРасширенный.ДоходыВУчетеНДФЛРегистрируютсяПоДатеВыплаты(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Объект.Начисление));
УстановитьВидимостьРеквизитовМежрасчетнойВыплаты(ЭтаФорма);
Если УстановитьПланируемуюДатуВыплаты Тогда
РасчетЗарплатыРасширенныйКлиентСервер.УстановитьПланируемуюДатуВыплаты(ЭтаФорма, ОписаниеДокумента(ЭтаФорма));
КонецЕсли;
Если Не Объект.РассчитыватьУдержания Тогда
Объект.Удержания.Очистить();
Объект.НДФЛ.Очистить();
Объект.КорректировкиВыплаты.Очистить();
Объект.ПримененныеВычетыНаДетейИИмущественные.Очистить();
КонецЕсли;
РассчитатьСотрудниковНаСервере(ОбщегоНазначения.ВыгрузитьКолонку(Объект.Начисления, "Сотрудник"), ОписаниеТаблицыНачислений());
УстановитьОтметкуНезаполненногоПланируемойДатыВыплаты(ЭтаФорма);
КонецПроцедуры
А в этой процедуре РасчетЗарплатыРасширенныйКлиентСервер.УстановитьПланируемуюДатуВыплаты(ЭтаФорма, ОписаниеДокумента(ЭтаФорма)); не три строчки кода и если нет возможности вызвать это с сервера или без формы в чём смысл? Тогда чтобы программно создать документ в 1С надо писать новые модули без эта форма!!!
(9) большинство кода выполняется на сервере, если разработчики перевели это на клиент, то вам придется попотеть, чтобы реализовать, то что вам нужно!
Ну или пишите разработчикам, чтобы они код переписали на сервер, а далее вам останется 3 строки кода написать как вы и хотели!
Ну или пишите разработчикам, чтобы они код переписали на сервер, а далее вам останется 3 строки кода написать как вы и хотели!
ДопПараметры = ЗакупкиСервер.ДополнительныеПараметрыОтбораДоговоров();
ДопПараметры.ВалютаВзаиморасчетов = Объект.Валюта;
ДопПараметры.ВариантОформленияЗакупок = ВариантыОформленияЗакупок(Объект.ХозяйственнаяОперация);
Объект.Договор = ЗакупкиСервер.ПолучитьДоговорПоУмолчанию(Объект,
ХозяйственнаяОперацияДоговора, ДопПараметры);
ХозяйственнаяОперацияДоговора - это реквизит формы, который опять же заполняется при изменении контрагента или организации и.т.д.
К примеру сейчас чтобы найти чем он заполняется я проваливался в 9 процедур в отладчике!!!
Может кому интересно в обработке наворотил вот так!
&НаСервере
Функция СформироватьДокументПоступленияТоваров(СсылкаНаОбъект)
//СсылкаНаОбъект = Документы.ПриобретениеТоваровУслуг.СоздатьДокумент();
СтарыйДокумент = СсылкаНаОбъект.ПолучитьОбъект();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Deni_Nikitin_СоответствиеОрганизаций.ОрганизацияДокумент КАК ОрганизацияДокумент,
| Deni_Nikitin_СоответствиеОрганизаций.Склад КАК Склад,
| Deni_Nikitin_СоответствиеОрганизаций.ОрганизацияПолучатель КАК ОрганизацияПолучатель
|ИЗ
| Справочник.Deni_Nikitin_СоответствиеОрганизаций КАК Deni_Nikitin_СоответствиеОрганизаций
|ГДЕ
| Deni_Nikitin_СоответствиеОрганизаций.ОрганизацияДокумент = &ОрганизацияДокумент
| И Deni_Nikitin_СоответствиеОрганизаций.Склад = &Склад";
Запрос.УстановитьПараметр("ОрганизацияДокумент", СтарыйДокумент.Организация);
Запрос.УстановитьПараметр("Склад", СтарыйДокумент.Склад);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Если РезультатЗапроса.Количество() = 0 Тогда
Возврат "";
КонецЕсли;
НовыйДокумент = СтарыйДокумент.Скопировать();
НовыйДокумент.Дата = СтарыйДокумент.Дата;
НовыйДокумент.Организация = РезультатЗапроса[0].ОрганизацияПолучатель;
НовыйДокумент.Комментарий = "Сформирован автоматически на основании документа " + СокрЛП(СтарыйДокумент.Ссылка);
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
Возврат НовыйДокумент.Ссылка;
КонецФункции
&НаСервере
Функция ВернутьДокументыПоступленияТоваров()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПриобретениеТоваровУслуг.Ссылка КАК Документ
|ИЗ
| Документ.ПриобретениеТоваровУслуг КАК ПриобретениеТоваровУслуг
|ГДЕ
| ПриобретениеТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(Объект.ДатаНачала));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(Объект.ДатаОкончания));
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
МассивДокументы = РезультатЗапроса.ВыгрузитьКолонку("Документ");
Возврат МассивДокументы;
КонецФункции
&НаКлиенте
Процедура СформироватьПоступленияТоваров()
МассивДокументов = ВернутьДокументыПоступленияТоваров();
Для Каждого СтрокаДокумента Из МассивДокументов Цикл
НовыйДокумент = СформироватьДокументПоступленияТоваров(СтрокаДокумента);
Если НЕ ЗначениеЗаполнено(НовыйДокумент) Тогда
Продолжить;
КонецЕсли;
ФормаДокумента = ПолучитьФорму("Документ.ПриобретениеТоваровУслуг.ФормаОбъекта", Новый Структура("Ключ", НовыйДокумент));
ФормаДокумента.ОрганизацияПриИзмененииСервер();
ЗаписатьДокумент(НовыйДокумент);
Сообщить("Сформирован документ " + СокрЛП(НовыйДокумент));
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура СформироватьДокументы(Команда)
СформироватьПоступленияТоваров();
КонецПроцедуры
Показать
&НаСервере
Функция СформироватьДокументПоступленияТоваров(СсылкаНаОбъект)
//СсылкаНаОбъект = Документы.ПриобретениеТоваровУслуг.СоздатьДокумент();
СтарыйДокумент = СсылкаНаОбъект.ПолучитьОбъект();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Deni_Nikitin_СоответствиеОрганизаций.ОрганизацияДокумент КАК ОрганизацияДокумент,
| Deni_Nikitin_СоответствиеОрганизаций.Склад КАК Склад,
| Deni_Nikitin_СоответствиеОрганизаций.ОрганизацияПолучатель КАК ОрганизацияПолучатель
|ИЗ
| Справочник.Deni_Nikitin_СоответствиеОрганизаций КАК Deni_Nikitin_СоответствиеОрганизаций
|ГДЕ
| Deni_Nikitin_СоответствиеОрганизаций.ОрганизацияДокумент = &ОрганизацияДокумент
| И Deni_Nikitin_СоответствиеОрганизаций.Склад = &Склад";
Запрос.УстановитьПараметр("ОрганизацияДокумент", СтарыйДокумент.Организация);
Запрос.УстановитьПараметр("Склад", СтарыйДокумент.Склад);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Если РезультатЗапроса.Количество() = 0 Тогда
Возврат "";
КонецЕсли;
НовыйДокумент = СтарыйДокумент.Скопировать();
НовыйДокумент.Дата = СтарыйДокумент.Дата;
НовыйДокумент.Организация = РезультатЗапроса[0].ОрганизацияПолучатель;
НовыйДокумент.Комментарий = "Сформирован автоматически на основании документа " + СокрЛП(СтарыйДокумент.Ссылка);
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
Возврат НовыйДокумент.Ссылка;
КонецФункции
&НаСервере
Функция ВернутьДокументыПоступленияТоваров()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПриобретениеТоваровУслуг.Ссылка КАК Документ
|ИЗ
| Документ.ПриобретениеТоваровУслуг КАК ПриобретениеТоваровУслуг
|ГДЕ
| ПриобретениеТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(Объект.ДатаНачала));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(Объект.ДатаОкончания));
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
МассивДокументы = РезультатЗапроса.ВыгрузитьКолонку("Документ");
Возврат МассивДокументы;
КонецФункции
&НаКлиенте
Процедура СформироватьПоступленияТоваров()
МассивДокументов = ВернутьДокументыПоступленияТоваров();
Для Каждого СтрокаДокумента Из МассивДокументов Цикл
НовыйДокумент = СформироватьДокументПоступленияТоваров(СтрокаДокумента);
Если НЕ ЗначениеЗаполнено(НовыйДокумент) Тогда
Продолжить;
КонецЕсли;
ФормаДокумента = ПолучитьФорму("Документ.ПриобретениеТоваровУслуг.ФормаОбъекта", Новый Структура("Ключ", НовыйДокумент));
ФормаДокумента.ОрганизацияПриИзмененииСервер();
ЗаписатьДокумент(НовыйДокумент);
Сообщить("Сформирован документ " + СокрЛП(НовыйДокумент));
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура СформироватьДокументы(Команда)
СформироватьПоступленияТоваров();
КонецПроцедуры
Хорошо раз вы такой спец, ка 2.4 необходимо создать при проведение документа "Приобретение Товаров и Услуг" Новый документ с другой организацией, не могли бы Вы мне показать реализацию такой схемы с подписки о событии? Я просто хочу увидеть код профессионала и понять сколько времени на него уйдет?
(24) лень двигатель прогресса. Но если хотите стать настоящим программистом, то тупо подогнать существующее формирование документа через его форму, это показатель, попытки малой кровь сделать свою работу, которая не всегда оправдана.
Разработчики не побеспокоились облегчить вам свою работу. Но это не повод идти по наименьшему сопротивлению.
Может они и не хотели, чтобы из вне пытались влезть в их формирования бизнес логики.
если перед вами стоит задача внести программно ввод элемента, совсем не означает попытка вклиниться в их формирование. Первое, что нужно определить, это принцип формирования нужных реквизитов объекта для записи.
Если невозможно вклиниться в существующий порядок формирования, то разработайте свой.
А вот за попытку создания нового документа из обработчика проведения, я бы сразу увольнял. Ничего личного.
Разработчики не побеспокоились облегчить вам свою работу. Но это не повод идти по наименьшему сопротивлению.
Может они и не хотели, чтобы из вне пытались влезть в их формирования бизнес логики.
если перед вами стоит задача внести программно ввод элемента, совсем не означает попытка вклиниться в их формирование. Первое, что нужно определить, это принцип формирования нужных реквизитов объекта для записи.
Если невозможно вклиниться в существующий порядок формирования, то разработайте свой.
А вот за попытку создания нового документа из обработчика проведения, я бы сразу увольнял. Ничего личного.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот