Last updated: 10 Feb 23 08:25:47 (UTC)

1C. Параметры в запись документа через доп. свойства и реквизиты формы

В данном примере обработка создает заказ и передает ей таблицу заполнения. Таблица в свою очередь при записи документа сохраняется в отдельном регистре. Регистр фактически фиксирует первоначальные данные документа. И только в случае, если таблица вообще была отправлена документу через параметры.

Модуль формы внешней обработки

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

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

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

Модуль формы документа

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    МассивДобавляемыхРеквизитов = Новый Массив;
    МассивДобавляемыхРеквизитов.Добавить(
        Новый РеквизитФормы("ксЦены",
        Новый ОписаниеТипов("СписокЗначений")));
    ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
    
    Если Параметры.Свойство("ксЦены") Тогда
        ЭтаФорма["ксЦены"] = Параметры.ксЦены;
    КонецЕсли;
    
КонецПроцедуры

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

&НаСервере
Процедура СохранитьЦеныВРеквизиты(ксЦены) Экспорт
    
    ЭтаФорма["ксЦены"] = ксЦены;
    
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    МассивДобавляемыхРеквизитов = Новый Массив;
    МассивДобавляемыхРеквизитов.Добавить(
        Новый РеквизитФормы("ксЦены",
        Новый ОписаниеТипов("СписокЗначений")));
    ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
    
    Если Параметры.Свойство("ксЦены") Тогда
        ЭтаФорма["ксЦены"] = Параметры.ксЦены;
    КонецЕсли;
    
КонецПроцедуры

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

&НаСервере
Процедура СохранитьЦеныВРеквизиты(ксЦены) Экспорт
    
    ЭтаФорма["ксЦены"] = ксЦены;
    
КонецПроцедуры

Модуль проведения документа

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

КонецПроцедуры

Процедура ПриЗаписи(Отказ)
    
    Если ЭтотОбъект.ДополнительныеСвойства.Свойство("ксЦены") Тогда
        Для Каждого ЭлементСписка Из ЭтотОбъект.ДополнительныеСвойства["ксЦены"] Цикл
            ТекСтрока = ЭлементСписка.Значение;
            СтруктураЦеныEDI = Новый Структура;
            СтруктураЦеныEDI.Вставить("ЗаказКлиента",	Ссылка);
            СтруктураЦеныEDI.Вставить("Номенклатура",	ТекСтрока.Номенклатура);
            СтруктураЦеныEDI.Вставить("Цена",			ТекСтрока.Цена);
            РегистрыСведений.Цены.Отразить(СтруктураЦеныEDI);
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    // регистр ОборотТоваров 
    Движения.ОборотТоваров.Записывать = Истина;
    Для Каждого ТекСтрокаТовары Из Товары Цикл
        Движение = Движения.ОборотТоваров.Добавить();
        Движение.Период = Дата;
        Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
        Движение.Сумма = ТекСтрокаТовары.Цена;
    КонецЦикла;

КонецПроцедуры

Процедура ПриЗаписи(Отказ)
    
    Если ЭтотОбъект.ДополнительныеСвойства.Свойство("ксЦены") Тогда
        Для Каждого ЭлементСписка Из ЭтотОбъект.ДополнительныеСвойства["ксЦены"] Цикл
            ТекСтрока = ЭлементСписка.Значение;
            СтруктураЦеныEDI = Новый Структура;
            СтруктураЦеныEDI.Вставить("ЗаказКлиента",	Ссылка);
            СтруктураЦеныEDI.Вставить("Номенклатура",	ТекСтрока.Номенклатура);
            СтруктураЦеныEDI.Вставить("Цена",			ТекСтрока.Цена);
            РегистрыСведений.Цены.Отразить(СтруктураЦеныEDI);
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры