Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите решить задачку
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.1 (8.0)
Стажёр
Здравствуйте! Помогите решить задачку. Есть документ Заявка на ТМЦ, зависимый от него регистр сведений Журнал заявок. На основе журнала создаем документ перемещения. Если количество перемещенных ТМЦ не равно кол-ву заявленных ТМЦ, то их разница расчитывается и заносится в колонку Остаток к обеспечению. Пишу такой код в форме документа перемещения:
Процедура ПриЗаписи()
    Выборка = РегистрыСведений.СостояниеЗаявокНаТМЦ.Выбрать();
    Пока Выборка.Следующий() Цикл
        Для Каждого СтрокаТЧ Из Товары Цикл                                 //СтрокаТЧ - строка таб части документа перемещение
            Если ЗначениеЗаполнено(СтрокаТЧ.Заявка) Тогда
                Док = СтрокаТЧ.Заявка.ПолучитьОбъект();
                Док.Записать(РежимЗаписиДокумента.ОтменаПроведения);
                Для Каждого СтрокаЗаявки Из Док.ТМЦ Цикл        //СтрокаЗаявки - строка таб части док-а Заявка на ТМЦ
                    Если (СтрокаЗаявки.Количество > СтрокаТЧ.Количество) Тогда
                        СтрокаЗаявки.ОстатокКОбеспечению = СтрокаЗаявки.Количество - СтрокаТЧ.Количество;
                        
                    КонецЕсли;
                КонецЦикла;    
            КонецЕсли;
            Док.Записать(РежимЗаписиДокумента.Проведение);
        КонецЦикла;
    КонецЦикла;



Разница считается не правильно:
Заявка на ТМЦ(кол-во) Перемещение выдает ОстатокКОбеспечению
5 4 2
5 3 2
Vofka
Я думаю это потому что у вас и в первом и во втором случае выбирается один и тот же документ (так же он в выборку попадёт во всех последующих случаях), по которому эта цифра действительно 2.
Batchir
Вы перебираете весь регистр сведений. В нем могут быть, например, 200 заявок по 100 строк по разным складам и при получении строки регистра Вы перебираете строки тч (47046430.gif). А потом ещё в этих циклах получаете объект документа и делаете отмену проведения (47046430.gif 47046430.gif). После чего ещё обходите строки документа заявки и в них рассчитывате что-то (47046430.gif 47046430.gif 47046430.gif) И заново проводите заявку в цикле (47046430.gif в N-ой степени).
Такой циклоцикл в цикле с распроведением и проведением документов непростителен любому программисту (я имею ввиду не только 1С).

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

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


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

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

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


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


Скажите, а у Вас Перемещение создается на основе только одной заявки или нескольких? Если на основе одной, то тогда все проще - при заполнении Перемещения производите расчет разницы и остальных условий. А если Перемещение создается из нескольких заявок, то предлагаю вам сделать так: получить документы Заявки за определенный период, выбрать их ТабЧасти, создать таблицу значений с колонками Заявка(для определения документа заявки), ТМЦ, КоличествоВЗаявке. После этого передавайте табличную часть в документ Перемещение и в процессе ведите расчет количества.
Стажёр
затем, что если по заявке стоит допустим 5шт ТМЦ, а в документе перемещения, созданного на основании данной заявки, поставим вместо 5ти 3шт, то заявка считается частично отгруженная(состояние меняется на частичная отгрузка) и оставшуюся часть (2шт) нужно указать в документе заявка, сколько еще нужно переместить. а если количество в заявке не отличается от кол-ва в перемещении, то состояние заявки уже будет другим.
Batchir
Стажёр, можно вопрос, это вы просто изучаете программирование в 1С или делаете для реальной БД?
Просто за такой подход к решению задачи и собственно написание кода уволить могут, если на результаты Вашей работы глянет опытный программист
Lefer
Цитата(Стажёр @ 27.12.10, 13:00) необходимо зарегистрироваться для просмотра ссылки
затем, что если по заявке стоит допустим 5шт ТМЦ, а в документе перемещения, созданного на основании данной заявки, поставим вместо 5ти 3шт, то заявка считается частично отгруженная(состояние меняется на частичная отгрузка) и оставшуюся часть (2шт) нужно указать в документе заявка, сколько еще нужно переместить. а если количество в заявке не отличается от кол-ва в перемещении, то состояние заявки уже будет другим.


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


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


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

Если Вы выбираете из нескольких заявок некоторые позиции и записываете их в Регистр, то от туда их и берите. Но для таких целей регистр сведений не подходит. Регистр накопления - вот что надо использовать. Регистр сведений созданы для того, чтобы хранить периодическую информацию.
Стажёр
Цитата(Lefer @ 27.12.10, 17:34) необходимо зарегистрироваться для просмотра ссылки
Тогда я Вам настоятельно рекомендую прислушаться к совету с пересмотром методологии работы.

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


Спасибо, я пересмотрю способ решения задачи.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.