Имя: Пароль:
1C
 
не сохраняется комментарий в документе
,
0 Веселый Джузеппе
 
28.12.19
09:32
Доброго дня и хорошего настроения!
В преддверие праздника решил закрыть долги по работам и на банальной операции чуть не поехал кукухой)

Есть обработка, которая в УПП меняет в режиме тонкого клиента меняет комментарий у дописанного документа

Вызывается на все по кнопке
&НаКлиенте
Процедура КомандаВыполнитьУпаковкуСУказаниемВеса(Команда)
    
    ВыделенныеСтроки = Элементы.Упаковки.ВыделенныеСтроки;
    Если ВыделенныеСтроки.Количество() > 0 Тогда
        ВесПродукции = 0;
        КвалификаторыЧисла = Новый КвалификаторыЧисла(15, 3, ДопустимыйЗнак.Неотрицательный);
        ОписаниеЧисла = Новый ОписаниеТипов("Число", КвалификаторыЧисла);
        ВвестиЗначение(ВесПродукции, "Укажите вес (т), позиций: " + ВыделенныеСтроки.Количество(), ОписаниеЧисла);
        Если ВесПродукции > 0 Тогда
// отладка Объект.ДокументВыпускаДляУпаковки.Комментарий    ""    Строка
            ВыполнитьУпаковкуНаСервере(ВесПродукции);
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Процедура ВыполнитьУпаковкуНаСервере(ВесПродукции = 0)
    
    ТаблицаСерий = Объект.Упаковки.Выгрузить();
    ТаблицаСерий.Очистить();
    
    ВыделенныеСтроки = Элементы.Упаковки.ВыделенныеСтроки;
    Для каждого Стр Из ВыделенныеСтроки Цикл
        
        СтрокаТаблицыФормы = Объект.Упаковки.НайтиПоИдентификатору(Стр);
        НС = ТаблицаСерий.Добавить();
        ЗаполнитьЗначенияСвойств(НС,СтрокаТаблицыФормы);
        
    КонецЦикла;
    
    Запрос = Новый Запрос("ВЫБРАТЬ
                          |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Номенклатура.ЕдиницаДляОтчетов.ЕдиницаПоКлассификатору) КАК ЕдиницаДляОтчетовЕдиницаПоКлассификатору
                          |ИЗ
                          |    Справочник.Номенклатура КАК Номенклатура
                          |ГДЕ
                          |    Номенклатура.Ссылка В(&МассивНоменклатуры)
                          |
                          |ИМЕЮЩИЕ
                          |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Номенклатура.ЕдиницаДляОтчетов.ЕдиницаПоКлассификатору) > 1");
    
    Запрос.УстановитьПараметр("МассивНоменклатуры", ТаблицаСерий.ВыгрузитьКолонку("Номенклатура"));
    
    Если НЕ Запрос.Выполнить().Пустой() Тогда
        Сообщить("Нельзя распределять вес по номенклатуратуре с разными единицами измерения");
        Возврат;        
    КонецЕсли;
    
    ПродукцияСНесколькимиВыпусками.Очистить();
    
    пОбъект = РеквизитФормыВЗначение("Объект");
    
    РезультатРаспределения = пОбъект.ВыполнитьУпаковку(ТаблицаСерий, ВесПродукции);
    
    ЗначениеВРеквизитФормы(пОбъект,"Объект");
    
    Если РезультатРаспределения <> Неопределено Тогда                        
        Для каждого СтрокаУпаковкаСерии из РезультатРаспределения Цикл
            СтруктураВыпусков = ПолучитьСтруктуруВыпусковСерии(СтрокаУпаковкаСерии);                        
            Если СтруктураВыпусков.Количество() > 0 Тогда
                СтрокаУпаковкаСерии.КоличествоДокументовВыпуска = СтруктураВыпусков[0].КоличествоДокументовВыпуска;
                СтрокаУпаковкаСерии.КоличествоВыпуска = СтруктураВыпусков[0].КоличествоВыпуска;
                СтрокаУпаковкаСерии.КоличествоВыпускаВТоннах = СтруктураВыпусков[0].КоличествоВыпускаВТоннах;
            КонецЕсли;
            
            Если СтрокаУпаковкаСерии.КоличествоДокументовВыпуска = 1
                ИЛИ СтрокаУпаковкаСерии.КоличествоУпаковано = СтрокаУпаковкаСерии.КоличествоВыпуска Тогда // один выпуск или упаковываем все, что было выпущено
                СкорректироватьЗначениеВесаВДокументахВыпуска(СтрокаУпаковкаСерии);
            КонецЕсли;
        КонецЦикла;        
    КонецЕсли;
    
// отладка Объект.ДокументВыпускаДляУпаковки.Комментарий    "12345"    Строка
    Элементы.ГруппаПозицииДляУточнения.Видимость = ПродукцияСНесколькимиВыпусками.Количество() > 0;
    
КонецПроцедуры

весь листинг не привожу, но суть в том, что в процедуре СкорректироватьЗначениеВесаВДокументахВыпуска, есть код (для теста упростил)
пДокОбъект = Выборка[0].ДокументВыпуска.ПолучитьОбъект();
    пДокОбъект.Комментарий = "1235";
    пДокОбъект.Записать(РежимЗаписиДокумента.Запись);    // Объект.ДокументВыпускаДляУпаковки

суть проблемы в том, что когда в отладке возвращаюсь на клиент, тыкая F11 - комментарий "откатывается"!
Я и я не могу понять с*ка почему! Шампанское не пил, программирую лет 10, но тут прям подвис, а задача требует решения до курантов!

Прошу "свежего" взгляда!
Спасибо и с наступающими все вас!
1 NcSteel
 
28.12.19
09:37
Лень было читать, но предположу, что ОповеститьОбИзменении забы прописать, естественно его надо писать на клиенте.
2 Многолетний Апельсин
 
28.12.19
09:38
Комментарий теряется в "Объект.Комментарий"?
Если да - то надо обновить контекст формы, сделать "ЗначениеВРеквизитФормы(пДокОбъект,"Объект"); после записи пДокОбъект например.
3 Веселый Джузеппе
 
28.12.19
09:39
(1) Меняться не на форме должно, а в базе данных
Т.е. проблема в том, что я меняю объект, записываю, но по окончанию процедуры он возвращается в исходное "положение"
4 shuhard
 
28.12.19
09:41
(3) угу,
ты в модуле документа посмотри после записи, что коммент сменился
5 Веселый Джузеппе
 
28.12.19
09:44
(4) в том то и дело, что в отладке видно, что объект изменен
я дохожу до конца процедур на сервере, уже после изменения и все ок
как только падаю в процедуру на клиенте (кнопка) - данные в документе возвращаются к исходным
6 shuhard
 
28.12.19
09:46
(5) а что видно в консоле запросов у этого документа после падения в кнопку ?
7 Веселый Джузеппе
 
28.12.19
09:49
(6) Отладка стоит на Объект.ДокументВыпускаПоследний (реквизит обработки)
1. клиент кнопка //Объект.ДокументВыпускаПоследний.Комментарий = ""
2. серверные вызов, где-то посередине меняется - //Объект.ДокументВыпускаПоследний.Комментарий = "1234"
3. возврат на клиент - //Объект.ДокументВыпускаПоследний.Комментарий = ""
листинг я привел как есть, упрощена только процедура записи объета
в ней запросом получается ссылка как в Объект.ДокументВыпускаПоследний (может быть несколько документов, но в моем случае только один меняется) ну и изменяется комментарий
8 Веселый Джузеппе
 
28.12.19
09:52
(7) целиком выглядит так
&НаСервере
Процедура СкорректироватьЗначениеВесаВДокументахВыпуска(СтрокаУпаковкаСерии)
    
    Запрос = Новый Запрос("ВЫБРАТЬ
                          |    _ВыпускПродукцииПоЗаказуНаПроизводствоПродукция.Ссылка КАК ДокументВыпуска,
                          |    _ВыпускПродукцииПоЗаказуНаПроизводствоПродукция.Количество,
                          |    _ВыпускПродукцииПоЗаказуНаПроизводствоПродукция.КоличествоВТоннах
                          |ИЗ
                          |    Документ._ВыпускПродукцииПоЗаказуНаПроизводство.Продукция КАК _ВыпускПродукцииПоЗаказуНаПроизводствоПродукция
                          |ГДЕ
                          |    _ВыпускПродукцииПоЗаказуНаПроизводствоПродукция.Ссылка.Проведен
                          |    И _ВыпускПродукцииПоЗаказуНаПроизводствоПродукция.Номенклатура = &Номенклатура
                          |    И _ВыпускПродукцииПоЗаказуНаПроизводствоПродукция.ХарактеристикаНоменклатуры = &ХарактеристикаНоменклатуры
                          |    И _ВыпускПродукцииПоЗаказуНаПроизводствоПродукция.СерияНоменклатуры = &СерияНоменклатуры
                          |
                          |УПОРЯДОЧИТЬ ПО
                          |    ДокументВыпуска");
    
    Запрос.УстановитьПараметр("Номенклатура", СтрокаУпаковкаСерии.Номенклатура);
    Запрос.УстановитьПараметр("ХарактеристикаНоменклатуры", СтрокаУпаковкаСерии.ХарактеристикаНоменклатуры);
    Запрос.УстановитьПараметр("СерияНоменклатуры", СтрокаУпаковкаСерии.СерияНоменклатуры);
    
    Выборка = Запрос.Выполнить().Выгрузить();
    
    СтруктураОтбора = Новый Структура("Номенклатура, ХарактеристикаНоменклатуры, СерияНоменклатуры");
    ЗаполнитьЗначенияСвойств(СтруктураОтбора, СтрокаУпаковкаСерии);
    
    ИндексВыборки = Выборка.Количество() - 1;
    ВесКРаспределению = СтрокаУпаковкаСерии.ВесАналитический;
    
    Пока ИндексВыборки >= 0 Цикл
        СтрокаВыборки = Выборка[ИндексВыборки];
        
        ДокВыпуск = СтрокаВыборки.ДокументВыпуска.ПолучитьОбъект();        
        ДокВыпуск.Комментарий = "Тест: " + ТекущаяДата();
        ДокВыпуск.Записать(РежимЗаписиДокумента.Запись);
        
        ЗначениеВРеквизитФормы(ДокВыпуск, "ДокументВыпускаПоследний");
        
        ИндексВыборки = ИндексВыборки - 1;
    КонецЦикла;
    
КонецПроцедуры
9 Веселый Джузеппе
 
28.12.19
09:53
(8)  ЗначениеВРеквизитФормы(ДокВыпуск, "ДокументВыпускаПоследний"); лишнее, это я пробовал (2)
10 shuhard
 
28.12.19
09:57
(7)[ну и изменяется комментарий]
т.е. в базу данных комментарий записан верно.

что ты тогда дёргаешься ?
перезаполни табличные части своей обработки через выборку запросом
11 Веселый Джузеппе
 
28.12.19
10:04
(10) в том то и дело, что изменения в документе не фиксируются...
https://c2n.me/45jnIgw
https://clip2net.com/s/45jnJ4l
12 Веселый Джузеппе
 
28.12.19
10:37
Путем тестов сократил код, который ведет себя аналогично (11)

&НаСервере
Процедура ВыполнитьУпаковкуНаСервере(ВесПродукции = 0)
    
    ТаблицаСерий = Объект.Упаковки.Выгрузить();
    ТаблицаСерий.Очистить();
    
    ВыделенныеСтроки = Элементы.Упаковки.ВыделенныеСтроки;
    Для каждого Стр Из ВыделенныеСтроки Цикл        
        СтрокаТаблицыФормы = Объект.Упаковки.НайтиПоИдентификатору(Стр);
        НС = ТаблицаСерий.Добавить();
        ЗаполнитьЗначенияСвойств(НС,СтрокаТаблицыФормы);        
    КонецЦикла;
    
    Запрос = Новый Запрос("ВЫБРАТЬ
                          |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Номенклатура.ЕдиницаДляОтчетов.ЕдиницаПоКлассификатору) КАК ЕдиницаДляОтчетовЕдиницаПоКлассификатору
                          |ИЗ
                          |    Справочник.Номенклатура КАК Номенклатура
                          |ГДЕ
                          |    Номенклатура.Ссылка В(&МассивНоменклатуры)
                          |
                          |ИМЕЮЩИЕ
                          |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Номенклатура.ЕдиницаДляОтчетов.ЕдиницаПоКлассификатору) > 1");
    
    Запрос.УстановитьПараметр("МассивНоменклатуры", ТаблицаСерий.ВыгрузитьКолонку("Номенклатура"));
    
    Если НЕ Запрос.Выполнить().Пустой() Тогда
        Сообщить("Нельзя распределять вес по номенклатуратуре с разными единицами измерения");
        Возврат;        
    КонецЕсли;
    
    ПродукцияСНесколькимиВыпусками.Очистить();
    
    пОбъект = РеквизитФормыВЗначение("Объект");
    
    РезультатРаспределения = пОбъект.ВыполнитьУпаковку(ТаблицаСерий, ВесПродукции);
    
    ДокВыпуск = Объект.ДокументВыпускаДляУпаковки.ПолучитьОбъект();
    ДокВыпуск.Комментарий = "Тест: " + ТекущаяДата();
    ДокВыпуск.Записать(РежимЗаписиДокумента.Запись);
        
    Элементы.ГруппаПозицииДляУточнения.Видимость = ПродукцияСНесколькимиВыпусками.Количество() > 0;
        
КонецПроцедуры

&НаКлиенте
Процедура КомандаВыполнитьУпаковкуСУказаниемВеса(Команда)
    
ВыполнитьУпаковкуНаСервере(ВесПродукции);
    
КонецПроцедуры

не могу понять, в чем проблема!((
13 Веселый Джузеппе
 
28.12.19
10:40
похоже, проблема в следующем:

пОбъект = РеквизитФормыВЗначение("Объект");
РезультатРаспределения = пОбъект.ВыполнитьУпаковку(ТаблицаСерий, ВесПродукции);
ЗначениеВРеквизитФормы(пОбъект,"Объект");

в процедуре заполняется ТЧ и передается на форму, но почему это не дает мне записать документы - непонятно
14 Веселый Джузеппе
 
28.12.19
10:55
Вообщем в проблеме не разобрался, но получилось обойти ее, разбив серверную процедуру на 2 части. В первой заполняю реквизит формы, во второй обрабатываю его, записывая документы.
Код отработал без проблем.

&НаКлиенте
Процедура КомандаВыполнитьУпаковкуСУказаниемВеса(Команда)
    ВыполнитьУпаковкуНаСервере(ВесПродукции);
        ОбработатьВыпускиНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОбработатьВыпускиНаСервере()
    
    Если РезультатРаспределения.Количество() > 0 Тогда                        
        Для каждого СтрокаУпаковкаСерии из РезультатРаспределения Цикл
            СтруктураВыпусков = ПолучитьСтруктуруВыпусковСерии(СтрокаУпаковкаСерии);                        
            Если СтруктураВыпусков.Количество() > 0 Тогда
                СтрокаУпаковкаСерии.КоличествоДокументовВыпуска = СтруктураВыпусков[0].КоличествоДокументовВыпуска;
                СтрокаУпаковкаСерии.КоличествоВыпуска = СтруктураВыпусков[0].КоличествоВыпуска;
                СтрокаУпаковкаСерии.КоличествоВыпускаВТоннах = СтруктураВыпусков[0].КоличествоВыпускаВТоннах;
            КонецЕсли;
            
            Если СтрокаУпаковкаСерии.КоличествоДокументовВыпуска = 1
                ИЛИ СтрокаУпаковкаСерии.КоличествоУпаковано = СтрокаУпаковкаСерии.КоличествоВыпуска Тогда // один выпуск или упаковываем все, что было выпущено
                СкорректироватьЗначениеВесаВДокументахВыпуска(СтрокаУпаковкаСерии);
            Иначе
                ПроблемнаяСтр = ПродукцияСНесколькимиВыпусками.Добавить();
                ЗаполнитьЗначенияСвойств(ПроблемнаяСтр, СтрокаУпаковкаСерии);
            КонецЕсли;
        КонецЦикла;        
    КонецЕсли;    
    
    Элементы.ГруппаПозицииДляУточнения.Видимость = ПродукцияСНесколькимиВыпусками.Количество() > 0;
    
КонецПроцедуры
15 Franchiser
 
гуру
28.12.19
20:32
ЗначениеВРеквизитФормы
16 PR
 
29.12.19
01:02
Гражданин, ты получил в форму объект и его курочишь
Потом ты вызываешь где-то код, который еще раз в отдельном виде получает из базы объект и его курочит
И после этого вот ведь незадача твоя форма не обновляет комментарий, который ты записал где-то тихой ночью никому не сказав
Ну вот и кто ты после этого?