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


Этот образец может использоваться для контроля правильности заполнения документа или для дозаполнения документа по результатам запроса, пока он еще не записан.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн