Здравствуйте! Помогите решить задачку. Есть документ Заявка на ТМЦ, зависимый от него регистр сведений Журнал заявок. На основе журнала создаем документ перемещения. Если количество перемещенных ТМЦ не равно кол-ву заявленных ТМЦ, то их разница расчитывается и заносится в колонку Остаток к обеспечению. Пишу такой код в форме документа перемещения:
Процедура ПриЗаписи()
Выборка = РегистрыСведений.СостояниеЗаявокНаТМЦ.Выбрать();
Пока Выборка.Следующий() Цикл
Для Каждого СтрокаТЧ Из Товары Цикл //СтрокаТЧ - строка таб части документа перемещение
Если ЗначениеЗаполнено(СтрокаТЧ.Заявка) Тогда
Док = СтрокаТЧ.Заявка.ПолучитьОбъект();
Док.Записать(РежимЗаписиДокумента.ОтменаПроведения);
Для Каждого СтрокаЗаявки Из Док.ТМЦ Цикл //СтрокаЗаявки - строка таб части док-а Заявка на ТМЦ
Если (СтрокаЗаявки.Количество > СтрокаТЧ.Количество) Тогда
СтрокаЗаявки.ОстатокКОбеспечению = СтрокаЗаявки.Количество - СтрокаТЧ.Количество;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Док.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;
КонецЦикла;
Я думаю это потому что у вас и в первом и во втором случае выбирается один и тот же документ (так же он в выборку попадёт во всех последующих случаях), по которому эта цифра действительно 2.
Вы перебираете весь регистр сведений. В нем могут быть, например, 200 заявок по 100 строк по разным складам и при получении строки регистра Вы перебираете строки тч (). А потом ещё в этих циклах получаете объект документа и делаете отмену проведения ( ). После чего ещё обходите строки документа заявки и в них рассчитывате что-то ( ) И заново проводите заявку в цикле ( в N-ой степени).
Такой циклоцикл в цикле с распроведением и проведением документов непростителен любому программисту (я имею ввиду не только 1С).
Ну и в догонку. Метод, выбранный Вами для решения задачи, неправильный. Рекомендую полностью пересмотреть структуру участка заявок ТМЦ.
Регистр сведений некорректно использовать для этой задачи.
Посмотрите типовую конфу, например, УТ. Подробнее рассмотрите цепочку документов "Внутренний заказ"+"Перемещение товаров", какие регистры они используют для подобной задачи.
Я так понимаю Вы выборкой обходите весь регистр... мне кажется, что корректнее было бы выбирать данные из регистра запросом, а потом уже обрабатывать полученную таблицу значений. Таким образом минус цикл получается. И запрос работает точнее и быстрее в данном случае.
пересмотрела процедуру, выборка по регистру здесь не нужна.
Для Каждого СтрокаТЧ Из Товары Цикл //СтрокаТЧ - строка таб части документа перемещение
Если ЗначениеЗаполнено(СтрокаТЧ.Заявка) Тогда
Док = СтрокаТЧ.Заявка.ПолучитьОбъект();
Док.Записать(РежимЗаписиДокумента.ОтменаПроведения);
Для Каждого СтрокаЗаявки Из Док.ТМЦ Цикл //СтрокаЗаявки - строка таб части док-а Заявка на ТМЦ
Если (СтрокаЗаявки.Количество > СтрокаТЧ.Количество) Тогда
СтрокаЗаявки.ОстатокКОбеспечению = СтрокаЗаявки.Количество - СтрокаТЧ.Количество;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Док.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;
Для Каждого СтрокаЗаявки Из Док.ТМЦ Цикл //СтрокаЗаявки - строка таб части док-а Заявка на ТМЦ
Если (СтрокаЗаявки.Количество > СтрокаТЧ.Количество) Тогда
СтрокаЗаявки.ОстатокКОбеспечению = СтрокаЗаявки.Количество - СтрокаТЧ.Количество;
КонецЕсли;
КонецЦикла;
Да что вы в самом деле...
Метология неправильная, использовать нужно регистры накопления. Заявка приходует, Перемещение расходует, разница смотрится отчетами. Перемещение должно иметь возможность заполнения по остаткам заявок + отдельный документ закрытия заявок (списание из регистра остатков по заявкам).
А выбранный алгоритм реализации не применим в этой задаче и все варианты его использования являются извратом через ж...
Это кусок кода,тут еще должно меняться состояние заявки, т.е если вып-ся условие
Если (СтрокаЗаявки.Количество > СтрокаТЧ.Количество) Или (Не Док.ТМЦ.Количество()> Товары.Количество()) и условие Если СтрокаЗаявки.СостояниеЗаявки = Перечисления.СостоянияЗаявки.Утверждена, тогда меняется состояние и вычисляется разница
в полной версия процедура выглядит так:
Процедура ПриЗаписи()
Для Каждого СтрокаТЧ Из Товары Цикл
Если ЗначениеЗаполнено(СтрокаТЧ.Заявка) Тогда
Док = СтрокаТЧ.Заявка.ПолучитьОбъект();
Док.Записать(РежимЗаписиДокумента.ОтменаПроведения);
Для Каждого СтрокаЗаявки Из Док.ТМЦ Цикл
Если (СтрокаЗаявки.Количество > СтрокаТЧ.Количество) Или
(Не Док.ТМЦ.Количество()> Товары.Количество()) Тогда
Если СтрокаЗаявки.СостояниеЗаявки = Перечисления.СостоянияЗаявки.Утверждена Тогда
СтрокаЗаявки.СостояниеЗаявки = Перечисления.СостоянияЗаявки.ОтгруженоНаОбъект;
СтрокаЗаявки.КоличествоКОбеспечению = СтрокаЗаявки.Количество - СтрокаТЧ.Количество;
КонецЕсли;
Иначе
СтрокаЗаявки.СостояниеЗаявки = Перечисления.СостоянияЗаявки.ЧастичнаяОтгрузка;
СтрокаЗаявки.КоличествоКОбеспечению = СтрокаЗаявки.Количество - СтрокаТЧ.Количество;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Док.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;
затем, что если по заявке стоит допустим 5шт ТМЦ, а в документе перемещения, созданного на основании данной заявки, поставим вместо 5ти 3шт, то заявка считается частично отгруженная(состояние меняется на частичная отгрузка) и оставшуюся часть (2шт) нужно указать в документе заявка, сколько еще нужно переместить. а если количество в заявке не отличается от кол-ва в перемещении, то состояние заявки уже будет другим.
Стажёр, можно вопрос, это вы просто изучаете программирование в 1С или делаете для реальной БД?
Просто за такой подход к решению задачи и собственно написание кода уволить могут, если на результаты Вашей работы глянет опытный программист
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua