Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
19 мар 2024, 06:34

Редактирование табличной части документа. Колонка количество.

Автор Yuriy78, 08 дек 2011, 12:45

0 Пользователей и 1 гость просматривают эту тему.

Yuriy78

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

Процедура КнопкаВыполнитьНажатие(Кнопка)

докПланЗакупок = ЭлементыФормы.ПланЗакупок.Значение;

Для Каждого ТекущаяСтрока Из докПланЗакупок.СоставПлана Цикл
НаимНом = ТекущаяСтрока.Номенклатура;
//Выбираем аналоги из регистра сведений "Аналоги номенклатуры"
НаборЗаписей = РегистрыСведений.АналогиНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(НаимНом);
НаборЗаписей.Прочитать();

           
Для Каждого ЭлемЗапись Из НаборЗаписей Цикл
// Чтение и сообщение данных полей записи.
Если Не ПустаяСтрока(ЭлемЗапись) Тогда
ЭлемНоменклатура = ЭлемЗапись.Номенклатура;
ЭлемАналог = ЭлемЗапись.Аналог;
НоваяСтрока = ТабПоле.Добавить();
НоваяСтрока.Номенклатура = ЭлемНоменклатура;
НоваяСтрока.АналогНоменклатуры = ЭлемАналог;
Фильтр = Новый Структура;
    Фильтр.Вставить("Номенклатура",ЭлемАналог);
    Дата = ТекущаяДата();
    // Параметр "н" отражает наличие товара в регистре остатков
    н = 0;
    // получение остатков будет производиться специальной функцией Остатки
    // для регистра накопления – возвращается таблица значений
    ТаблицаОстатков = РегистрыНакопления.ТоварыНаСкладах.Остатки(Дата,Фильтр,,);
    Для каждого СтрокаТаблицы из ТаблицаОстатков цикл
    // Перебор строк
Сообщить("Номенклатура " + Строка(ЭлемЗапись.Номенклатура) + " Имеет аналог  " + СтрокаТаблицы.Номенклатура + " с остатком на складе " + СтрокаТаблицы.Количество);
    н = 1;
НоваяСтрока.ОстатокНаСкладе = СтрокаТаблицы.Количество;
    КонецЦикла;
    // Для товаров, отсутствующих в регистре остатков,
    // указываем остаток, равный 0
Если н = 0 Тогда
НоваяСтрока.ОстатокНаСкладе = н;
    Сообщить("Аналог " + ЭлемАналог + " С остаткам на складе: 0");
КонецЕсли;

  Иначе
Сообщить("Номенклатура " + Строка(ЭлемЗапись.Номенклатура) + " аналога не имеет!!! ");
КонецЕсли;
КонецЦикла;
КонецЦикла;


Для Каждого ЭлемНомТабПоля Из ТабПоле Цикл
ПерНом = ЭлемНомТабПоля.Номенклатура;
Сообщить("Галимая " + ПерНом);
ПерОстНаСкладе = ЭлемНомТабПоля.ОстатокНаСкладе;
Сообщить("Номенклатура ТабПоля: "+ ПерНом + " с остатком " + ПерОстНаСкладе);
Если Число(ПерОстНаСкладе) <> 0 Тогда
Для каждого СтрТабПоля из докПланЗакупок.СоставПлана Цикл
ПерНомВДок = СтрТабПоля.Номенклатура;
Сообщить("Это ПерНомВДок " + ПерНомВДок);
ПерКолВДок = СтрТабПоля.Количество;
Сообщить("Это ПерКолВДок " + ПерКолВДок);
Если СокрЛП(ПерНомВДок) = СокрЛП(ПерНом)  Тогда
Сообщить(Строка(ПерКолВДок) + " Старое количество!!!!!!!!!!!!!!!!!!");
НовКол = Число(ПерКолВДок - ПерОстНаСкладе);
Сообщить("Рассчитано: " + Строка(НовКол));
РедКол = СтрТабПоля.Количество;
Сообщить(Строка(РедКол) + " Новое количество!!!!!!!!!!!!!!!!!!");
                                        //А ВОТ ЗДЕСЬ НЕ МОГУ ЗАМЕНИТЬ СТАРОЕ КОЛИЧЕСТВО НА НОВОЕ!
Иначе
  Сообщить(ПерНом +" не найдена!!!");
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
СамДокумент = докПланЗакупок.ПолучитьФорму();
СамДокумент.Открыть();
//докПланЗакупок.Записать();
КонецПроцедуры


has

Если я правильно понял докПланЗакупок имеет тип ДокументСсылка. Чтобы изменить данные документа, также и его таб части, необходимо получить объект документа. Чтоб понятней было, то как-то так

ОбъектПланЗакупок = докПланЗакупок.ПолучитьОбъект();
Для каждого СтрТабПоля из ОбъектПланЗакупок.СоставПлана Цикл

Yuriy78

Цитата: has от 08 дек 2011, 13:39
Если я правильно понял докПланЗакупок имеет тип ДокументСсылка. Чтобы изменить данные документа, также и его таб части, необходимо получить объект документа. Чтоб понятней было, то как-то так

ОбъектПланЗакупок = докПланЗакупок.ПолучитьОбъект();
Для каждого СтрТабПоля из ОбъектПланЗакупок.СоставПлана Цикл

Спасибо. Понял, сейчас попробую. Но в дальнейшем обработка будет запускаться из открытого документа "План закупок"

has

А все равно наверно. Будешь просто передавать в обработку ссылку на документ, в ней получать объект документа для изменения. Все зависит от условия задачи конечно.

Yuriy78

Цитата: has от 08 дек 2011, 13:52
А все равно наверно. Будешь просто передавать в обработку ссылку на документ, в ней получать объект документа для изменения. Все зависит от условия задачи конечно.

Условия такие. Нужно в документе "План закупок", полученный с учетом остатков на складе номенклатуры, но без учета остатков на складе аналогов номенклатуры. Произвести учет остатка аналогов сохранить и провести документ на основании которого будут формироваться заказы поставщикам

has

Ну тогда если из документа будешь обработку вызывать, то передаешь ссылку. Опять же если документ записан, если новый документ, то передастся пустая ссылка.

Yuriy78

Исправил, как и советовали. Все равно не сохраняет полученное количество в документе. Что не так?

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

Yuriy78

Пожалуйста, подскажите почему не сохраняет рассчитанное количество номенклатуры. Вроде делаю все правильно. Условия все выполняются. Информационные сообщение все выводятся, а в табличной части документа количество не изменяется.  :(

has

В таких случаях пользуйтесь отладчиком. Если выводит новое количество, тогда только он и поможет. Ну и смотреть тип у ОбъектПланЗакупок. Если не знаете как пользоваться отладчиком, то гугл в помощь.

Dethmontt

Для Каждого ЭлемНомТабПоля Из ТабПоле Цикл
            ПерНом = ЭлемНомТабПоля.Номенклатура;
            Сообщить("Галимая " + ПерНом);
            ПерОстНаСкладе = ЭлемНомТабПоля.ОстатокНаСкладе;
            Сообщить("Номенклатура ТабПоля: "+ ПерНом + " с остатком " + ПерОстНаСкладе);
            Если Число(ПерОстНаСкладе) <> 0 Тогда
                Для каждого СтрТабПоля из докПланЗакупок.СоставПлана Цикл
                    ПерНомВДок = СтрТабПоля.Номенклатура;
                    Сообщить("Это ПерНомВДок " + ПерНомВДок);
                    ПерКолВДок = СтрТабПоля.Количество;
                    Сообщить("Это ПерКолВДок " + ПерКолВДок);
                Если СокрЛП(ПерНомВДок) = СокрЛП(ПерНом)  Тогда
                    Сообщить(Строка(ПерКолВДок) + " Старое количество!!!!!!!!!!!!!!!!!!");
                    НовКол = Число(ПерКолВДок - ПерОстНаСкладе);
                    Сообщить("Рассчитано: " + Строка(НовКол));
                    РедКол = СтрТабПоля.Количество;
                    Сообщить(Строка(РедКол) + " Новое количество!!!!!!!!!!!!!!!!!!");
                                        //А ВОТ ЗДЕСЬ НЕ МОГУ ЗАМЕНИТЬ СТАРОЕ КОЛИЧЕСТВО НА НОВОЕ!
                    //А так?
                    СтрТабПоля.Количество = НовКол;
                Иначе
                      Сообщить(ПерНом +" не найдена!!!");
                КонецЕсли;
                КонецЦикла;
            КонецЕсли;   
        КонецЦикла;
        СамДокумент = докПланЗакупок.ПолучитьФорму();
        СамДокумент.Открыть();
        //докПланЗакупок.Записать();
КонецПроцедуры
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск