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