Версия для печати темы (https://pro1c.org.ua/index.php?s=5895f5f08aeab1f61359c2e899d11c94&showtopic=18944)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Заполнение колонки списка документов

Автор: Veizdem 23.07.14, 8:53

Поставили задачу, необходимо добавить колонку "Сумма Потрачено" в список документа "Авансовый Отчет". Сумма эта вычисляется в форме документа на основе заполнения 2 вкладок на форме. Как можно вытащить это значение?

Приложение обычное, платформа 8.2.

Автор: Petre 23.07.14, 9:05

Добавить в документ реквизит и вычислять его значение перед записью. В список вывести данный реквизит.

Автор: Veizdem 23.07.14, 9:17

Цитата(Petre @ 23.07.14, 10:05) *
Добавить в документ реквизит и вычислять его значение перед записью. В список вывести данный реквизит.


Сейчас попробую

Но на сколько я понимаю это будет только для новых элементов, а мне нужно вывести несколько тысяч уже имеющихся и записанных без такого реквизита.

Автор: Rayne 23.07.14, 9:22

Можно обработкой записать, если сильно надо. ДокументОбъект.Записать(РежимЗаписиДокумента.Запись) - это не перепроведение, на партии запасов не повлияет.

Автор: Petre 23.07.14, 9:26

Обработать групповой обработкой.

Автор: Veizdem 23.07.14, 10:02

Все понял, кроме одного - как через групповую обработку процесс записи дать, не нашел я там такой "педали".

Автор: Rayne 23.07.14, 10:08

Вообще надо инициировать запись документа и процедуру по расчету нового реквизита. Значит, надо реквизит какой-то поменять. Теоретически - пробел в Комментарий записать. А если там уже был комментарий заполнен?.. Но я бы лучше написала свою обработку в три строки. Быстро, сурово, ничего лишнего.

Автор: Veizdem 23.07.14, 10:21

Цитата(Rayne @ 23.07.14, 11:08) *
Вообще надо инициировать запись документа и процедуру по расчету нового реквизита. Значит, надо реквизит какой-то поменять. Теоретически - пробел в Комментарий записать. А если там уже был комментарий заполнен?.. Но я бы лучше написала свою обработку в три строки. Быстро, сурово, ничего лишнего.


Я 1С меньше месяца назад впервые увидел. Так что многого в глаза еще не видел, хотя и читаю литературку все время. Вот обработки еще не ковырял вообще (

Я так понимаю надо написать нечто типа такого:
Если Комментарий = неопределено Тогда
    Комментарий = " ";
Иначе
    Комментарий = Комментарий + " "
КонецЕсли;


А вот как из этого обработку сделать - чет не соображу никак (

Автор: Rayne 23.07.14, 10:32

В этом случае обязательно сделать копию базы. На копии потренироваться с групповой обработкой. Поинтересуйтесь у бухгалтеров нужны ли комментарии в авансовых отчетах. В групповой обработке отобрать все документы Авансовый отчет, на второй закладке выбрать действие Изменить комментарий. Выполнить. В этом случае проведения не будет, только запись.

Если своей обработкой... Можно получить выборку документов запросом, а можно перебрать без запроса.

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    АвансовыйОтчет.Ссылка
                   |ИЗ
                   |    Документ.АвансовыйОтчет КАК АвансовыйОтчет
                   |ГДЕ
                   |    АвансовыйОтчет.Дата МЕЖДУ &Дата1 И &Дата2";
                  
    //делаем выборку                  
    Выборка = Запрос.Выполнить().Выбрать();
    //перебираем элементы выборки в цикле
    Пока Выборка.Следующий() Цикл
        //получим сам объект, чтобы иметь возможность его записать
        ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
        ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
        Сообщить("Записан " + ДокументОбъект);    
    КонецЦикла;
    Предупреждение("Обработка завершена!");


Это код для своей обработки - не нужно трогать ни реквизиты, ни комментарий.

А все, что выше - я говорила для универсальной встроенной обработки "Групповая обработка справочников и документов". Там нет понятия простой перезаписи документов - или проведение, или изменение реквизитов.

Автор: Veizdem 23.07.14, 10:33

Через произвольный алгоритм в "Универсальный подбор и обработка объектов" попробовал сейчас - оно отработало, выдало, мол успешно завершено и количество обработанных элементов показало, а в списке документов как было пусто в поле суммы, так и осталось.

Автор: Rayne 23.07.14, 10:35

А если документ вручную перезаписать - суммы появляются? Возможно, расчет вашего реквизита отрабатывает только при интерактивном проведении.

Автор: Veizdem 23.07.14, 10:37

Цитата(Rayne @ 23.07.14, 11:32) http://pro1c.org.ua/index.php?act=findpost&pid=89182
А если документ вручную перезаписать - суммы появляются? Возможно, расчет вашего реквизита отрабатывает только при интерактивном проведении.


Вручную - появляется все нормально.

Автор: Rayne 23.07.14, 10:40

Реквизит в модуле форме рассчитывается? Если да - тогда надо в тот код, что я написала добавить еще расчет реквизита и присвоение.

       ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
       ДокументОбъект.СуммаПотрачено = ...; //здесь итоги складываем или что там надо посчитать
       ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);

Автор: Veizdem 23.07.14, 10:43

Курс = ?(КурсВал = 0, 1, КурсВал);
    СуммаПотрачено = Состав.Итог("Сумма") + ?(НЕ ЦеныСНДС, Состав.Итог("НДС"), 0) / Курс + Оплата.Итог("Сумма");


Вот так считается сама сумма в модуле формы документа.

Автор: Rayne 23.07.14, 10:49

Ну вот этот кусочек туда и впихнуть, в эту обработку. А еще лучше попробовать ее перенести в модуль документа. Посмотрите для примера процедуру ПередЗаписью() в модуле документа и обратите внимание на то, как рассчитывается реквизит СуммаДокумента.

Автор: Veizdem 23.07.14, 14:25

В общем реализовал таким образом:

Через "Универсальный подбор и обработка объектов", на вкладке "Обработка" в разделе "Произвольный алгоритм" вписал и выполнил такой код:

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

Все отработало нормально, везде все суммы посчитало, была правда одна ошибка - там за 11 год еще не указан был вид НДС, а в таком случае запрет на запись стоит, но это уже не относится к работе данной обработки.

Всем спасибо.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua