Имя: Пароль:
1C
1С v8
Записать дополнительные реквизиты программно (управляемые формы)
0 bfss-732
 
27.08.20
11:41
Всем привет!
На основании Заказа Клиента делаю Заказа поставщика, дозаполняю программно дополнительные реквизиты в Заказа поставщика...

В модуле объекта Заказа поставщика запросом получаю Реквизиты.типДоставки и  Реквизиты.ГрузовикКонтейнер далее  пишу

ДопРеквизитTruckOrContainer = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Truck or Container", Истина);
ДопРеквизитТипДоставки = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Тип доставки", Истина);
СсылкаНаОбъект = Ссылка.ПолучитьОбъект();
МассивСтруктур = Новый Массив;
МассивСтруктур.Добавить(Новый Структура("Свойство, Значение", ДопРеквизитTruckOrContainer, Реквизиты.типДоставки));
МассивСтруктур.Добавить(Новый Структура("Свойство, Значение", ДопРеквизитТипДоставки, Реквизиты.ГрузовикКонтейнер));
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(СсылкаНаОбъект, МассивСтруктур);

Ошибка "Элемент не выбран!" на строку СсылкаНаОбъект = Ссылка.ПолучитьОбъект();

Что делать? Документ по факту не записан, как получить "ВладелецСвоств"  в ЗаписатьСвойстваУОбъекта()?
1 bfss-732
 
27.08.20
11:58
Понимаю что прежде чем получить объект необходимо иметь на него ссылку, ее по факту нет. Как быть в моем случае с ЗаписатьСвойстваУОбъекта?
2 Галахад
 
гуру
27.08.20
12:10
А потом записать, когда ссылка появиться не вариант?
3 bfss-732
 
27.08.20
12:13
(2) отличное предложение, ща попробую
4 bfss-732
 
27.08.20
13:08
(2) В модуле объекта заказ поставщику не прокатывает
5 bfss-732
 
27.08.20
13:10
Вообще эти данные надо заполнять в Процедура ЗаполнитьДокументНаОснованииЗаказа(Знач ЗаказКлиента)
6 Ёпрст
 
27.08.20
13:14
(0) через установитьссылку нового поиметь ссылку на незаписанный документ, её и использовать в своих доп свойствах.
В при закрытии проверять, если документ не записан - грохнуть все доп свойства, чтоб не было битых ссылок
7 Ёпрст
 
27.08.20
13:16
тип того

    Если ЭтоНовый() Тогда
        СсылкаНаОбъект = ПолучитьСсылкуНового();
        Если НЕ ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
            СсылкаНаОбъект = Документы.НужныйВид.ПолучитьСсылку();
            УстановитьСсылкуНового(СсылкаНаОбъект);
        КонецЕсли;
    Иначе
        СсылкаНаОбъект  = Ссылка;
    КонецЕсли;
8 bfss-732
 
27.08.20
13:17
(7) делал, ошибку выдает "Объект не найден"
9 bfss-732
 
27.08.20
13:18
Если ЭтоНовый() И Ссылка.Пустая() Тогда
         ЭтотОбъект.УстановитьСсылкуНового(Документы.ЗаказНаряд.ПолучитьСсылку(Новый УникальныйИдентификатор));
    КонецЕсли;
        
    НоваяСсылка = ЭтотОбъект.ПолучитьСсылкуНового();
10 bfss-732
 
27.08.20
13:24
(7) {ОбщийМодуль.ПодключаемыеКомандыКлиент.Модуль(162)}: Ошибка при вызове метода контекста (ОткрытьФорму)
            ОткрытьФорму(ОписаниеКоманды.ИмяФормы, ПараметрыФормы, Контекст.Форма, Истина);
по причине:
Ошибка при выполнении обработчика - 'ОбработкаЗаполнения'
по причине:
{ОбщийМодуль.УправлениеСвойствами.Модуль(1166)}: Значение не является значением объектного типа (Ссылка)
            ЗаблокироватьДанныеДляРедактирования(ВладелецСвойствОбъект.Ссылка);
11 Ёпрст
 
27.08.20
13:25
(10) больше кода
12 Ёпрст
 
27.08.20
13:26
нам отсюда не видно, че ты там творишь
13 bfss-732
 
27.08.20
13:30
В отладчике СсылкаНаОбъект Значение <Объект не найден> (420:afca0050560065c211eae84f14021bdc)

Далее попадаю в в Общий модуль УправлениеСвойствами.ЗаписатьСвойстваУОбъекта...в Процедура ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений) Экспорт

ТаблицаДопРеквизитов = Новый ТаблицаЗначений;
    ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
    ТаблицаДопРеквизитов.Колонки.Добавить("Значение");
    ТаблицаДопРеквизитов.Колонки.Добавить("ТекстоваяСтрока");
    
    ТаблицаДопСведений = ТаблицаДопРеквизитов.СкопироватьКолонки();
    
    Для Каждого СтрокаТаблицыСвойств Из ТаблицаСвойствИЗначений Цикл
        Если СтрокаТаблицыСвойств.Свойство.ЭтоДополнительноеСведение Тогда
            НоваяСтрока = ТаблицаДопСведений.Добавить();
        Иначе
            НоваяСтрока = ТаблицаДопРеквизитов.Добавить();
            
            Если ТипЗнч(СтрокаТаблицыСвойств.Значение) = Тип("Строка")
                И СтрДлина(СтрокаТаблицыСвойств.Значение) > 1024 Тогда
                НоваяСтрока.ТекстоваяСтрока = СтрокаТаблицыСвойств.Значение;
            КонецЕсли;
        КонецЕсли;
        ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицыСвойств, "Свойство,Значение");
    КонецЦикла;
    
    ЕстьДопРеквизиты = ТаблицаДопРеквизитов.Количество() > 0;
    ЕстьДопСведения  = ТаблицаДопСведений.Количество() > 0;
    
    МассивСвойств = СвойстваОбъекта(ВладелецСвойств);
    
    МассивДопРеквизитов = Новый Массив;
    МассивДопСведений = Новый Массив;
    
    Для Каждого ДопСвойство Из МассивСвойств Цикл
        Если ДопСвойство.ЭтоДополнительноеСведение Тогда
            МассивДопСведений.Добавить(ДопСвойство);
        Иначе
            МассивДопРеквизитов.Добавить(ДопСвойство);
        КонецЕсли;
    КонецЦикла;
    
    НачатьТранзакцию();
    Попытка
        Если ЕстьДопРеквизиты Тогда
            ВладелецСвойствОбъект = ВладелецСвойств.ПолучитьОбъект();
РУГАЕТСЯ ТУТ---> ЗаблокироватьДанныеДляРедактирования(ВладелецСвойствОбъект.Ссылка);
            Для Каждого ДопРеквизит Из ТаблицаДопРеквизитов Цикл
                Если МассивДопРеквизитов.Найти(ДопРеквизит.Свойство) = Неопределено Тогда
                    Продолжить;
                КонецЕсли;
                МассивСтрок = ВладелецСвойствОбъект.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", ДопРеквизит.Свойство));
                Если МассивСтрок.Количество() Тогда
                    СтрокаСвойства = МассивСтрок[0];
                Иначе
                    СтрокаСвойства = ВладелецСвойствОбъект.ДополнительныеРеквизиты.Добавить();
                КонецЕсли;
                ЗаполнитьЗначенияСвойств(СтрокаСвойства, ДопРеквизит, "Свойство,Значение,ТекстоваяСтрока");
            КонецЦикла;
            ВладелецСвойствОбъект.Записать();
        КонецЕсли;
        
        Если ЕстьДопСведения Тогда
            Для Каждого ДопСведение Из ТаблицаДопСведений Цикл
                Если МассивДопСведений.Найти(ДопСведение.Свойство) = Неопределено Тогда
                    Продолжить;
                КонецЕсли;
                
                МенеджерЗаписи = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи();
                
                МенеджерЗаписи.Объект = ВладелецСвойств;
                МенеджерЗаписи.Свойство = ДопСведение.Свойство;
                МенеджерЗаписи.Значение = ДопСведение.Значение;
                
                МенеджерЗаписи.Записать(Истина);
            КонецЦикла;
            
        КонецЕсли;
        ЗафиксироватьТранзакцию();
    Исключение
        ОтменитьТранзакцию();
        ВызватьИсключение;
    КонецПопытки;
14 bfss-732
 
27.08.20
13:31
Выше в коде РУГАЕТСЯ ТУТ---> ЗаблокироватьДанныеДляРедактирования(ВладелецСвойствОбъект.Ссылка);
15 bfss-732
 
27.08.20
13:32
Короче ссылка есть, объекта нет
16 Ёпрст
 
27.08.20
13:56
(14) как ты передаешь и создаешь ссылку на не записанный документ ?
17 bfss-732
 
27.08.20
14:15
(16) Через ...ЗаписатьСвойстваУОбъекта(СсылкаНаОбъект, ...);
18 Ёпрст
 
27.08.20
14:25
Да ё.. в каком месте ты использовал код из (7) и где потом передаешь ССылкаНаОбъект ?
19 bfss-732
 
27.08.20
14:35
(18) Модуль объекта в     Процедура ЗаполнитьДокументНаОснованииЗаказа(Знач ЗаказКлиента)
20 Ёпрст
 
27.08.20
14:45
(19) и ? где сам код то ?
:)
21 bfss-732
 
27.08.20
15:13
(20) Запрос = Новый Запрос(
        "ВЫБРАТЬ
        |    ЗаказКлиента.Статус КАК СтатусДокумента,
        |    ЗаказКлиента.Приоритет КАК Приоритет,
        |    ЗаказКлиента.Проведен КАК Проведен,
        |    ЗаказКлиента.Организация КАК Организация,
        |    ЗаказКлиента.Сделка КАК Сделка,
        |    ЗаказКлиента.Склад КАК СкладДокумента,
        |    ЗаказКлиента.Склад.ЭтоГруппа КАК ЭтоГруппа,
        |    ЗаказКлиента.НалогообложениеНДС КАК ЗакупкаПодДеятельность,
        |    ЗаказКлиента.НаправлениеДеятельности КАК НаправлениеДеятельности,
        |    ЗаказКлиента.ГрузовикКонтейнер КАК ГрузовикКонтейнер,
        |    ЗаказКлиента.типДоставки КАК типДоставки
        |ИЗ
        |    Документ.ЗаказКлиента КАК ЗаказКлиента
        |ГДЕ
        |    ЗаказКлиента.Ссылка = &ЗаказКлиента");
        Запрос.УстановитьПараметр("ЗаказКлиента", ЗаказКлиента);
        Реквизиты = Запрос.Выполнить().Выбрать();
        Реквизиты.Следующий();
        
        Документы.ЗаказКлиента.ПроверитьВозможностьВводаНаОсновании(
        ЗаказКлиента,
        Реквизиты.СтатусДокумента,
        НЕ Реквизиты.Проведен,
        Истина);
        
        // Заполнение шапки
        Организация            = Реквизиты.Организация;
        Сделка                 = Реквизиты.Сделка;
        ДокументОснование      = ЗаказКлиента;
        Приоритет              = Реквизиты.Приоритет;
        ЗакупкаПодДеятельность = Реквизиты.ЗакупкаПодДеятельность;
        НаправлениеДеятельности= Реквизиты.НаправлениеДеятельности;
        //++ сгс
        Партнер = Справочники.Партнеры.НайтиПоКоду("00-00000002");
        Соглашение = Справочники.СоглашенияСПоставщиками.НайтиПоНаименованию("БФК");        
        Договор = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию("04/2019 EUR");
        типДоставки = Реквизиты.типДоставки;
        ГрузовикКонтейнер =   Реквизиты.ГрузовикКонтейнер;

        //-- сгс

        // Заполнение табличной части.
        ПараметрыТаблицыТовары = ОбеспечениеСервер.ПараметрыТаблицыОстатковПоЗаказу();
        ТаблицаТовары          = ОбеспечениеСервер.ТаблицаОстатковКЗаказу(ЗаказКлиента, ПараметрыТаблицыТовары);
        ИспользованиеСкладов = Новый Структура("ИспользуютсяСкладыЗакупки, ИспользуютсяСкладыПродажи",
        ПолучитьФункциональнуюОпцию("ИспользоватьСкладыВТабличнойЧастиДокументовЗакупки"),
        ПолучитьФункциональнуюОпцию("ИспользоватьСкладыВТабличнойЧастиДокументовПродажи"));
        //++    сгс Дозаполнение на основании ЗаказаКлиента
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    ЗаказКлиентаТовары.FSC КАК FSC,
        |    ЗаказКлиентаТовары.TSCA КАК TSCA,
        |    ЗаказКлиентаТовары.КубМетровВПачке КАК КубМетровВПачке,
        |    ЗаказКлиентаТовары.КубМетровВсего КАК КубМетровВсего,
        |    ЗаказКлиентаТовары.ЦенаКубМетрЗавод КАК ЦенаКубМетрЗавод,
        |    ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
        |    ЗаказКлиентаТовары.Цена КАК Цена,
        |    ЗаказКлиентаТовары.КоличествоУпаковок КАК КоличествоУпаковок,
        |    ЗаказКлиентаТовары.Сумма КАК Сумма,
        |    ЗаказКлиентаТовары.Характеристика КАК Характеристика
        |ИЗ
        |    Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
        |ГДЕ
        |    ЗаказКлиентаТовары.Ссылка = &Ссылка
        |    И НЕ ЗаказКлиентаТовары.Ссылка.ПометкаУдаления
        |    И ЗаказКлиентаТовары.Ссылка.Проведен
        |АВТОУПОРЯДОЧИВАНИЕ";
        
        Запрос.УстановитьПараметр("Ссылка", ЗаказКлиента);
        
        РезультатЗапроса = Запрос.Выполнить();
        
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выгрузить();
        ТаблицаТовары.Колонки.Добавить("FSC",Новый ОписаниеТипов("Булево"), "FSC");
        ТаблицаТовары.Колонки.Добавить("TSCA",Новый ОписаниеТипов("Булево"), "TSCA");
        ТаблицаТовары.Колонки.Добавить("ЦенаКубМетрЗавод", Новый ОписаниеТипов("Число"), "ЦенаКубМетрЗавод");
        ТаблицаТовары.Колонки.Добавить("КубМетровВПачке", Новый ОписаниеТипов("Число"), "КубМетровВПачке");
        ТаблицаТовары.Колонки.Добавить("КубМетровВсего", Новый ОписаниеТипов("Число"), "КубМетровВсего");
        ТаблицаТовары.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"), "Цена");
        ТаблицаТовары.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"), "Сумма");
        
                
        
        Для Каждого Элемент Из ВыборкаДетальныеЗаписи Цикл
            
            Элемент.Цена = Элемент.ЦенаКубМетрЗавод * Элемент.КубМетровВПачке;
            Элемент.Сумма = Элемент.КоличествоУпаковок * Элемент.Цена;

            нСтрока = ТаблицаТовары.Найти(Элемент.Номенклатура, "Номенклатура");
            Если нСтрока = Неопределено Тогда
                нСтрока = ТаблицаТовары.Добавить()
            КонецЕсли;
            ЗаполнитьЗначенияСвойств(нСтрока, Элемент)
        КонецЦикла;
        
        
            
        //Запрос = Новый Запрос(
        //"ВЫБРАТЬ
        //|    ЗаказКлиента.ГрузовикКонтейнер КАК ГрузовикКонтейнер,
        //|    ЗаказКлиента.типДоставки КАК типДоставки
        //|ИЗ
        //|    Документ.ЗаказКлиента КАК ЗаказКлиента
        //|ГДЕ
        //|    ЗаказКлиента.Ссылка = &ЗаказКлиента");
        //Запрос.УстановитьПараметр("ЗаказКлиента", ЗаказКлиента);
        //Реквизиты = Запрос.Выполнить().Выбрать();
        //Реквизиты.Следующий();
        //
        //ДопРеквизитTruckOrContainer = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Truck or Container", Истина);
        //ДопРеквизитТипДоставки = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Тип доставки", Истина);
        //Если ЭтоНовый() Тогда
        //    СсылкаНаОбъект = ПолучитьСсылкуНового();
        //    Если НЕ ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
        //        СсылкаНаОбъект = Документы.ЗаказПоставщику.ПолучитьСсылку();
        //        УстановитьСсылкуНового(СсылкаНаОбъект);
        //    КонецЕсли;
        //Иначе
        //    СсылкаНаОбъект  = Ссылка;
        //КонецЕсли;
        ////СсылкаНаОбъект = Ссылка.ПолучитьОбъект();
        //МассивСтруктур = Новый Массив;
        //МассивСтруктур.Добавить(Новый Структура("Свойство, Значение", ДопРеквизитTruckOrContainer, Реквизиты.типДоставки));
        //МассивСтруктур.Добавить(Новый Структура("Свойство, Значение", ДопРеквизитТипДоставки, Реквизиты.ГрузовикКонтейнер));
        //УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(СсылкаНаОбъект, МассивСтруктур);
        //
        
        
        //--   сгс
        
        
        Товары.Загрузить(ТаблицаТовары);
        
        
        Если (ИспользованиеСкладов.ИспользуютсяСкладыЗакупки И ИспользованиеСкладов.ИспользуютсяСкладыПродажи)
            Или (ИспользованиеСкладов.ИспользуютсяСкладыЗакупки И Не ИспользованиеСкладов.ИспользуютсяСкладыПродажи)
            Или (Не ИспользованиеСкладов.ИспользуютсяСкладыЗакупки И Не ИспользованиеСкладов.ИспользуютсяСкладыПродажи) Тогда
            
            Склад = Реквизиты.СкладДокумента;
            
        ИначеЕсли Не ИспользованиеСкладов.ИспользуютсяСкладыЗакупки И ИспользованиеСкладов.ИспользуютсяСкладыПродажи Тогда
            
            МассивСкладов = ОбщегоНазначенияУТ.УдалитьПовторяющиесяЭлементыМассива(ТаблицаТовары.ВыгрузитьКолонку("Склад"));
            Если МассивСкладов.Количество() = 1 Тогда
                
                Склад = МассивСкладов[0];
                
            КонецЕсли;
            
        КонецЕсли;
22 bfss-732
 
27.08.20
16:16
Короче тема закрыта, добавил реквизиты в конфу, все взлетело за минуты. Допреквизиты ЗЛО!