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

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

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

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


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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментария 4

  1. bob:

    А зачем брать чужой кривой код ? Если там объем всего ничего — напиши сам.

    • ну интерфейс он более менее набросал. К тому же я скачал за 70 рублей (1СМ), поэтому взял как оснастку.

  2. naf2000:

    Разберись с механизмами типовой УТ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *