Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2, свеженьких 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Помогите решить задачку          
Стажёр Подменю пользователя
сообщение 27.12.10, 7:23
Сообщение #1

Общительный
**
Группа: Пользователи
Сообщений: 35
Из: Томск
Спасибо сказали: 0 раз
Рейтинг: 0

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



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

Vofka Подменю пользователя
сообщение 27.12.10, 8:01
Сообщение #2

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13988
Из: Киев
Спасибо сказали: 4564 раз
Рейтинг: 3693.4

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

Спасибо сказали: Стажёр,

Batchir Подменю пользователя
сообщение 27.12.10, 8:21
Сообщение #3

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1435 раз
Рейтинг: 0

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

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

Спасибо сказали: Стажёр,

Lefer Подменю пользователя
сообщение 27.12.10, 9:56
Сообщение #4

Завсегдатай
****
Группа: Пользователи
Сообщений: 155
Спасибо сказали: 11 раз
Рейтинг: 0

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


Signature
It's the end of the world as we know it and I feel fine

Стажёр Подменю пользователя
сообщение 27.12.10, 10:10
Сообщение #5

Общительный
**
Группа: Пользователи
Сообщений: 35
Из: Томск
Спасибо сказали: 0 раз
Рейтинг: 0

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

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

Lefer Подменю пользователя
сообщение 27.12.10, 10:26
Сообщение #6

Завсегдатай
****
Группа: Пользователи
Сообщений: 155
Спасибо сказали: 11 раз
Рейтинг: 0

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


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


Signature
It's the end of the world as we know it and I feel fine

Batchir Подменю пользователя
сообщение 27.12.10, 11:01
Сообщение #7

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1435 раз
Рейтинг: 0

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

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

Стажёр Подменю пользователя
сообщение 27.12.10, 11:19
Сообщение #8

Общительный
**
Группа: Пользователи
Сообщений: 35
Из: Томск
Спасибо сказали: 0 раз
Рейтинг: 0

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

Lefer Подменю пользователя
сообщение 27.12.10, 11:24
Сообщение #9

Завсегдатай
****
Группа: Пользователи
Сообщений: 155
Спасибо сказали: 11 раз
Рейтинг: 0

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

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


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


Signature
It's the end of the world as we know it and I feel fine

Lefer Подменю пользователя
сообщение 27.12.10, 11:35
Сообщение #10

Завсегдатай
****
Группа: Пользователи
Сообщений: 155
Спасибо сказали: 11 раз
Рейтинг: 0

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


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


Signature
It's the end of the world as we know it and I feel fine

Стажёр Подменю пользователя
сообщение 27.12.10, 12:00
Сообщение #11

Общительный
**
Группа: Пользователи
Сообщений: 35
Из: Томск
Спасибо сказали: 0 раз
Рейтинг: 0

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

Batchir Подменю пользователя
сообщение 27.12.10, 12:08
Сообщение #12

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1435 раз
Рейтинг: 0

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

Lefer Подменю пользователя
сообщение 27.12.10, 12:09
Сообщение #13

Завсегдатай
****
Группа: Пользователи
Сообщений: 155
Спасибо сказали: 11 раз
Рейтинг: 0

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


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


Signature
It's the end of the world as we know it and I feel fine

Стажёр Подменю пользователя
сообщение 27.12.10, 12:28
Сообщение #14

Общительный
**
Группа: Пользователи
Сообщений: 35
Из: Томск
Спасибо сказали: 0 раз
Рейтинг: 0

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


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

Lefer Подменю пользователя
сообщение 27.12.10, 12:34
Сообщение #15

Завсегдатай
****
Группа: Пользователи
Сообщений: 155
Спасибо сказали: 11 раз
Рейтинг: 0

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


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

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


Signature
It's the end of the world as we know it and I feel fine

Спасибо сказали: Стажёр,

Стажёр Подменю пользователя
сообщение 27.12.10, 13:05
Сообщение #16

Общительный
**
Группа: Пользователи
Сообщений: 35
Из: Томск
Спасибо сказали: 0 раз
Рейтинг: 0

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

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


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

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 10.11.24, 21:16
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!