Версия для печати темы (https://pro1c.org.ua/index.php?s=e59dc53473439b6632bd123c22a154fb&showtopic=2521)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.1 (8.0) _ Помогите решить задачку

Автор: Стажёр 27.12.10, 7:23

Здравствуйте! Помогите решить задачку. Есть документ Заявка на ТМЦ, зависимый от него регистр сведений Журнал заявок. На основе журнала создаем документ перемещения. Если количество перемещенных ТМЦ не равно кол-ву заявленных ТМЦ, то их разница расчитывается и заносится в колонку Остаток к обеспечению. Пишу такой код в форме документа перемещения:

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



Разница считается не правильно:
Заявка на ТМЦ(кол-во) Перемещение выдает ОстатокКОбеспечению
5 4 2
5 3 2

Автор: Vofka 27.12.10, 8:01

Я думаю это потому что у вас и в первом и во втором случае выбирается один и тот же документ (так же он в выборку попадёт во всех последующих случаях), по которому эта цифра действительно 2.

Автор: Batchir 27.12.10, 8:21

Вы перебираете весь регистр сведений. В нем могут быть, например, 200 заявок по 100 строк по разным складам и при получении строки регистра Вы перебираете строки тч (47046430.gif). А потом ещё в этих циклах получаете объект документа и делаете отмену проведения (47046430.gif 47046430.gif). После чего ещё обходите строки документа заявки и в них рассчитывате что-то (47046430.gif 47046430.gif 47046430.gif) И заново проводите заявку в цикле (47046430.gif в N-ой степени).
Такой циклоцикл в цикле с распроведением и проведением документов непростителен любому программисту (я имею ввиду не только 1С).

Ну и в догонку. Метод, выбранный Вами для решения задачи, неправильный. Рекомендую полностью пересмотреть структуру участка заявок ТМЦ.
Регистр сведений некорректно использовать для этой задачи.
Посмотрите типовую конфу, например, УТ. Подробнее рассмотрите цепочку документов "Внутренний заказ"+"Перемещение товаров", какие регистры они используют для подобной задачи.

Автор: Lefer 27.12.10, 9:56

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

Автор: Стажёр 27.12.10, 10:10

пересмотрела процедуру, выборка по регистру здесь не нужна.

        Для Каждого СтрокаТЧ Из Товары Цикл                                 //СтрокаТЧ - строка таб части документа перемещение
            Если ЗначениеЗаполнено(СтрокаТЧ.Заявка) Тогда
                Док = СтрокаТЧ.Заявка.ПолучитьОбъект();
                Док.Записать(РежимЗаписиДокумента.ОтменаПроведения);
                Для Каждого СтрокаЗаявки Из Док.ТМЦ Цикл        //СтрокаЗаявки - строка таб части док-а Заявка на ТМЦ
                    Если (СтрокаЗаявки.Количество > СтрокаТЧ.Количество) Тогда
                        СтрокаЗаявки.ОстатокКОбеспечению = СтрокаЗаявки.Количество - СтрокаТЧ.Количество;
                        
                    КонецЕсли;
                КонецЦикла;    
            КонецЕсли;
            Док.Записать(РежимЗаписиДокумента.Проведение);
        КонецЦикла;

Автор: Lefer 27.12.10, 10:26

        Для Каждого СтрокаЗаявки Из Док.ТМЦ Цикл        //СтрокаЗаявки - строка таб части док-а Заявка на ТМЦ
                    Если (СтрокаЗаявки.Количество > СтрокаТЧ.Количество) Тогда
                        СтрокаЗаявки.ОстатокКОбеспечению = СтрокаЗаявки.Количество - СтрокаТЧ.Количество;
                        
                    КонецЕсли;
                КонецЦикла;


Если в табличной части документа заявка больше одной строки, то цикл запишет в ОстатокОбеспечению значение последней строки...может в этом ошибка?

Автор: Batchir 27.12.10, 11:01

Да что вы в самом деле...
Метология неправильная, использовать нужно регистры накопления. Заявка приходует, Перемещение расходует, разница смотрится отчетами. Перемещение должно иметь возможность заполнения по остаткам заявок + отдельный документ закрытия заявок (списание из регистра остатков по заявкам).

А выбранный алгоритм реализации не применим в этой задаче и все варианты его использования являются извратом через ж...

Автор: Стажёр 27.12.10, 11:19

Это кусок кода,тут еще должно меняться состояние заявки, т.е если вып-ся условие
Если (СтрокаЗаявки.Количество > СтрокаТЧ.Количество) Или (Не Док.ТМЦ.Количество()> Товары.Количество()) и условие Если СтрокаЗаявки.СостояниеЗаявки = Перечисления.СостоянияЗаявки.Утверждена, тогда меняется состояние и вычисляется разница
в полной версия процедура выглядит так:

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

Автор: Lefer 27.12.10, 11:24

Цитата(Стажёр @ 27.12.10, 12:19) *
Это кусок кода,тут еще должно меняться состояние заявки, т.е если вып-ся условие Если (СтрокаЗаявки.Количество > СтрокаТЧ.Количество) Или (Не Док.ТМЦ.Количество()> Товары.Количество()) и условие Если СтрокаЗаявки.СостояниеЗаявки = Перечисления.СостоянияЗаявки.Утверждена, тогда меняется состояние и вычисляется разница

Если (СтрокаЗаявки.Количество > СтрокаТЧ.Количество) Или
(Не Док.ТМЦ.Количество()> Товары.Количество()) Тогда


Зачем Вы сравниваете количество в табличных частях документов?

Автор: Lefer 27.12.10, 11:35

Цитата(Стажёр @ 27.12.10, 8:23) *
Здравствуйте! Помогите решить задачку. Есть документ Заявка на ТМЦ, зависимый от него регистр сведений Журнал заявок. На основе журнала создаем документ перемещения. Если количество перемещенных ТМЦ не равно кол-ву заявленных ТМЦ, то их разница расчитывается и заносится в колонку Остаток к обеспечению. Пишу такой код в форме документа перемещения:


Скажите, а у Вас Перемещение создается на основе только одной заявки или нескольких? Если на основе одной, то тогда все проще - при заполнении Перемещения производите расчет разницы и остальных условий. А если Перемещение создается из нескольких заявок, то предлагаю вам сделать так: получить документы Заявки за определенный период, выбрать их ТабЧасти, создать таблицу значений с колонками Заявка(для определения документа заявки), ТМЦ, КоличествоВЗаявке. После этого передавайте табличную часть в документ Перемещение и в процессе ведите расчет количества.

Автор: Стажёр 27.12.10, 12:00

затем, что если по заявке стоит допустим 5шт ТМЦ, а в документе перемещения, созданного на основании данной заявки, поставим вместо 5ти 3шт, то заявка считается частично отгруженная(состояние меняется на частичная отгрузка) и оставшуюся часть (2шт) нужно указать в документе заявка, сколько еще нужно переместить. а если количество в заявке не отличается от кол-ва в перемещении, то состояние заявки уже будет другим.

Автор: Batchir 27.12.10, 12:08

Стажёр, можно вопрос, это вы просто изучаете программирование в 1С или делаете для реальной БД?
Просто за такой подход к решению задачи и собственно написание кода уволить могут, если на результаты Вашей работы глянет опытный программист

Автор: Lefer 27.12.10, 12:09

Цитата(Стажёр @ 27.12.10, 13:00) *
затем, что если по заявке стоит допустим 5шт ТМЦ, а в документе перемещения, созданного на основании данной заявки, поставим вместо 5ти 3шт, то заявка считается частично отгруженная(состояние меняется на частичная отгрузка) и оставшуюся часть (2шт) нужно указать в документе заявка, сколько еще нужно переместить. а если количество в заявке не отличается от кол-ва в перемещении, то состояние заявки уже будет другим.


Метод Количество() у ТабличнойЧасти получает количество строк табличной части, а не конкретное количество элемента!!!

Автор: Стажёр 27.12.10, 12:28

Цитата(Lefer @ 27.12.10, 16:35) *
Скажите, а у Вас Перемещение создается на основе только одной заявки или нескольких? Если на основе одной, то тогда все проще - при заполнении Перемещения производите расчет разницы и остальных условий. А если Перемещение создается из нескольких заявок, то предлагаю вам сделать так: получить документы Заявки за определенный период, выбрать их ТабЧасти, создать таблицу значений с колонками Заявка(для определения документа заявки), ТМЦ, КоличествоВЗаявке. После этого передавайте табличную часть в документ Перемещение и в процессе ведите расчет количества.


перемещение у меня создается на основе нескольких заявок(нескольких позиций с определённым состоянием - эти позиции записываются в регистр сведений)

Автор: Lefer 27.12.10, 12:34

Цитата(Стажёр @ 27.12.10, 13:28) *
перемещение у меня создается на основе нескольких заявок(нескольких позиций с определённым состоянием - эти позиции записываются в регистр сведений)


Тогда я Вам настоятельно рекомендую прислушаться к совету с пересмотром методологии работы.

Если Вы выбираете из нескольких заявок некоторые позиции и записываете их в Регистр, то от туда их и берите. Но для таких целей регистр сведений не подходит. Регистр накопления - вот что надо использовать. Регистр сведений созданы для того, чтобы хранить периодическую информацию.

Автор: Стажёр 27.12.10, 13:05

Цитата(Lefer @ 27.12.10, 17:34) *
Тогда я Вам настоятельно рекомендую прислушаться к совету с пересмотром методологии работы.

Если Вы выбираете из нескольких заявок некоторые позиции и записываете их в Регистр, то от туда их и берите. Но для таких целей регистр сведений не подходит. Регистр накопления - вот что надо использовать. Регистр сведений созданы для того, чтобы хранить периодическую информацию.


Спасибо, я пересмотрю способ решения задачи.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua