Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
18 Июл 2019, 01:50
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Помощь с кодом  (Прочитано 442 раз)

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

Оффлайн Lecowi

  • *
  • Сообщений: 5
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2019-03-19
  • Сайт: 
  • Профессия: Программист 1С
Помогите сделать этот код более читаемым.


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

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


Оффлайн AIFrame

  • *****
  • Сообщений: 1390
  • РЕПУТАЦИЯ: 178
  • КПД: 13%
  • Регистрация: 2015-07-22
  • Сайт: 
  • Профессия: Программист 1С
Re: Помощь с кодом
« Ответ #1: 14 Май 2019, 12:02 »
Процедура ПередЗаписью(Отказ)
   ПроверкаЗаписи=Проверка();   
   Если ПроверкаЗаписи=1 тогда
      Отказ = Истина;
      Сообщить("Нельзя сформировать комплект нельзя");
   КонецЕсли;
КонецПроцедуры

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

Оффлайн Z.spb

  • **
  • Сообщений: 55
  • РЕПУТАЦИЯ: 15
  • КПД: 27%
  • Регистрация: 2016-10-03
  • Сайт: 
  • Профессия: Программист 1С
Re: Помощь с кодом
« Ответ #2: 14 Май 2019, 12:05 »
Этот лютый, фееричный бред код нужно полностью удалить, а не "сделать более читаемым", он ужасен от начала до конца. Лишён логики и какого-либо смысла.

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


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

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

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

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



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

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

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

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

Последний раз редактировалось: Z.spb; 14 Май 2019, 12:11. Причина: Объединение сообщений

Оффлайн AIFrame

  • *****
  • Сообщений: 1390
  • РЕПУТАЦИЯ: 178
  • КПД: 13%
  • Регистрация: 2015-07-22
  • Сайт: 
  • Профессия: Программист 1С
Re: Помощь с кодом
« Ответ #3: 14 Май 2019, 13:00 »
Процедура ПередЗаписью(Отказ)  
   Если НЕ ПроверкаЗаписи() тогда
      Отказ = Истина;
      Сообщить("Нельзя сформировать комплект нельзя. Атата. Нельзя-нельзя-нельзя");
   КонецЕсли;
КонецПроцедуры

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

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

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

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

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

Последний раз редактировалось: AIFrame; 14 Май 2019, 15:02. Причина: Объединение сообщений


Теги:
 

Нужна помощь про "Отчет о смене без гашение" и "Z отчет"

Автор Serg85Раздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 1
Просмотров: 4879
Последний ответ 23 Ноя 2014, 12:36
от дфтын
Ребята, срочно нужна помощь. Какую процедуру нужно написать в форме справочника, чтобы таблица заполнялась данными из другого справочника?

Автор Олька БякинаРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 5
Просмотров: 3630
Последний ответ 27 Май 2016, 15:19
от Олька Бякина
Нужна помощь по "Управление торговлей 10.3"

Автор werstakРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 0
Просмотров: 2438
Последний ответ 26 Мар 2011, 12:50
от werstak
Нужна помощь в формировании отчета "Преобразование значения к типу Дата не может быть выполнено"

Автор STLuka1337Раздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 1
Просмотров: 2926
Последний ответ 14 Ноя 2014, 13:24
от cska-fanat-kz
Нужна помощь специалиста 1С (v8.1) (программиста) по работе с "Бухгалтерией"

Автор lx470Раздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 2
Просмотров: 2887
Последний ответ 24 Фев 2011, 15:25
от lx470

* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

MuI_I_Ika MuI_I_Ika
66 Сообщений
Геннадий ОбьГЭС Геннадий ОбьГЭС
60 Сообщений
LexaK
23 Сообщений
DmitriyF DmitriyF
17 Сообщений
wise wise
15 Сообщений
Александр Мун Александр Мун
14 Сообщений
Мария112689
11 Сообщений
alex0402 alex0402
11 Сообщений
BuhRust
10 Сообщений
alexandr_ll
8 Сообщений

* Кто онлайн

  • Точка Гостей: 205
  • Точка Скрытых: 0
  • Точка Пользователей: 1
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal