Имя: Пароль:
1C
1С v8
программное изменение табличной части при записи документа
, ,
0 almaz102
 
05.02.18
22:56
Добрый вечер! Подскажите пожалуйста как мне правильно реализовать?
Есть обработка мобильное приложение в котором менеджер формирует заказ с планшета и выгружает в 1с, после выгрузки  в 1с создается документ заказ и записывается. Мне нужно именно при записи документа перезаполнить цены табличной части по определенному условию в моем случаи по виду цен который указан в договоре. Я прикрутил код в процедуру ПередЗаписью() в модуле объекта, когда документ падает в 1с он не перезаполняется, такие же цены как заполнил менеджер, но если этот созданный документ я  еще раз запишу он перезаполняет. Может мне использовать другой обработчик событий? кто сталкивался с такой проблемой?
1 Мимохожий Однако
 
05.02.18
23:17
Проблема в том, что не надо это делать при записи или проведении.
2 romix
 
06.02.18
00:32
Если нужно в запросе перед записью видеть содержимое табличной части документа, я использую запрос по таблице значений (в нее сначала эту тч надо выгрузить).

По-моему, так правильнее всего и проверять еще не записанный документ, и дозаполнять его запросом.

Другие способы по-моему не всегда подходят - всякие переборы объекта в цикле обернутся запросами в цикле. Два раза записывать тоже как-то не то, что надо. А запрос по тз позволяет произвольно усложнять и при этом делать всё правильно.
3 catena
 
06.02.18
05:59
(0)Обычно помощь можно получить быстрее, если не надеяться на телепатов и выложить свой код.
А еще нужно помнить, что в процедуре "ПередЗаписью" есть доступ к двум вариантам объекта: к бывшему и к будущему. Если обращаться к реквизитам через Ссылку или в запросе - это бывший. Естественно, что у нового документа бывшие значения будут пустыми.
4 Повелитель
 
06.02.18
06:03
(0) Это нужно делать не при записи.
А в момент когда заказ приходит с КПК, в том месте, где создается документ.
5 Рэйв
 
06.02.18
06:13
Еще есть вариант, что из КПК объект записывается с ОбменДанными.Загрузка=Истина и если в ПередЗаписью это обрабатывается,то все проверки и заполнения не работают.
6 RomaH
 
naïve
06.02.18
07:37
+(5)

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    

есть такое?
7 RomaH
 
naïve
06.02.18
07:38
если нет - то это косяк - оно должно быть
см (4)
8 Сияющий в темноте
 
06.02.18
10:20
Проще вписать все,что нужно в обработку создания,при записи документа так делать нехорошо,т.к.пользователь может интерактивно создать документ,а потом записать,  после этого все косяки будут списываться на 1с сама все перезаписала
9 FIXXXL
 
06.02.18
11:04
ПередЗаписью() надеюсь не в модуле Формы?
10 romix
 
06.02.18
12:35
Пример запроса по таблице значений (чтобы видеть до записи документа содержимое табличной части в запросе; изменение табличной части в цикле по результатам запроса):


&НаСервере
Процедура ПересчитатьСуммыНаСервере(ИмяТч)

    // ДебиторскаяЗадолженность    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    тзДок.Сумма,
    |    тзДок.ДокументВзаиморасчетов,
    |    тзДок.НомерСтроки
    |ПОМЕСТИТЬ тзДок
    |ИЗ
    |    &тзДок КАК тзДок
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    тзДок.НомерСтроки,
    |    Акт.СуммаОплаты
    |ИЗ
    |    тзДок КАК тзДок
    |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.АктВыполненныхРабот КАК Акт
    |        ПО тзДок.ДокументВзаиморасчетов = Акт.Ссылка
    |
    |УПОРЯДОЧИТЬ ПО
    |    тзДок.НомерСтроки";

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


Этот образец может использоваться для контроля правильности заполнения документа или для дозаполнения документа по результатам запроса, пока он еще не записан.