Как правильно разносить подаванов

Скачал с инфостарта обработку по перепроведению документов с очисткой видов запасов.

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

Учитесь, как правильно разносить подаванов.


Код юного новичка-подавана, поэтому обработка вызывает
недоверие.

Кто так пишет? Ужасно некрасивый код.

Есть ошибка с отбором по организации в обработке с отбором
по организации.

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

Пришлось переписать так (на скорую руку):

    Для Каждого ЭлементСписка Из СписокВидов Цикл
        Если Не
ЭлементСписка.Пометка Тогда Продолжить; КонецЕсли;
       
ЕстьОрганизация = (Не Организация.Пустая()) И (Не Метаданные.Документы[ЭлементСписка.Значение].Реквизиты.Найти(«Организация») = Неопределено);

        ТекстЗапроса = ?(ЗначениеЗаполнено(ТекстЗапроса), ТекстЗапроса
        + «
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |»
, «»);

        ТекстЗапросаТек =
       
СтрЗаменить(«ВЫБРАТЬ
        |    Док.Ссылка КАК Ссылка,
        |    Док.Дата КАК Дата
        |ИЗ
        |    Документ.ЗаказКлиента КАК Док
        |ГДЕ
        |    Док.Дата >= &ДатаНачала
        |    И Док.Дата <= &ДатаКонца
        |    И Док.Проведен = ИСТИНА
        |    И Док.ПометкаУдаления = ЛОЖЬ»
, «ЗаказКлиента», ЭлементСписка.Значение);

        Если ЕстьОрганизация И Не Организация.Пустая() Тогда
           
ТекстЗапросаТек = ТекстЗапросаТек
            + СтрЗаменить(ТекстЗапроса,
           
«И Док.ПометкаУдаления = ЛОЖЬ»,
           
«И Док.ПометкаУдаления = ЛОЖЬ И Док.Организация = &Организация»);
        КонецЕсли;

        ТекстЗапроса = ТекстЗапроса + ТекстЗапросаТек;

        ЕстьОтмеченныеЭлементы = Истина;
    КонецЦикла;

Как видите, построение текста запроса ужасное. Зачем стрзаменять кусок кода, если можно стрзаменять параметр, например &УсловиеПоОрганизацие? Это что такое? Молодежь-молодежь!

Ну и если уж делаете красивую обработку, неужели трудно проверить состав плана обмена по метаданным? К чему эти попытки исключения?

            Попытка
                Если
ПланыОбмена.ИзменениеЗарегистрировано(ВыборкаУзлов.Ссылка, Ссылка) Тогда
                   
МассивУзлов.Добавить(ВыборкаУзлов);
                КонецЕсли;
            Исключение;
            КонецПопытки;

Из плюсов могу ответить эстиматор, показывающий прогресс.

Самое главное — выводится список всех документов. А смысл? Мне нужно было только по регистру ТоварыОрганизаций, я доработал, без этого бесполезная приблуда:

&НаСервере
Процедура ПерезаполнитьВидыДокументов()
   
СписокВидов.Очистить();
    Для Каждого
ВидДокумента Из Метаданные.Документы Цикл
        Если
ТолькоПоДвижениямТоваровОрганизаций И ВидДокумента.Движения.Содержит(Метаданные.РегистрыНакопления.ТоварыОрганизаций)
            ИЛИ НЕ
ТолькоПоДвижениямТоваровОрганизаций
        Тогда
           
СписокВидов.Добавить(ВидДокумента.Имя, ?(ЗначениеЗаполнено(ВидДокумента.Синоним), ВидДокумента.Синоним, ВидДокумента.Имя), Истина);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Да, я не пользовался распроведением, но логично же каждый
документ отдельно распроводить, потом проводить, а не все скопом. Тем более не
в транзакции, кто будет восстанавливать информацию о состоянии проведенности
документа? У своих пользователей скрыл эту несомненно «вредную»
галочку.

И кстати, в УТ11.4 есть такая шняга, которая включает очистку запасов, рекомендую, она быстрее работает чем распроведение. Тем более что распроведение у тебя опасное, без транзакции, может быть потеряно состояние проведенности документа.

Док.ДополнительныеСвойства.Вставить(«ПерезаполнитьВидыЗапасов», Истина);
Док.Записать(РежимЗаписиДокумента.Проведение);

Но в принципе, очистки видов запасов достаточно. Но у тебя опять же лишний Записать есть после очистки ТЧ, а надо совмещать с проведением, это массовая обработка, тут скорость важна. Я доделал, сделал доп опцию «Проводить с перезаполнением запасов (УТ 11.4)»:

    ДокументОбъект = Ссылка.ПолучитьОбъект();
    Если
Провести Тогда
        Если
ПроводитьСПерезаполнениемЗапасов Тогда
           
ДокументОбъект.ДополнительныеСвойства.Вставить(«ПерезаполнитьВидыЗапасов», Истина);
        КонецЕсли;
        Попытка
           
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
           
Рет = Истина;

На фоне всех этих замечаний меня совсем не удивило, что в
модуле обработки нет сведений об обработке, т.е. добавить ее пользователям
сразу нельзя. Беда-беда…

Автор, напиши на fixin*mail.ru, скину версию обработки чтобы обновил. Сейчас обработка на троечку.