Группа: Пользователи
Сообщений: 35
Из: Томск
Спасибо сказали: 0 раз
Рейтинг: 0
Здравствуйте! Помогите решить задачку. Есть документ Заявка на ТМЦ, зависимый от него регистр сведений Журнал заявок. На основе журнала создаем документ перемещения. Если количество перемещенных ТМЦ не равно кол-ву заявленных ТМЦ, то их разница расчитывается и заносится в колонку Остаток к обеспечению. Пишу такой код в форме документа перемещения:
Процедура ПриЗаписи() Выборка = РегистрыСведений.СостояниеЗаявокНаТМЦ.Выбрать(); Пока Выборка.Следующий() Цикл Для Каждого СтрокаТЧ Из Товары Цикл //СтрокаТЧ - строка таб части документа перемещение Если ЗначениеЗаполнено(СтрокаТЧ.Заявка) Тогда Док = СтрокаТЧ.Заявка.ПолучитьОбъект(); Док.Записать(РежимЗаписиДокумента.ОтменаПроведения); Для Каждого СтрокаЗаявки Из Док.ТМЦ Цикл //СтрокаЗаявки - строка таб части док-а Заявка на ТМЦ Если (СтрокаЗаявки.Количество > СтрокаТЧ.Количество) Тогда СтрокаЗаявки.ОстатокКОбеспечению = СтрокаЗаявки.Количество - СтрокаТЧ.Количество;
Группа: Основатель
Сообщений: 13988
Из: Киев
Спасибо сказали: 4564 раз
Рейтинг: 3693.4
Я думаю это потому что у вас и в первом и во втором случае выбирается один и тот же документ (так же он в выборку попадёт во всех последующих случаях), по которому эта цифра действительно 2.
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1435 раз
Рейтинг: 0
Вы перебираете весь регистр сведений. В нем могут быть, например, 200 заявок по 100 строк по разным складам и при получении строки регистра Вы перебираете строки тч (). А потом ещё в этих циклах получаете объект документа и делаете отмену проведения ( ). После чего ещё обходите строки документа заявки и в них рассчитывате что-то ( ) И заново проводите заявку в цикле ( в N-ой степени). Такой циклоцикл в цикле с распроведением и проведением документов непростителен любому программисту (я имею ввиду не только 1С).
Ну и в догонку. Метод, выбранный Вами для решения задачи, неправильный. Рекомендую полностью пересмотреть структуру участка заявок ТМЦ. Регистр сведений некорректно использовать для этой задачи. Посмотрите типовую конфу, например, УТ. Подробнее рассмотрите цепочку документов "Внутренний заказ"+"Перемещение товаров", какие регистры они используют для подобной задачи.
Группа: Пользователи
Сообщений: 155
Спасибо сказали: 11 раз
Рейтинг: 0
Я так понимаю Вы выборкой обходите весь регистр... мне кажется, что корректнее было бы выбирать данные из регистра запросом, а потом уже обрабатывать полученную таблицу значений. Таким образом минус цикл получается. И запрос работает точнее и быстрее в данном случае.
It's the end of the world as we know it and I feel fine
Группа: Пользователи
Сообщений: 35
Из: Томск
Спасибо сказали: 0 раз
Рейтинг: 0
пересмотрела процедуру, выборка по регистру здесь не нужна.
Для Каждого СтрокаТЧ Из Товары Цикл //СтрокаТЧ - строка таб части документа перемещение Если ЗначениеЗаполнено(СтрокаТЧ.Заявка) Тогда Док = СтрокаТЧ.Заявка.ПолучитьОбъект(); Док.Записать(РежимЗаписиДокумента.ОтменаПроведения); Для Каждого СтрокаЗаявки Из Док.ТМЦ Цикл //СтрокаЗаявки - строка таб части док-а Заявка на ТМЦ Если (СтрокаЗаявки.Количество > СтрокаТЧ.Количество) Тогда СтрокаЗаявки.ОстатокКОбеспечению = СтрокаЗаявки.Количество - СтрокаТЧ.Количество;
Группа: Пользователи
Сообщений: 155
Спасибо сказали: 11 раз
Рейтинг: 0
Для Каждого СтрокаЗаявки Из Док.ТМЦ Цикл //СтрокаЗаявки - строка таб части док-а Заявка на ТМЦ Если (СтрокаЗаявки.Количество > СтрокаТЧ.Количество) Тогда СтрокаЗаявки.ОстатокКОбеспечению = СтрокаЗаявки.Количество - СтрокаТЧ.Количество;
КонецЕсли; КонецЦикла;
Если в табличной части документа заявка больше одной строки, то цикл запишет в ОстатокОбеспечению значение последней строки...может в этом ошибка?
It's the end of the world as we know it and I feel fine
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1435 раз
Рейтинг: 0
Да что вы в самом деле... Метология неправильная, использовать нужно регистры накопления. Заявка приходует, Перемещение расходует, разница смотрится отчетами. Перемещение должно иметь возможность заполнения по остаткам заявок + отдельный документ закрытия заявок (списание из регистра остатков по заявкам).
А выбранный алгоритм реализации не применим в этой задаче и все варианты его использования являются извратом через ж...
Группа: Пользователи
Сообщений: 35
Из: Томск
Спасибо сказали: 0 раз
Рейтинг: 0
Это кусок кода,тут еще должно меняться состояние заявки, т.е если вып-ся условие Если (СтрокаЗаявки.Количество > СтрокаТЧ.Количество) Или (Не Док.ТМЦ.Количество()> Товары.Количество()) и условие Если СтрокаЗаявки.СостояниеЗаявки = Перечисления.СостоянияЗаявки.Утверждена, тогда меняется состояние и вычисляется разница в полной версия процедура выглядит так:
Процедура ПриЗаписи() Для Каждого СтрокаТЧ Из Товары Цикл Если ЗначениеЗаполнено(СтрокаТЧ.Заявка) Тогда Док = СтрокаТЧ.Заявка.ПолучитьОбъект(); Док.Записать(РежимЗаписиДокумента.ОтменаПроведения); Для Каждого СтрокаЗаявки Из Док.ТМЦ Цикл Если (СтрокаЗаявки.Количество > СтрокаТЧ.Количество) Или (Не Док.ТМЦ.Количество()> Товары.Количество()) Тогда Если СтрокаЗаявки.СостояниеЗаявки = Перечисления.СостоянияЗаявки.Утверждена Тогда СтрокаЗаявки.СостояниеЗаявки = Перечисления.СостоянияЗаявки.ОтгруженоНаОбъект; СтрокаЗаявки.КоличествоКОбеспечению = СтрокаЗаявки.Количество - СтрокаТЧ.Количество; КонецЕсли; Иначе СтрокаЗаявки.СостояниеЗаявки = Перечисления.СостоянияЗаявки.ЧастичнаяОтгрузка; СтрокаЗаявки.КоличествоКОбеспечению = СтрокаЗаявки.Количество - СтрокаТЧ.Количество; КонецЕсли; КонецЦикла; КонецЕсли; Док.Записать(РежимЗаписиДокумента.Проведение); КонецЦикла;
Группа: Пользователи
Сообщений: 155
Спасибо сказали: 11 раз
Рейтинг: 0
Цитата(Стажёр @ 27.12.10, 12:19)
Это кусок кода,тут еще должно меняться состояние заявки, т.е если вып-ся условие Если (СтрокаЗаявки.Количество > СтрокаТЧ.Количество) Или (Не Док.ТМЦ.Количество()> Товары.Количество()) и условие Если СтрокаЗаявки.СостояниеЗаявки = Перечисления.СостоянияЗаявки.Утверждена, тогда меняется состояние и вычисляется разница
Если (СтрокаЗаявки.Количество > СтрокаТЧ.Количество) Или (Не Док.ТМЦ.Количество()> Товары.Количество()) Тогда
Зачем Вы сравниваете количество в табличных частях документов?
It's the end of the world as we know it and I feel fine
Группа: Пользователи
Сообщений: 155
Спасибо сказали: 11 раз
Рейтинг: 0
Цитата(Стажёр @ 27.12.10, 8:23)
Здравствуйте! Помогите решить задачку. Есть документ Заявка на ТМЦ, зависимый от него регистр сведений Журнал заявок. На основе журнала создаем документ перемещения. Если количество перемещенных ТМЦ не равно кол-ву заявленных ТМЦ, то их разница расчитывается и заносится в колонку Остаток к обеспечению. Пишу такой код в форме документа перемещения:
Скажите, а у Вас Перемещение создается на основе только одной заявки или нескольких? Если на основе одной, то тогда все проще - при заполнении Перемещения производите расчет разницы и остальных условий. А если Перемещение создается из нескольких заявок, то предлагаю вам сделать так: получить документы Заявки за определенный период, выбрать их ТабЧасти, создать таблицу значений с колонками Заявка(для определения документа заявки), ТМЦ, КоличествоВЗаявке. После этого передавайте табличную часть в документ Перемещение и в процессе ведите расчет количества.
It's the end of the world as we know it and I feel fine
Группа: Пользователи
Сообщений: 35
Из: Томск
Спасибо сказали: 0 раз
Рейтинг: 0
затем, что если по заявке стоит допустим 5шт ТМЦ, а в документе перемещения, созданного на основании данной заявки, поставим вместо 5ти 3шт, то заявка считается частично отгруженная(состояние меняется на частичная отгрузка) и оставшуюся часть (2шт) нужно указать в документе заявка, сколько еще нужно переместить. а если количество в заявке не отличается от кол-ва в перемещении, то состояние заявки уже будет другим.
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1435 раз
Рейтинг: 0
Стажёр, можно вопрос, это вы просто изучаете программирование в 1С или делаете для реальной БД? Просто за такой подход к решению задачи и собственно написание кода уволить могут, если на результаты Вашей работы глянет опытный программист
Группа: Пользователи
Сообщений: 155
Спасибо сказали: 11 раз
Рейтинг: 0
Цитата(Стажёр @ 27.12.10, 13:00)
затем, что если по заявке стоит допустим 5шт ТМЦ, а в документе перемещения, созданного на основании данной заявки, поставим вместо 5ти 3шт, то заявка считается частично отгруженная(состояние меняется на частичная отгрузка) и оставшуюся часть (2шт) нужно указать в документе заявка, сколько еще нужно переместить. а если количество в заявке не отличается от кол-ва в перемещении, то состояние заявки уже будет другим.
Метод Количество() у ТабличнойЧасти получает количество строк табличной части, а не конкретное количество элемента!!!
It's the end of the world as we know it and I feel fine
Группа: Пользователи
Сообщений: 35
Из: Томск
Спасибо сказали: 0 раз
Рейтинг: 0
Цитата(Lefer @ 27.12.10, 16:35)
Скажите, а у Вас Перемещение создается на основе только одной заявки или нескольких? Если на основе одной, то тогда все проще - при заполнении Перемещения производите расчет разницы и остальных условий. А если Перемещение создается из нескольких заявок, то предлагаю вам сделать так: получить документы Заявки за определенный период, выбрать их ТабЧасти, создать таблицу значений с колонками Заявка(для определения документа заявки), ТМЦ, КоличествоВЗаявке. После этого передавайте табличную часть в документ Перемещение и в процессе ведите расчет количества.
перемещение у меня создается на основе нескольких заявок(нескольких позиций с определённым состоянием - эти позиции записываются в регистр сведений)
Группа: Пользователи
Сообщений: 155
Спасибо сказали: 11 раз
Рейтинг: 0
Цитата(Стажёр @ 27.12.10, 13:28)
перемещение у меня создается на основе нескольких заявок(нескольких позиций с определённым состоянием - эти позиции записываются в регистр сведений)
Тогда я Вам настоятельно рекомендую прислушаться к совету с пересмотром методологии работы.
Если Вы выбираете из нескольких заявок некоторые позиции и записываете их в Регистр, то от туда их и берите. Но для таких целей регистр сведений не подходит. Регистр накопления - вот что надо использовать. Регистр сведений созданы для того, чтобы хранить периодическую информацию.
It's the end of the world as we know it and I feel fine
Группа: Пользователи
Сообщений: 35
Из: Томск
Спасибо сказали: 0 раз
Рейтинг: 0
Цитата(Lefer @ 27.12.10, 17:34)
Тогда я Вам настоятельно рекомендую прислушаться к совету с пересмотром методологии работы.
Если Вы выбираете из нескольких заявок некоторые позиции и записываете их в Регистр, то от туда их и берите. Но для таких целей регистр сведений не подходит. Регистр накопления - вот что надо использовать. Регистр сведений созданы для того, чтобы хранить периодическую информацию.
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!