Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 08:24

Помощь с кодом

Автор Lecowi, 14 мая 2019, 10:57

0 Пользователей и 1 гость просматривают эту тему.

Lecowi

Помогите сделать этот код более читаемым.


Процедура ПередЗаписью(Отказ)
   ПроверкаЗаписи=Проверка();   
   Если ПроверкаЗаписи=1 тогда
      Отказ = Истина;
      Сообщить("Нельзя сформировать комплект нельзя");
   КонецЕсли;
КонецПроцедуры

Функция Проверка()
   Выборка = Справочники.Партии.Выбрать();
   Пока Выборка.Следующий() цикл
      Флаг=0;
      Флаг1=0;
      Для каждого стр из Выборка.ЭлементыПартии цикл
         флаг1=флаг1+1;
         колстрокВТЧ=0;
         Для каждого ТекующаяСТРТЧ из ЭтотОбъект.ЭлементыПартии цикл
            колстрокВТЧ=колстрокВТЧ+1;
            Если СокрЛП(стр.Номенклатура) = СокрЛП(ТекующаяСТРТЧ.Номенклатура) тогда
               флаг=флаг+1;
               Если стр.Количество = ТекующаяСТРТЧ.Количество тогда
                  флаг = флаг + 1;
               Иначе
                  флаг= флаг-1;
               КонецЕсли;
            Иначе
               флаг= флаг-1;
            КонецЕсли;
            Если флаг1=флаг и  флаг1=колстрокВТЧ тогда
               Сообщить("Полное совпадение комплектов "+Выборка.Ссылка);
               Возврат 1;
            КонецЕсли;
         КонецЦикла;
      КонецЦикла;
   КонецЦикла;
КонецФункции;

AIFrame

Процедура ПередЗаписью(Отказ)
   ПроверкаЗаписи=Проверка();   
   Если ПроверкаЗаписи=1 тогда
      Отказ = Истина;
      Сообщить("Нельзя сформировать комплект нельзя");
   КонецЕсли;
КонецПроцедуры

Функция Проверка()
   Выборка = Справочники.Партии.Выбрать();
   Пока Выборка.Следующий() цикл
      Флаг=0;
      Флаг1=0;
      Для каждого стр из Выборка.ЭлементыПартии цикл
         флаг1=флаг1+1;
         колстрокВТЧ=0;
         Для каждого ТекующаяСТРТЧ из ЭтотОбъект.ЭлементыПартии цикл
            колстрокВТЧ=колстрокВТЧ+1;
            Если СокрЛП(стр.Номенклатура) = СокрЛП(ТекующаяСТРТЧ.Номенклатура) тогда
               флаг=флаг+1;
               Если стр.Количество = ТекующаяСТРТЧ.Количество тогда
                  флаг = флаг + 1;
               Иначе
                  флаг= флаг-1;
               КонецЕсли;
            Иначе
               флаг= флаг-1;
            КонецЕсли;
            Если флаг1=флаг и  флаг1=колстрокВТЧ тогда
               Сообщить("Полное совпадение комплектов "+Выборка.Ссылка);
               Возврат 1;
            КонецЕсли;
         КонецЦикла;
      КонецЦикла;
   КонецЦикла;
КонецФункции;

Z.spb

Этот лютый, фееричный бред код нужно полностью удалить, а не "сделать более читаемым", он ужасен от начала до конца. Лишён логики и какого-либо смысла.

Если я правильно всё понял, вы хотите запретить запись элемента справочника "Партии", при условии, что уже есть совпадающий по строкам табличной части "ЭлементыПартии".

И для этого вы выборкой обходите все(!) имеющиеся элементы справочника (а если их несколько тысяч? десятков тысяч?), более того в каждом элементе выборки вы залезаете в табличную часть (т.е. фактически раз за разом считываете новый объект из базы данных!) и обходите каждую строку ТЧ. Сколько времени займёт только вот этот кусок кода, не учитывая всё что внутри?
   Выборка = Справочники.Партии.Выбрать();
   Пока Выборка.Следующий() цикл
        Для каждого стр из Выборка.ЭлементыПартии цикл
          ...
        КонецЦикла;
   КонецЦикла;



Внутри двойного цикла вы делаете третий - каждый раз обходите сравнивая строки ТЧ своего объекта. И каждый раз подсчитываете заново их количество... (если что количество строк в тч можно посчитать 1 раз - "ЭтотОбъект.ЭлементыПартии.Количество()".)

Переменная "флаг1" она у вас обнуляется каждый раз после " Выборка.Следующий() " а затем инкремируется на единицу после " стр из Выборка.ЭлементыПартии ". Т.е. получается, что "флаг1" это номер строки в "Выборка.ЭлементыПартии ". Если мы имеем дело с табличной частью справочника, там УЖЕ есть реквизит "НомерСтроки". То есть достаточно написать "стр.НомерСтроки". Зачем нужна "флаг1"???

Переменная "Флаг" также обнуляется каждый раз после " Выборка.Следующий() ", далее вы её увеличиваете на единицу если номенклатура совпала + ещё на 1 если и количество совпало, а  если номенклатура не совпала она у вас уменьшается с нуля на -1 , далее вы сравниваете "Если флаг1=флаг".. это я вообще не знаю как объяснить. Это бессмыслица. У вас переменная флаг может стать 1, 2 или -1, в зависимости от совпадений, а флаг1 это вообще номер строки в ТЧ выборки...

Вот это ещё. " Если СокрЛП(стр.Номенклатура) = СокрЛП(ТекующаяСТРТЧ.Номенклатура) "  - а почему "СкорЛП()"? Там строки? Вы уверены? Обычно поле "Номенклатура" имеет тип "СправочникСсылка.Номенклатура".



В общем. Вам нужен запрос к базе данных. Выгрузить"ЭтотОбъект.ЭлементыПартии" в таблицу значений, запихнуть её в запрос как временную таблицу. И искать запросом. Но судя по вашему коду... Тут азы учить нужно.
Добавлено: 14 мая 2019, 12:11


Цитата: AIFrame от 14 мая 2019, 12:02
Процедура ПередЗаписью(Отказ)
   ПроверкаЗаписи=Проверка();   
   Если ПроверкаЗаписи=1 тогда
      Отказ = Истина;
      Сообщить("Нельзя сформировать комплект нельзя");
   КонецЕсли;
КонецПроцедуры

Функция Проверка()
   Выборка = Справочники.Партии.Выбрать();
   Пока Выборка.Следующий() цикл
      Флаг=0;
      Флаг1=0;
      Для каждого стр из Выборка.ЭлементыПартии цикл
         флаг1=флаг1+1;
         колстрокВТЧ=0;
         Для каждого ТекующаяСТРТЧ из ЭтотОбъект.ЭлементыПартии цикл
            колстрокВТЧ=колстрокВТЧ+1;
            Если СокрЛП(стр.Номенклатура) = СокрЛП(ТекующаяСТРТЧ.Номенклатура) тогда
               флаг=флаг+1;
               Если стр.Количество = ТекующаяСТРТЧ.Количество тогда
                  флаг = флаг + 1;
               Иначе
                  флаг= флаг-1;
               КонецЕсли;
            Иначе
               флаг= флаг-1;
            КонецЕсли;
            Если флаг1=флаг и  флаг1=колстрокВТЧ тогда
               Сообщить("Полное совпадение комплектов "+Выборка.Ссылка);
               Возврат 1;
            КонецЕсли;
         КонецЦикла;
      КонецЦикла;
   КонецЦикла;
КонецФункции;


Ахах, а ты хорош :D:D:D

AIFrame

Процедура ПередЗаписью(Отказ) 
   Если НЕ ПроверкаЗаписи() тогда
      Отказ = Истина;
      Сообщить("Нельзя сформировать комплект нельзя. Атата. Нельзя-нельзя-нельзя");
   КонецЕсли;
КонецПроцедуры

Функция ПроверкаЗаписи()
    ТемпТЧ = ЭлементыПартии.Выгрузить();
    ТемпТЧ.Свернуть("Номенклатура", "Количество");
    СписокНоменклатуры = ТемпТЧ.ВыгрузитьКолонку("Номенклатура");
    Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Партии.Ссылка КАК Ссылка,
| Партии.Номенклатура КАК Номенклатура,
| СУММА(Партии.Количество) КАК Количество
|ИЗ
| Справочник.Партии.ЭлементыПартии КАК Партии
|ГДЕ
| Партии.Номенклатура В(&СписокНоменклатуры)
|
|СГРУППИРОВАТЬ ПО
| Партии.Ссылка,
| Партии.Номенклатура";
    Запрос.УстановитьПараметр("СписокНоменклатуры", СписокНоменклатуры);
    ТЧРезультат = Запрос.Выполнить().Выгрузить();
    СписокДокументов = ТЧРезультат.Скопировать();
    СписокДокументов.Свернуть("Ссылка");

    ЕстьСовпадение = Ложь;
    СсылкаСовпадения = неопределено;

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

Функция СравнитьТаблицыИдентичны(Таблица1, Таблица2)
    Если Таблица1.Количество() <> Таблица2.Количество() Тогда
        Возврат Ложь;
    КонецЕсли;
    Если Таблица1.Итог("Количество") <> Таблица2.Итог("Количество") Тогда
        Возврат Ложь;
    КонецЕсли;
    Таблица1.Сверунуть("Номенклатура", "Количество");
    Таблица2.Сверунуть("Номенклатура", "Количество");
    Таблица1.Сортировать("Номенклатура Возр");
    Таблица2.Сортировать("Номенклатура Возр");
    Для ИНД = 0 По Таблица1.Количетво() - 1 Цикл
        Если Таблица1[ИНД].Номенклатура <> Таблица2[ИНД].Номенклатура Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЦикла;
    Возврат Истина;
КонецФункции

Добавлено: 14 мая 2019, 15:02


Писал за 10 минут до ухода с работы. Ты там сам ошибки поправь и в первой функции возвраты сделай.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск