Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Заполнение колонки списка документов
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
Veizdem
Поставили задачу, необходимо добавить колонку "Сумма Потрачено" в список документа "Авансовый Отчет". Сумма эта вычисляется в форме документа на основе заполнения 2 вкладок на форме. Как можно вытащить это значение?

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


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

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


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

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


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

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

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


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

А все, что выше - я говорила для универсальной встроенной обработки "Групповая обработка справочников и документов". Там нет понятия простой перезаписи документов - или проведение, или изменение реквизитов.
Veizdem
Через произвольный алгоритм в "Универсальный подбор и обработка объектов" попробовал сейчас - оно отработало, выдало, мол успешно завершено и количество обработанных элементов показало, а в списке документов как было пусто в поле суммы, так и осталось.
Rayne
А если документ вручную перезаписать - суммы появляются? Возможно, расчет вашего реквизита отрабатывает только при интерактивном проведении.
Veizdem
Цитата(Rayne @ 23.07.14, 11:32) необходимо зарегистрироваться для просмотра ссылки
В этом случае обязательно сделать копию базы. На копии потренироваться с групповой обработкой. Поинтересуйтесь у бухгалтеров нужны ли комментарии в авансовых отчетах. В групповой обработке отобрать все документы Авансовый отчет, на второй закладке выбрать действие Изменить комментарий. Выполнить. В этом случае проведения не будет, только запись.


На копии сижу постоянно, сейчас попробую сделать.

Цитата(Rayne @ 23.07.14, 11:35) необходимо зарегистрироваться для просмотра ссылки
А если документ вручную перезаписать - суммы появляются? Возможно, расчет вашего реквизита отрабатывает только при интерактивном проведении.


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

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


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

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

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

Всем спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.