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

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

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

Оффлайн Lecowi

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


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

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


Оффлайн AIFrame

  • *****
  • Сообщений: 1368
  • РЕПУТАЦИЯ: 176
  • КПД: 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

  • *
  • Сообщений: 48
  • РЕПУТАЦИЯ: 14
  • КПД: 29%
  • Регистрация: 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

  • *****
  • Сообщений: 1368
  • РЕПУТАЦИЯ: 176
  • КПД: 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
Просмотров: 4805
Последний ответ 23 Ноя 2014, 12:36
от дфтын
Ребята, срочно нужна помощь. Какую процедуру нужно написать в форме справочника, чтобы таблица заполнялась данными из другого справочника?

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

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

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

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

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

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

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

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

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

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

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


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

* Реклама

* Поиск

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

* Реклама

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

AIFrame AIFrame
31 Сообщений
alexandr_ll
29 Сообщений
wise wise
29 Сообщений
Геннадий ОбьГЭС Геннадий ОбьГЭС
27 Сообщений
DmitriyF DmitriyF
13 Сообщений
vova-1c@xaker.ru
11 Сообщений
Мария112689
9 Сообщений
Yamuna
8 Сообщений
kiksi
8 Сообщений
Eugeneer Eugeneer
8 Сообщений

* Кто онлайн

  • Точка Гостей: 132
  • Точка Скрытых: 0
  • Точка Пользователей: 0

Нет пользователей онлайн.

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

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

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

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

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal